2009-08-03 18 views
1

我有一個有很多掛載點的Exchange服務器。鑑於數據庫文件的路徑,有沒有辦法找出它們在哪個捲上?問題在於它們通常不在卷裝入點,而是在樹下。我使用Powershell,所以我需要一個最好使用WMI的解決方案,但也可以使用任何.NET或COM對象。如何在使用安裝點時找出給定的NTFS路徑的容量?

回答

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關聯類Win32_MountPointWin32_Volume

有點牽扯 - 但我沒有看到一個簡單的方法來問「我在什麼量上?」一旦我把它放在一起,我會發佈一個完整的解釋。

編輯 - 更多詳情點擊這裏:http://slipsec.com/blog/?p=126

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 
+0

up--答案是非常接近這一點,但大多數地方我沒有PSCX,所以... – slipsec 2009-08-03 22:44:57