sergey vasin

The IT blog

Используем CIM-командлеты PowerShell для определения WMI-ассоциаций – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает об использовании CIM-командлетов Windows PowerShell 3.0 для определения ассоциаций классов WMI.

Microsoft Scripting Guy, Ed Wilson на связи. Одна из отличных вещей в новых CIM­-командлетах Windows PowerShell 3.0 – это то, как были улучшены возможности обнаружения WMI. Действительно, одни из наиболее частых вопросов, из тех что я получал относились к возможностям нахождения нужных классов. Найти подходящий класс для решения конкретной проблемы среди тысяч классов из дюжины пространств имен – это зачастую непростая задача.

Порой мне приходилось тратить часы для поиска определенного класса WMI, подходящего для решения некоторой проблемы. После нахождения нужного класса на написание самого скрипта уходило не так уж и много времени – даже во времена VBScript, так как у меня всегда было наготове несколько полезных шаблонов. Основная же проблема заключалась в нахождении нужного класса. К счастью, определение нужных классов сильно упрощается при использовании CIM-командлетов (для меня лично они заменили несколько довольно сложных скриптов, которые я написал для достижения подобных результатов). Но один скрипт, который так и не был мной написан – это скрипт, показывающий какие классы относятся к каким ассоциациям. Для этой цели я использовал инструменты WMI Admin.

Находим классы ассоциаций WMI

У меня не получилось заставить WMI Admin работать на моем ноутбуке с Windows 8. Это пожалуй хорошая новость, поскольку WMI Admin Tools – это программы столетней давности. Они представляют собой нестабильные HTML-приложения, которые запускаются с десятком запросов, и когда все же запустятся, правая панель отказывается работать. Интересно, что они работали на Windows 7. Я счел хорошей новостью отказ WMI Admin Tools работать на Windows 8 потому, что теперь я могу перейти к использованию новых инструментов, более безопасных, быстрых и информативных. Да, я говорю о CIM-командлетах Windows PowerShell 3.0.

Сюрприз! Классы ассоциаций содержат определитель «association»

Одно из наиболее мощных средств в новых CIM-командлетах – это командлет Get-CimClass. Он практически заменяет собой WMI Admin Tools– в частности те его функции, которые я использовал для поиска WMI-классов. Для нахождения классов ассоциаций нужно знать две вещи. Во-первых, классы ассоциаций обладают определителем «association». Во вторых, мне нужно получить динамические классы WMI, а не абстрактные. Это потому, что запросы абстрактных классов не поддерживаются. Для нахождения всех классов ассоциаций я воспользуюсь командлетом Get-CimClass и укажу определитель (qualifier) «association».

Get-CimClass -QualifierName association

Эта строка кода выведет пару сотен классов ассоциаций WMI – как динамических, так и абстрактных. Я могу отфильтровать результаты, чтобы в них были только WMI-классы, начинающиеся с Win32 – так как большинство динамических классов начинаются с Win32.

Get-CimClass -QualifierName association | ? cimclassname -match ‘^win32’

На моем компьютере это список из 139 классов WMI. Проблема в том, что некоторые из них могут быть абстрактными, а также я мог пропустить некоторые из динамических классов, названия которых начинаются с CIM. К сожалению, параметр –QualifierName не принимает массив в качестве значения, поэтому мне нежно сделать несколько запросов друг за другом.

Get-CimClass -QualifierName association | % {get-cimclass $_.cimclassname -qualifiername dynamic}

Теперь у меня есть список из 128 классов ассоциаций. В добавок я обнаружил класс Cim_DirectoryContainsFile, который является динамическим классом ассоциаций, начинающимся с CIM.

Определяем ассоциированные классы

Для определения того, какие классы ассоциируются я опять воспользуюсь командлетом Get-CimClass. Для иллюстрации этой техники я воспользуюсь классом ассоциации Win32_SystemProcesses. По-видимому, этот класс ассоциирует процессы и систему (по крайней мере, так следует из его названия). Первое, что я сделаю, это использую командлет Get-CimClass для получения этого класса.

18:19 C:\> Get-CimClass win32_systemprocesses

    NameSpace: ROOT/cimv2

CimClassName                        CimClassMethods      CimClassProperties

————                        —————      ——————

Win32_SystemProcesses               {}                   {GroupComponent, PartCom…

Из предыдущего опыта общения с классами ассоциаций я знаю, что эти классы возвращают два значения – GroupComponent и PartComponent. Имена свойств интересны сами по себе, но что действительно интересно, это то, какой WMI-класс содержится в этих свойствах.

Заметка: не все классы ассоциаций WMI содержат свойства GroupComponent и PartComponent. На самом деле наиболее часто встречающиеся свойства – это Antecedent/Dependent, за которыми идут Element/Setting, и лишь потом GroupComponent/PartComponent. Для определения частоты использования пар свойств можно воспользоваться следующим кодом (это одна строка, разделенная символами конвейера — «|»).

Get-CimClass -QualifierName association |

% {get-cimclass $_.cimclassname -qualifiername dynamic} |

% { $_ | select -ExpandProperty cimclassproperties} |

Group  name | sort count –Descending

Для определения, какие классы содержатся в ассоциации, нужно получить содержимое свойства CimClassProperties. Для этого я воспользуюсь командлетом Select-Object (select – это алиас) и укажу параметр -ExpandProperty (-Expand – его краткая форма).

18:34 C:\> Get-CimClass win32_systemprocesses | select -expand CimClassProperties

Name               : GroupComponent

Value              :

CimType            : Reference

Flags              : Property, Key, ReadOnly, NullValue

Qualifiers         : {Aggregate, read, key, MappingStrings…}

ReferenceClassName : Win32_ComputerSystem

 

Name               : PartComponent

Value              :

CimType            : Reference

Flags              : Property, Key, ReadOnly, NullValue

Qualifiers         : {read, key, MappingStrings, Override}

ReferenceClassName : Win32_Process

Свойство ReferenceClassName каждого возвращенного объекта содержит имя класса WMI, составляющего одну из частей ассоциации. Таким образом, класс Win32_SystemProcesses ассоциирует классы Win32_ComputerSystem и Win32_Process. Теперь я могу воспользоваться командлетом Get-CimClass для того чтобы исследовать свойства и методы каждого из этих классов.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/13/use-powershell-cim-cmdlets-to-discover-wmi-associations.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Декабрь 28, 2012 в 15:26

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with ,

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s