如何从Windows上的iSCSI详细信息中获取物理分区名称?

我有一个需要\Device\Harddisk2\Partition1风格的分区名称的软件,如WinObj中所示。 我想从分区底层的iSCSI连接的详细信息中获取这个分区名称。 麻烦的是,磁盘顺序不固定 – 取决于什么设备连接和按什么顺序初始化,它可以四处移动。

因此,假设我有门户名称(iSCSI目标的DNS),目标IQN等。我想以某种方式自动地发现系统中哪些卷与之相关。

我可以编写一些PowerShell WMI查询,它们有点接近所需的信息:

 PS> get-wmiobject -class Win32_DiskPartition NumberOfBlocks : 204800 BootPartition : True Name : Disk #0, Partition #0 PrimaryPartition : True Size : 104857600 Index : 0 ... 

从这里的Name ,我我可以通过加1分区编号来制造相应的名称: \Device\Harddisk0\Partition1Partition0似乎是一个虚拟的分区映射到整个磁盘。

但是上面没有足够的信息来映射到底层的物理设备,除非我根据精确的尺寸匹配进行猜测。

我可以在SCSI设备上获得一些信息,但是这对于join东西没有帮助(iSCSI目标是Nexenta / Solaris COMSTAR):

 PS> get-wmiobject -class Win32_SCSIControllerDevice __GENUS : 2 __CLASS : Win32_SCSIControllerDevice ... Antecedent : \\COBRA\root\cimv2:Win32_SCSIController.DeviceID="ROOT\\ISCSIPRT\\0000" Dependent : \\COBRA\root\cimv2:Win32_PnPEntity.DeviceID="SCSI\\DISK&VEN_NEXENTA&PROD_COMSTAR... 

同样,我可以运行这样的查询:

 PS> get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_TargetClass PS> get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_PersistentDevices 

这些家伙分别返回与我的iSCSI目标名称和GUID卷名称有关的信息(卷名像\\?\Volume{guid-goes-here} ),但是GUID卷名对我来说并不好, t似乎是我可以join的目标名称和音量之间的可靠对应关系。

我简直无法find从IQN(例如iqn.1992-01.com.example:storage:diskarrays-sn-a8675309 )到从该目标映射的物理分区的简单方法。

我用手做的方式? 我启动磁盘pipe理,并查找正确大小的分区,validation其驱动程序说NEXENTA COMSTAR,并查看磁盘编号。 但是,即使我有多个完全相同大小的多个iSCSI卷,这也是不可靠的。

有什么build议么?

一种可能性:如果您可以findGUID卷名称(您的问题没有说明这一点),并且如果卷已经分配了驱动器号,则Win32_Volume将把GUID卷名与驱动器号链接起来,Win32_LogicalDiskToPartition将链接驱动器号到磁盘号码和分区号码。

但是, MSiSCSIInitiator_SessionClass看起来是一个更好的select。 这个命令适用于我:

 PS C:\Windows\system32> (get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_SessionClass -filter "TargetName='iqn.2001-05.com.equallogic:0-8a0906-d27481f06-93a000d015c4ed69-oslo-san-1'").Devices | Select -property LegacyName LegacyName ---------- \\.\PhysicalDrive2 

如果可能有多个分区,则可以使用Win32_DiskDriveToDiskPartition类来列出它们。