Объект WMI SWbemServices

Объект WMI SWbemServices Объектная модель Windows Management Instrumentation

Объект SWbemServices возвращается каждый раз при подключении к функционалу WMI, будь то с помощью моникера или объекта SWbemLocator. Используя методы и свойство объекта SWbemServices можно осуществлять выполнение сценариев в синхронном, асинхронном и полусинхронном режимах, плюс, он позволяет извлекать информацию из классов, получать коллекцию экземпляров и подключатся непосредственно к объекту.

В данной статье я рассмотрю лишь основные методы и свойства данного объект, с которыми вам придется сталкиваться в сценариях на просторах моего блога. Более детальную информацию вы сможете получить на сайте Microsoft,  и так, приступим.

Методы объекта SWbemServices

Delete( strObjectPath) –позволяет удалить экземпляр управляемого ресурса, стоит заметить, что, у класса должен быть квалификатор SupportsDelete со значением True, что бы процесс удаления был успешным. Примером использования может служить задача удаления фильтра событий из репозитория CIM, например:

OptionExplicitOnErrorResumeNext Dim objService                       '   Объект SWbemServices' Подключаемся к пространству имен WMISet objService = GetObject ("WinMgmts:\.RootCIMV2") ' Выполняем метод Delete objService.Delete "__EventFilter.name=""MonitoringServices"""' Обрабатываем ошибки If Err.Number <> 0 Then' Выводим сообщение об ошибкеMsgBox "Ошибка при удалении фильтра событий MonitoringServices"Else' Выводим сообщение об удалении объектаMsgBox "Удаление фильтра событий MonitoringServices прошло успешно"EndIf

Обязательный параметр strObjectPath задает имя класса или экземпляра объекта, который надо удалить.

ExecMethod(strObjectPath, strMethodName, [objWbemInParams ]) – работает в синхронном режиме. позволяет вызвать метод (strMethodName) соответствующего объекта (strObjectPath), тут objWbemInParams – задает параметры для используемого метода. Давайте попробуем вызвать метод create класса Win32_Service, который позволит запустить программу блокнот:

'*********************************************' Имя: notepad_run.vbs ' Запуск процесса Notepad.exe'*********************************************OptionExplicit' Объявляем переменные Dim strClass         '   Имя классаDim strMethod           '   Имя методаDim objService        '   Объект SWbemServiceDim colProcess          '   Коллекция экземпляров класса WMIDim objProcess       ' Элемент коллекцииDim oInParams        ' Коллекция входных параметровDim oOutParams        ' Коллекция выходных параметров strClass = "Win32_Process" strMethod = "Create"' Подключаемся к пространству имен WMISet objService = GetObject("WinMgmts:\.RootCIMV2")' Получаем указатель на класс Win32_Process Set objProcess = objService.Get(strClass)' Создаем коллекцию входных параметров методаSet oInParams = objProcess.Methods_(strMethod).InParameters.SpawnInstance_' Заполняем входной параметр CommandLine oInParams.CommandLine = "Notepad.exe"' Выполняем метод и получаем указатель на коллекцию выходных параметров Set oOutParams = objService.ExecMethod(strClass, strMethod, oInParams)' Проверяем возвращаемое методом значение If (oOutParams.ReturnValue <> 0) Then' Выводим на экран сообщения об ошибкеWscript.Echo "Ошибка при создании процесса NOTEPAD.EXE, код " & oOutParams.ReturnValue Else' Выводим на экран идентификатор запущенного процесса Wscript.Echo "Процесс NOTEPAD.EXE успешно создан. " & "Его идентификатор Handle = " & oOutParams.ProcessIdEndIf

ExecNotificationQuery(strQuery) – работает в полусинхронном режиме, позволяет выполнить запрос для получения события. Тут strQuery – запрос на языке WQL. Ниже приведен пример скрипта, после его запуска будет происходит ожидание на запуск процесса в системе, как только какой то процесс (программа) будет запущен, произойдет вывод сообщения:

'*********************************************' Имя: event_process.vbs ' Ожидание на запуск процесса в системе'*********************************************OptionExplicit' Объявляем переменныеDim objService        ' Объект SWbemServices    Dim objEventSource    ' Объект SWbemEventSourceDim objEvent          ' Объект SWbemObject Dim strResult         ' Результирующая строка ' Подключаемся к пространству имен WMISet objService = GetObject("WinMgmts:\.RootCIMV2"' Выполняем запрос для подписки на извещения о событиях WMI Set objEventSource = objService.ExecNotificationQuery ("SELECT * FROM __InstanceCreationEvent " & _             "WITHIN 5 WHERE TargetInstance ISA 'Win32_Process' ")           'Ждем наступления события, записываем в переменную objEvent  событиеSet objEvent = objEventSource.NextEvent' Событие наступило,формирум строку для вывода        strResult = "Запущен процесс  " & objEvent.TargetInstance.Name' Выводим результат на экранWScript.Echo strResult

Get(strObjectPath) – работает в синхронном режиме, позволяет получить доступ к классу или экземпляру объекта, например:

'*********************************************' Имя: notepad_run_1.vbs ' Запуск процесса Notepad.exe'*********************************************Set objServices = GetObject("WinMgmts:{impersonationLevel=impersonate}!\.rootCIMV2")Set objClass = objServices.Get("Win32_Process")intError = objClass.Create("Notepad.exe", null, null, intProcessID)

Скрипт производит запуск программы блокнот.

InstancesOf(strClass) – позволяет получить коллекцию объектов указанного класса (strClass), работает в синхронном и полусинхронном режимах, например:

'*********************************************' Имя: process_list.vbs ' Выводим список запущенных процессов'*********************************************OptionExplicitDim strResult, objService,colNamespaces, objProcess      strResult=""Set objService = GetObject("winmgmts:\.rootCIMV2") 'Создаем коллекцию подпространств имен WMI Set colNamespaces = objService.InstancesOf("Win32_Process") 'Перебираем коллекцию ForEach objProcess In colNamespaces     strResult = strResult & objProcess.Name & VbCrLfNext Wscript.Echo strResult

Сценарий выводит список запущенных процессов

Скачать архив с примерами

SubclassesOf ([strSuperclass]) – позволяет получить коллекцию всех подклассов заданного класса. Тут strSuperclass — имя класса, подклассы которого требуется получить. Если параметр не указан, будут возвращены все классы верхнего уровня или вообще все классы в пределах текущего пространства имён. Работает в синхронном и полусинхронном режиме. Например:

'*********************************************' Имя: class_list.vbs ' Выводим список классов для заданого пространства имен'*********************************************OptionExplicitDim objService, colClasses,    objClass, strResult, cil cil=1' Подключаемся к пространству имен WMI Set objService = GetObject("winmgmts:\.RootCIMV2") ' Создаем коллекцию классов WMI Set colClasses = objService.SubclassesOf() ' Перебираем элементы коллекции ForEach objClass In colClasses cil=cil+1if cil>20 thenExitfor    'Формируем результирующую строку     strResult=strResult & " " & objClass.Path_.Class & VbCrLf Next Wscript.Echo strResult

Скрипт выводит список классов для заданного пространства имен

Свойство

У объекта SWbemServices есть только одно свойство Security_ — оно содержит ссылку на объект SWbemSecurity, который, в свою очередь, служит для чтения и установки параметров безопасности (привилегий, уровня олицетворения и уровня аутентификации).

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий