How to get physical partition name from iSCSI details on Windows?

5,984

One possibility: if you can find the GUID volume name (your question doesn't make this clear) and if the volume has a drive letter assigned, then Win32_Volume will link the GUID volume name to the drive letter and Win32_LogicalDiskToPartition will link the drive letter to the disk number and partition number.

However, MSiSCSIInitiator_SessionClass looks to be a better option. This command works for me:

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

If there might be more than one partition, the Win32_DiskDriveToDiskPartition class can be used to list them.

Share:
5,984

Related videos on Youtube

Barry Kelly
Author by

Barry Kelly

Updated on September 18, 2022

Comments

  • Barry Kelly
    Barry Kelly over 1 year

    I've got a piece of software that needs the name of a partition in \Device\Harddisk2\Partition1 style, as shown e.g. in WinObj. I want to get this partition name from details of the iSCSI connection that underlies the partition. The trouble is that disk order is not fixed - depending on what devices are connected and initialized in what order, it can move around.

    So suppose I have the portal name (DNS of the iSCSI target), target IQN, etc. I'd like to somehow discover which volumes in the system relate to it, in an automated fashion.

    I can write some PowerShell WMI queries that get somewhat close to the desired info:

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

    From the Name here, I think I can fabricate the corresponding name by adding 1 to the partition number: \Device\Harddisk0\Partition1 - Partition0 appears to be a fake partition mapping to the whole disk.

    But the above doesn't have enough information to map to the underlying physical device, unless I take a guess based on exact size matching.

    I can get some info on SCSI devices, but it's not helpful in joining things up (iSCSI target is 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...
    

    Similarly, I can run queries like these:

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

    These guys return information relating to my iSCSI target name and the GUID volume name respectively (a volume name like \\?\Volume{guid-goes-here}), but the GUID volume name is no good to me, and there doesn't appear to be a reliable correspondence between the target name and the volume that I can join on.

    I simply can't find an easy way of getting from an IQN (e.g. iqn.1992-01.com.example:storage:diskarrays-sn-a8675309) to physical partitions mapped from that target.

    The way I do it by hand? I start Disk Management, and look for a partition of the correct size, verify that its driver says NEXENTA COMSTAR, and look at the disk number. But even this is unreliable if I have multiple iSCSI volumes of the exact same size.

    Any suggestions?

  • Barry Kelly
    Barry Kelly almost 12 years
    Thanks! I was able to massage that into the format I needed. In my usage, a raw partition covers the whole disk, so I didn't need further mapping.
  • Barry Kelly
    Barry Kelly almost 12 years
    Also: Because it's a raw partition, there is nothing Windows maps to a drive letter by default; and there is no desire to further litter the limited drive letter namespace with something that Windows can't read.