【问题标题】:Correlate Physical Device ID to Volume Device ID将物理设备 ID 与卷设备 ID 相关联
【发布时间】:2016-06-23 00:50:54
【问题描述】:

我正在尝试通过 PowerShell 使用 WMI 来运行远程服务器上的 SAN 存储以获取 Windows 磁盘管理卷标。

我发现这样做的唯一方法是将卷设备 ID (\\?\Volume{34243...} 与物理磁盘设备 ID (\\.\PHYSICALDRIVE01) 关联起来。

但是,我无法找到如何将这两个字段链接在一起。 WMI 可以做到这一点吗?

【问题讨论】:

  • 它不会在所有情况下都起作用,但是...如果卷没有驱动器号,请将其分配给它(Win32_volume.DriveLetter 属性是可写的),然后使用 Win32_LogicalDiskToPartition 或 Win32_DiskDriveToDiskPartition 和最后删除驱动器号。这只是一个建议,请勿在生产系统上测试此解决方案。

标签: powershell wmi disk san


【解决方案1】:

对于分配了驱动器号的卷,您可以像这样关联磁盘和卷:

Get-WmiObject Win32_DiskDrive | ForEach-Object {
  $disk = $_
  $partitions = "ASSOCIATORS OF " +
                "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
                "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | ForEach-Object {
    $partition = $_
    $drives = "ASSOCIATORS OF " +
              "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
              "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | ForEach-Object {
      $driveLetter = $_.DeviceID
      $fltr        = "DriveLetter='$driveLetter'"
      New-Object -Type PSCustomObject -Property @{
        Disk        = $disk.DeviceID
        DriveLetter = $driveLetter
        VolumeName  = $_.VolumeName
        VolumeID    = Get-WmiObject -Class Win32_Volume -Filter $fltr |
                      Select-Object -Expand DeviceID
      }
    }
  }
}

否则doesn't seem possible with WMI.

但在 Windows 8/Server 2012 或更高版本上,您可以使用 Get-Partition cmdlet:

Get-Partition | Select-Object DiskNumber, DriveLetter, @{n='VolumeID';e={
  $_.AccessPaths | Where-Object { $_ -like '\\?\volume*' }
}}

【讨论】:

  • 有问题的服务器是 2008 R2 并且有几个驱动器号,但有几个重新解析点。因此,我最初对分区类的评论不是将其他类连接在一起的链接。
  • 参见参考文章。
【解决方案2】:

我已经编写了一个脚本,它从卷和磁盘 WMI 中收集最重要的内容。它用于从安装了许多磁盘的远程桌面服务器获取信息,但很难找到谁在使用哪个磁盘。它使用AD查询用户并将其与SID连接以查找文件路径。因此,首先要从不同的磁盘命令中收集所有数据,然后合并输出。将磁盘数据与卷数据绑定的最重要命令是显示 deviceid 的 get-partition

Function Get-VHDMount {

[cmdletbinding()]

Param(
  [Parameter(Position=0,ValueFromPipeline=$True)]
  [ValidateNotNullorEmpty()] 
  [OBJECT[]]$Computername,
  [STRING]$RDSPATH = '\\rdsprofiles'
)
    foreach ($computer in $Computername) {

        $RDSItems      = (Get-ChildItem $RDSPATH -Recurse -Filter *.vhdx)
        $VolumeInfo    = invoke-command -ComputerName $computer -scriptblock  {Get-Volume | select *}
        $VHDMountInfo  = Get-WmiObject Win32_Volume -ComputerName $computer |where Label -eq 'user Disk' 
        $partitioninfo = invoke-command -ComputerName $computer -scriptblock  {Get-Partition | Select-Object DiskNumber, @{n='VolumeID';e={$_.AccessPaths | Where-Object { $_ -like '\\?\volume*' }}}}

        foreach ($VHDmount in $VHDMountInfo) {
            $adinfo = Get-ADUser ($VHDmount.name | Split-Path -Leaf)

            [PSCUSTOMOBJECT]@{
                Computername = $computer
                username     = $VHDmount.name | Split-Path -Leaf
                displayname  = $adinfo.name
                SID          = $adinfo.SID
                deviceid     = $VHDmount.deviceid
                capacity     = ([MATH]::ROUND(($VHDmount.capacity) / 1gb))
                HealthStatus = ($VolumeInfo | where ObjectId -eq ($VHDmount.deviceid)).HealthStatus
                DiskNumber   = ($partitioninfo | where Volumeid -eq ($VHDmount.deviceid)).DiskNumber
                Path         = ($RDSItems | where fullname -like "*$($adinfo.SID)*").FullName
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多