使用挂载点时,如何找出给定NTFS路径的卷?

时间:2009-08-03 12:58:43

标签: .net powershell com ntfs

我有一个包含大量挂载点的Exchange服务器。鉴于数据库文件的路径是否有办法找出它们所处的卷?问题是它们通常不在卷安装点,而是在树的下方。我正在使用Powershell,所以我需要一个最好使用WMI的解决方案,但也可以使用任何.NET或COM对象。

2 个答案:

答案 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_MountPointWin32_Volume

有点涉及 - 但我没有看到一个简单的方法来问“我的音量是多少?”一旦我将它们全部放在一起,我将发布一个完整的解释。

编辑 - 更多详细信息:http://slipsec.com/blog/?p=126