Объект WMI SWbemServices

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

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

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

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

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

Option Explicit
On Error Resume Next
 
Dim objService                       '   Объект SWbemServices
' Подключаемся к пространству имен WMI
Set objService = GetObject ("WinMgmts:\\.\Root\CIMV2") 
' Выполняем метод Delete 
objService.Delete "__EventFilter.name=""MonitoringServices"""
' Обрабатываем ошибки 
If Err.Number <> 0 Then
' Выводим сообщение об ошибке
MsgBox "Ошибка при удалении фильтра событий MonitoringServices" 
Else
' Выводим сообщение об удалении объекта
MsgBox "Удаление фильтра событий MonitoringServices прошло успешно" 
End If

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

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

'*********************************************
' Имя: notepad_run.vbs 
' Запуск процесса Notepad.exe
'*********************************************
Option Explicit
' Объявляем переменные
 
Dim strClass         '   Имя класса
Dim strMethod           '   Имя метода
Dim objService        '   Объект SWbemService
Dim colProcess          '   Коллекция экземпляров класса WMI
Dim objProcess       ' Элемент коллекции
Dim oInParams        ' Коллекция входных параметров
Dim oOutParams        ' Коллекция выходных параметров
 
strClass = "Win32_Process" 
strMethod = "Create"
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\.\Root\CIMV2")
' Получаем указатель на класс 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.ProcessId
End If

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

'*********************************************
' Имя: event_process.vbs 
' Ожидание на запуск процесса в системе
'*********************************************
Option Explicit
' Объявляем переменные
Dim objService        ' Объект SWbemServices    
Dim objEventSource    ' Объект SWbemEventSource
Dim objEvent          ' Объект SWbemObject 
Dim strResult         ' Результирующая строка
 
' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\.\Root\CIMV2")
 
' Выполняем запрос для подписки на извещения о событиях 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}!\\.\root\CIMV2")
Set objClass = objServices.Get("Win32_Process")
intError = objClass.Create("Notepad.exe", null, null, intProcessID)

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

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

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

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

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

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

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

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

Свойство

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

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