リムーバブルディスク入れ替え時の問題を解決する

TrueCrypt-リムーバブルディスク入れ替え時のディスク番号問題を解決する


参考:True Crypt Forum - Mount removeable media reliably (solution)

外付けUSB-HDDなど、リムーバブルディスクのパーティション全部をTrueCryptボリュームとして使用している場合、
ディスクを追加したり、取り外したりするとディスク番号が異なってしまい、、マウント用のバッチファイルがうまく動かないことがある。


たとえば、A、Bという二つのリムーバブルディスクの全領域をそれぞれTrueCryptで暗号化したとする。

PCにAを接続し、その後でBを接続すると
Aのパーティション= \Device\HardDisk2\Partition1
Bのパーティション= \Device\HardDisk3\Partition1
となる。

コレを受けて、AのパーティションをXドライブ、BのパーティションをYドライブとしてマウントするショートカットを作成しているとする。
C:\Program Files\TrueCrypt.exe /q /a /lX /v\Device\HardDisk2\Partition1
C:\Program Files\TrueCrypt.exe /q /a /lY /v\Device\HardDisk3\Partition1

仮、Bを先に接続、その後Aを接続して上記のショートカットを実行した場合
Xドライブ、Yドライブとして認識されるパーティションが入れ替わってしまう。

このとき、あるアプリケーションが「Xドライブ」からデータを読み込むように設定している場合
本来「Xドライブ」にあるはずのデータは「Yドライブ」に存在しているため、
データを読み込めない。

上記の問題は、Windowsが個々のドライブを区別せず、接続順にディスク番号を割り振ってしまうために生じる。

これを回避するために、下記のスクリプトを利用する。

下記をmount.vbsとして保存し、コマンドプロンプトから
cscript mount.vbs
として呼び出す。


※下記のスクリプトを利用することにより、ディスクの暗号化データが破損したり、
システムに回復不可能な障害その他トラブルが起こる可能性がある。
利用は自己責任で。

本スクリプトは、TrueCrypt Forumのdaze氏が投稿したスクリプトを、一部解説及び訳を付け加えて引用したものである。
'==============ここから==========================
Wscript.Echo "パスワードの入力:"
pass=WScript.StdIn.ReadLine

ComputerName = "."
Set wmiServices = GetObject ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
Set wmiDiskDrives = wmiServices.ExecQuery ("SELECT Caption, DeviceID FROM Win32_DiskDrive") 'physical disk
For Each wmiDiskDrive In wmiDiskDrives
query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition" 'パーティション
Set wmiDiskPartitions = wmiServices.ExecQuery(query)
For Each wmiDiskPartition In wmiDiskPartitions
Set wmiLogicalDisks = wmiServices.ExecQuery ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition") 'logical disk
For Each wmiLogicalDisk In wmiLogicalDisks
DriveNum=cint(Mid(wmiDiskPartition.DeviceID,7,2))
PartNum=cint(Mid(wmiDiskPartition.DeviceID,21,2)) + 1

' <- Change ->
' システムにあわせて以下のドライブ文字を変更する。
'Case "x:"の"x"はWindowsがリムーバブルディスクに対して割り当てたドライブ文字。
' Mount("X",....) の"X"は、Truecryptにマウントさせるドライブ文字。
'
'Uncomment for complete drivelist when run..
'WScript.Echo wmiDiskPartition.DeviceID & " : " & " \Device\HardDisk" & Cstr(DriveNum) & "\Partition" & Cstr(PartNum)
Select Case wmiLogicalDisk.DeviceID
Case "M:"
dummy=Mount("P","\Device\HardDisk" & CStr(DriveNum) & "\Partition" & Cstr(PartNum),pass)
Case "N:"
dummy=Mount("Q","\Device\HardDisk" & CStr(DriveNum) & "\Partition" & Cstr(PartNum),pass)
End Select
Next
Next
Next

Function Mount(LogicalD, PhysicalD,pw)
'ドライブ文字が使用中か?
a=ExDrive(LogicalD)
If a = false Then
WScript.Echo "ドライブ" & LogicalD & " を " & PhysicalD & "にマウント中です。"
Run chr(34) & "c:\program files\truecrypt\truecrypt.exe" & chr(34) & " /a /v " & PhysicalD & " /l" & LogicalD & " /b /p " & pw &" /q"
Else
Wscript.Echo "ドライブ " & LogicalD & ": は既にマウントされています。"
End if

End Function

Sub Run(cmd)
Dim shell
Set shell = CreateObject("WScript.Shell")
shell.Run cmd, 1, True 'true for sync., false spawns new process
Set shell = Nothing
End Sub

Function ExDrive(DrvLetter)
Dim filesys
Set filesys = CreateObject("Scripting.FileSystemObject")
If filesys.DriveExists(DrvLetter & ":") Then
ExDrive=True
Else
ExDrive=False
End If
Set filesys=Nothing
End Function
'===============================ここまで===================

以上のスクリプトは、接続先を変えてもリムーバブルディスクの「ドライブ文字」が変わらないことを利用している。

TrueCryptは、マウント時のディスク指定にドライブ文字を利用できない。
(たとえばtruecrypt.exe /a/q /lQ /v"W:\"といった記述ができない)
パーティションタイプのボリュームをコマンドラインでマウントする場合、

C:\Program Files\TrueCrypt.exe /q /a /lM /v\Device\HardDisk2\Partition1

等と記述する。
(上記は 「システムの2番目のディスクの第1パーティションを、Mドライブとしてマウント」 を意味する。)

そこで、上のスクリプトでドライブ文字を介して個々のディスクを判別している。

ドライブ文字は利用したいディスクの個数の2倍必要なことになる。
2007年09月23日(日) 00:34:47 Modified by hiverd




スマートフォン版で見る