Объект 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, который, в свою очередь, служит для чтения и установки параметров безопасности (привилегий, уровня олицетворения и уровня аутентификации).