Назад | Перейти на главную страницу

Как получить имя физического раздела из сведений 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 одинакового размера.

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

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