我有一个包含大量挂载点的Exchange服务器。鉴于数据库文件的路径是否有办法找出它们所处的卷?问题是它们通常不在卷安装点,而是在树的下方。我正在使用Powershell,所以我需要一个最好使用WMI的解决方案,但也可以使用任何.NET或COM对象。
答案 0 :(得分:2)
PSCX包含Get-ReparsePoint cmdlet:
C:\temp> Get-ReparsePoint d | ft -auto
Target Path ReparsePointTag
------ ---- ---------------
\??\Volume{a5908e7a-eca5-11dd-be98-005056c00008} C:\temp\d MountPoint
您可以使用注册表将卷GUID映射到熟悉的驱动器名称:
Get-ItemProperty HKLM:\SYSTEM\MountedDevices
[...]
\DosDevices\D: : {22, 35, 171, 65...}
[...]
\??\Volume{a5908e7a-eca5-11dd-be98-005056c00008} : {22, 35, 171, 65...}
把事情放在一起,我们可以得到安装在c:\ temp \ d的物理驱动器的序列号:
$guid = (Get-ReparsePoint d).target
$serial = (get-itemproperty HKLM:\SYSTEM\MountedDevices).$guid
您可以将该序列与其他逻辑卷的序列号(例如具有DOS字母的序列号)进行比较。
> 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:
有关数组比较函数的说明,请参阅Keith Hill's blog。
为了完整性,请注意这似乎与COM报告的序列不相同...
> $comSerial = (new-object -com scripting.filesystemobject).getdrive("d")
> [bitconverter]::GetBytes($comSerial)
18
208
242
202
答案 1 :(得分:1)
我刚刚发现了ReparsePoint属性。
抓住我所在的目录后,我可以走到树上,直到我到达Root并检查沿途的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 Association类Win32_MountPoint
和Win32_Volume
。
有点涉及 - 但我没有看到一个简单的方法来问“我的音量是多少?”一旦我将它们全部放在一起,我将发布一个完整的解释。
编辑 - 更多详细信息:http://slipsec.com/blog/?p=126