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