Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает об использовании Windows PowerShell и CIM-командлетов для сопоставления дисков и их разделов.
В выходные я работал с некоторыми из компьютеров в моей сети и обнаружил, что у меня нет документации относительно того, какие из разделов расположены на каких дисках. Естественно, обнаружение этого факта было спровоцировано возникшими сложностями при устранении неполадок, однако я отвлекся.
Я полагал, что должен существовать некий ассоциативный класс, который я мог бы использовать, поэтому я воспользовался CIM-командлетами для его нахождения.
Заметка: Для дополнительной информации о классах CIM, ознакомьтесь с постом «Используем CIM-командлеты PowerShell для определения WMI-ассоциаций».
Для решения этой задачи существует и сценарий на VBScript — How Can I Correlate Logical Drives and Physical Disks? Он содержит достаточно много кода, и я выражаю всяческое уважение моим предшественникам. Вы также можете ознакомиться с постом History of the Scripting Guys, чтобы больше узнать о FAB FOUR (five)!
Сопоставляем диски и разделы
Первое, что нужно сделать при работе с ассоциативными классами – это выяснить, какие классы они связывают. Для этого можно воспользоваться командлетом Get-CimClass и передать полученные результаты командлету Select-Object. Нам нужно получить содержимое свойства CimClassProperies.
16:49 C:\> Get-CimClass win32_diskdriveToDiskPartition | select -exp cimclassproperties
Name : Antecedent
Value :
CimType : Reference
Flags : Property, Key, ReadOnly, NullValue
Qualifiers : {read, key, MappingStrings, Override}
ReferenceClassName : Win32_DiskDrive
Name : Dependent
Value :
CimType : Reference
Flags : Property, Key, ReadOnly, NullValue
Qualifiers : {read, key, MappingStrings, Override}
ReferenceClassName : Win32_DiskPartition
Нужная мне информация содержится в свойстве ReferenceClassName. Как я покажу чуть ниже, эта информация представляет ценность и с точки зрения траблшутинга. Я хочу сказать, что для того чтобы использовать это правильным образом, я должен знать, чем именно я пользуюсь.
Сначала я подумал, что могу использовать командлет Get-Disk и передать его результаты командлету Get-CimAssociatedInstance, но как выяснилось, это не работает.
17:10 C:\> get-disk | Get-CimAssociatedInstance -Association win32_DiskDriveToDiskpartition
Не возвращается ни сообщений об ошибках, ни каких-либо данных. Я решил проверить, какой объект возвращается командлетом Get-Disk. Сначала я использовал метод GetType.
17:13 C:\> (get-disk).GetType()
IsPublic IsSerial Name BaseType
——— ——— —- ———
True True CimInstance System.Object
Он не выдал мне какой-либо ценной информации. Затем я воспользовался командлетом Get-Member.
17:13 C:\> (get-disk | get-member).typename[0]
Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/Storage/MSFT_Disk
Как видно, функция Get-Disk возвращает класс MSFT_Disk, а не экземпляр класса Win32_DiskDrive. Похоже, нам придется действовать по-старинке. Я воспользуюсь командлетом Get-CimInstance для получения экземпляра класса Win32_DiskDrive. Затем я передам результаты командлету Get-CimAssociatedInstance и укажу ассоциативный класс Win32_DiskDriveToDiskPartition. Команда и ее вывод приведены ниже.
17:18 C:\> Get-CimInstance win32_diskdrive | Get-CimAssociatedInstance -Association win32_diskdriveToDiskPartition
Name NumberOfBlocks BootPartition PrimaryPartition Size Index
—- ————- ————- ————- —- ——
Disk #0, Part… 716800 True True 367001600 0
Disk #0, Part… 311859200 False True 159671910400 1
Это все, что касается использования Windows PowerShell, WMI и CIM для сопоставления дисков и разделов.
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell