代码之家  ›  专栏  ›  技术社区  ›  slipsec

当使用装入点时,如何确定给定的NTFS路径所在的卷?

  •  1
  • slipsec  · 技术社区  · 16 年前

    我有一台安装点很多的Exchange服务器。给定数据库文件的路径,有没有办法找出它们所在的卷?问题是它们通常不在卷装入点,而是在树的另一端。我正在使用PowerShell,因此我需要一个解决方案,最好是使用WMI,但也可以使用任何.NET或COM对象。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Richard Berg    16 年前

    PSCX 包括get-reparesepoint 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
    
        2
  •  1
  •   slipsec    16 年前

    我刚刚发现了reparsepoint属性。

    在抓取了我所在的目录之后,我就可以沿着树走到根目录,检查沿途是否有重分析点。

    $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