💾
既存フォルダーを新しいドライブとして割り当てる方法
解法
下記の条件下で実現するには、DOSデバイスをレジストリに登録する方法が最適な気がします。
- 既存のドライブ下にあるフォルダーを新しいドライブレターとして割り当て
- かつWindowsサービスなどユーザーログオン不要な環境でも利用可能にする
もっと他にいい方法があればぜひ教えてください。
# PowerShellスクリプト(管理者権限必須)
function New-SystemDriveMapping {
param(
[string]$DriveLetter = "S:",
[string]$TargetPath = "C:\ServiceFolder"
)
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices"
$dosPath = "\??\$TargetPath"
# 既存の登録を確認して削除
if (Get-ItemProperty -Path $regPath -Name $DriveLetter -ErrorAction SilentlyContinue) {
Remove-ItemProperty -Path $regPath -Name $DriveLetter -Force
}
# 新規登録
New-ItemProperty -Path $regPath -Name $DriveLetter -Value $dosPath -PropertyType String -Force
Write-Host "ドライブマッピング完了: $DriveLetter -> $TargetPath"
Write-Host "システム再起動後に有効になります"
}
# 使用例
New-SystemDriveMapping -DriveLetter "S:" -TargetPath "C:\WindowsServices\MyService"
解説
なぜDOSデバイス方式が最適なのか
既存フォルダーを新しいドライブとして割り当てる際、以下の制約を満たす必要があります:
- ユーザーログイン不要 - Windowsサービスなどシステムレベルのプロセスから利用可能
- 永続性 - 再起動後も設定維持
- システム全体で有効 - すべてのプロセスからアクセス可能
DOSデバイス方式はこれらすべての要件を満たしています。
他の方法との比較
❌ ユーザーレベルのドライブマッピング
- ユーザーログインが必要
- SYSTEMアカウントからアクセス不可
❌ シンボリックリンク/ジャンクション
- 新しいドライブレターを作成できない
- 既存ドライブ配下のパスしか作成不可(例:
D:\Linkは可能だがS:\は不可)
⚠️ ネットワーク共有
New-SmbShare -Name "ServiceFolder" -Path "C:\TargetFolder"
net use S: \\localhost\ServiceFolder /persistent:yes
- ネットワーク層のオーバーヘッドあり
- 認証の複雑性
⚠️ DefineDosDevice API(一時的)
[DllImport("kernel32.dll")]
static extern bool DefineDosDevice(uint dwFlags, string lpDeviceName, string lpTargetPath);
// 再起動で消失する一時的なマッピング
DefineDosDevice(0x00000001, "S:", @"\??\C:\TargetFolder");
- 再起動で設定が消失
- サービス起動前に再設定が必要
DOSデバイスレジストリ方式の仕組み
-
レジストリパス:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices -
値の形式:
\??\C:\TargetPath(NT名前空間形式) - 適用タイミング: Session Managerがブート時に処理
- 権限: SYSTEM権限で自動的にマウント
補足情報
削除方法
# ドライブマッピングを削除
Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices" -Name "S:" -Force
# システム再起動が必要
注意事項
- 再起動必須: レジストリ変更後はシステム再起動が必要
- 管理者権限: レジストリ操作には管理者権限が必須
- ドライブレター競合: 既存のドライブと重複しないよう確認
- パスの存在確認: ターゲットフォルダーが存在することを事前確認
Discussion