Как получить имя физического раздела из данных iSCSI в Windows?

У меня есть часть программного обеспечения, которому нужно имя раздела в \Device\Harddisk2\Partition1 стиль, как показано, например, в WinObj. Я хочу получить это имя раздела из сведений о подключении iSCSI, которое лежит в основе раздела. Проблема в том, что порядок дисков не фиксирован - в зависимости от того, какие устройства подключены и в каком порядке инициализируются, он может перемещаться.

Итак, предположим, у меня есть имя портала (DNS для цели iSCSI), целевой 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\Partition1 - Partition0 представляется поддельным отображением раздела на весь диск.

Но приведенное выше не имеет достаточно информации для сопоставления с базовым физическим устройством, если только я не приму предположение, основанное на точном соответствии размера.

Я могу получить некоторую информацию об устройствах SCSI, но это бесполезно для объединения вещей (целью 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 мне не подходит, и не существует надежного соответствия между целевым именем и томом, к которому я могу присоединиться.

Я просто не могу найти простой способ получить от IQN (например, iqn.1992-01.com.example:storage:diskarrays-sn-a8675309) к физическим разделам, сопоставленным с этой целью.

Как я это делаю вручную? Я запускаю Управление дисками и ищу раздел правильного размера, проверяю, что его драйвер говорит NEXENTA COMSTAR, и смотрю на номер диска. Но даже это ненадежно, если у меня несколько томов iSCSI одинакового размера.

Какие-либо предложения?

1 ответ

Решение

Одна возможность: если вы можете найти имя тома GUID (ваш вопрос не проясняет это) и если тому назначена буква диска, Win32_Volume свяжет имя тома GUID с буквой диска, а Win32_LogicalDiskToPartition свяжет букву диска на номер диска и номер раздела.

Тем не мение, MSiSCSIInitiator_SessionClass выглядит как лучший вариант. Эта команда работает для меня:

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 класс может быть использован для их перечисления.

Другие вопросы по тегам