マウントポイントがたくさんあるExchangeサーバーがあります。データベースファイルへのパスを考えると、それらがどのボリュームにあるかを知る方法はありますか?問題は、それらが通常、ボリュームマウントポイントではなく、ツリーのさらに下にあることです。私はPowershellを使用しているので、できればWMIを使用するソリューションが必要ですが、任意の.NETまたはCOMオブジェクトを使用することもできます。
2 に答える
PSCX includes a Get-ReparsePoint cmdlet:
C:\temp> Get-ReparsePoint d | ft -auto
Target Path ReparsePointTag
------ ---- ---------------
\??\Volume{a5908e7a-eca5-11dd-be98-005056c00008} C:\temp\d MountPoint
You can map volume GUIDs to familiar drive names using the registry:
Get-ItemProperty HKLM:\SYSTEM\MountedDevices
[...]
\DosDevices\D: : {22, 35, 171, 65...}
[...]
\??\Volume{a5908e7a-eca5-11dd-be98-005056c00008} : {22, 35, 171, 65...}
Putting things together, we can get the serial # of the physical drive that's mounted at c:\temp\d:
$guid = (Get-ReparsePoint d).target
$serial = (get-itemproperty HKLM:\SYSTEM\MountedDevices).$guid
You can compare that serial against the serial numbers of the other logical volumes such as the ones with DOS letters.
> function ArrayEqual([psobject[]]$arr1, [psobject[]]$arr2)
{ @(Compare-Object $arr1 $arr2 -sync 0).Length -eq 0 }
> (gi HKLM:\SYSTEM\MountedDevices).property | ?{ $_ -like "\dos*" } |
?{ ArrayEqual$serial (gp HKLM:\SYSTEM\MountedDevices).$_ }
\DosDevices\D:
See Keith Hill's blog for an explanation of the array comparison function.
For completeness, note this does NOT seem to be the same serial reported by COM...
> $comSerial = (new-object -com scripting.filesystemobject).getdrive("d")
> [bitconverter]::GetBytes($comSerial)
18
208
242
202
ReparsePoint属性を発見しました。
現在のディレクトリを取得したら、ルートに到達して途中でReparsePointsを確認するまで、ツリーを上に移動できます。
$dbDir = (get-item (Get-MailboxDatabase $db).edbfilepath).directory
$dbDir
if($dbdir.parent){
#todo make this recursive
}
#test if it's a reparse point.
if ($dbdir.attributes -band [System.IO.FileAttributes]::ReparsePoint ){
#it's a mountpoint.
}
ここから、「mountvol / L」ツール、またはより適切なWMIアソシエーションクラスWin32_MountPoint
とがありWin32_Volume
ます。
少し複雑ですが、「私はどの音量になっているのか」と尋ねる簡単な方法がわかりません。すべてをまとめたら、完全な説明を投稿します。
編集-詳細はこちら:http ://slipsec.com/blog/?p = 126