💾

既存フォルダーを新しいドライブとして割り当てる方法

に公開

解法

下記の条件下で実現するには、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デバイス方式が最適なのか

既存フォルダーを新しいドライブとして割り当てる際、以下の制約を満たす必要があります:

  1. ユーザーログイン不要 - Windowsサービスなどシステムレベルのプロセスから利用可能
  2. 永続性 - 再起動後も設定維持
  3. システム全体で有効 - すべてのプロセスからアクセス可能

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デバイスレジストリ方式の仕組み

  1. レジストリパス: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices
  2. 値の形式: \??\C:\TargetPath(NT名前空間形式)
  3. 適用タイミング: Session Managerがブート時に処理
  4. 権限: SYSTEM権限で自動的にマウント

補足情報

削除方法

# ドライブマッピングを削除
    Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices" -Name "S:" -Force
# システム再起動が必要

注意事項

  • 再起動必須: レジストリ変更後はシステム再起動が必要
  • 管理者権限: レジストリ操作には管理者権限が必須
  • ドライブレター競合: 既存のドライブと重複しないよう確認
  • パスの存在確認: ターゲットフォルダーが存在することを事前確認

Discussion