Вызов метода WMI
WMI предоставляет методы в COM API и API скриптов для получения информации или управления объектами в корпоративной системе. Например, метод скриптов WMI SWbemServices.ExecQuery запрашивает данные. Поставщики также имеют методы, определенные в классах, которые они регистрируют. Примерами являются методы Win32_LogicalDiskChkdsk и ScheduleAutoChk, предоставляемые поставщиком Win32 .
В этом разделе рассматриваются следующие разделы:
Методы WMI по сравнению с методами поставщика
Используя вызовы метода WMI в сочетании с вызовами метода провайдера , вы можете получать и управлять информацией о вашем предприятии. Дополнительные сведения см. в статьях Вызов метода WMI и Вызов метода поставщика.
Методы объекта скриптов WMI SWbemObject имеют особое состояние, так как они могут применяться к любому классу данных WMI. Дополнительные сведения см. в разделе Скриптирование с помощью SWbemObject.
В следующем примере кода вызываются методы WMI и поставщика.
Следующие методы WMI и поставщика находятся в API скриптов для WMI:
- objWMIService.ExecQuery вызывает метод скриптов WMI SWbemServices.ExecQuery
- objService.StopService() вызывает метод поставщика Win32_Service.StopService
Вы можете найти код, который может появиться в разделе "Коды возврата", относящемся к Win32_Service.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
Return = objService.StopService()
If Return <> 0 Then
Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return
Else
WScript.Echo "Succeeded"
End If
Next
$colServices= Get-WmiObject -Class Win32_Service -Filter 'Name = "Alerter"'
foreach ($objService in $colServices)
{
$objService.StopService()
}
режимы Method-Calling в WMI
Полусинхронный режим вызова обычно обеспечивает оптимальный баланс между безопасностью и производительностью.
Дополнительные сведения о каждом из возможных режимов см. в следующих статьях:
Синхронный режим
Синхронный режим возникает, когда программа или скрипты приостанавливаются, пока вызов метода не возвращает объект коллекции SWbemObjectSet. WMI создает эту коллекцию в памяти, прежде чем возвращать объект коллекции вызывающей программе или скрипту.
Синхронный режим может негативно повлиять на производительность программы или скрипта на компьютере под управлением программы или скрипта. Например, синхронно извлечение тысяч событий из журнала событий может занять много времени и использовать много памяти, так как WMI создает объект из каждого события, а затем помещает эти объекты в коллекцию перед передачей коллекции в метод.
Следует вызывать только методы, которые не возвращают большие наборы данных в синхронном режиме. Следующие методы SWbemServices можно безопасно вызывать в синхронном режиме:
Любые методы SWbemServices без слова "Async" в имени можно вызвать в синхронном режиме, задав значение wbemFlagReturnWhenComplete в параметре iFlags.
Асинхронный режим
Асинхронный режим возникает, когда программа или скрипт продолжает выполняться после вызова метода. WMI возвращает все объекты из метода в объект SWbemSink по мере создания каждого объекта. Вызывающая программа или скрипт должны иметь объект SWbemSinkи обработчик событий SWbemSink.OnObjectReady для обработки возвращаемых объектов. Дополнительные сведения о создании обработчика событий для асинхронного режима см. в разделе Получение события WMI.
Хотя этот режим не несет нагрузок на производительность и ресурсы, как синхронный режим, асинхронный режим может создать серьезные риски безопасности, так как результаты, хранящиеся в объекте SWbemSink, могут не поступать из вызывающей программы или скрипта. WMI снижает уровень проверки подлинности на объекте SWbemSink до успешного выполнения метода. Дополнительные сведения об устранении этих рисков безопасности см. в разделе Настройка безопасности для асинхронного вызова.
Методы, добавленные с помощью слова Async, являются методами асинхронного режима. Ниже приведены асинхронные вызовы:
- SWbemServices.AssociatorsOfAsync
- SWbemServices.DeleteAsync
- SWbemServices.ExecMethodAsync
- SWbemServices.ExecNotificationQueryAsync
- SWbemServices.ExecQueryAsync
- SWbemServices.InstancesOfAsync
- SWbemServices.ReferencesToAsync
- SWbemServices.SubclassesOfAsync
Дополнительные сведения об асинхронном режиме см. в следующем разделе:
Полусинхронный режим
Полусинхронный режим аналогичен асинхронному режиму в том, что программа или скрипт продолжает выполняться после вызова метода. В полусинхронном режиме WMI извлекает объекты в фоновом режиме, пока ваш скрипт или программа продолжают выполняться. WMI возвращает каждый объект, возвращенный вызывающей методу сразу после создания объекта.
Так как WMI управляет объектом, полусинхронный режим является более безопасным, чем асинхронный режим. Однако если вы используете полусинхронный режим с более чем 1000 экземплярами, извлечение экземпляров может монополизировать доступные ресурсы, что может снизить производительность программы или скрипта, а также компьютера, использующего программу или скрипт. Каждый объект занимает необходимые ресурсы, пока память не будет освобождена.
Чтобы обойти это состояние, можно вызвать метод с параметром iFlags установленным с флагами wbemFlagForwardOnly и wbemFlagReturnImmediately для указания WMI вернуть только прямой SWbemObjectSet. Только прямой SWbemObjectSet устраняет проблему производительности, вызванную большим набором данных, путем освобождения памяти после того, как объект перечислен.
Любой метод SWbemServices, который нельзя вызывать в синхронном или асинхронном режиме, вызывается в полусинхронном режиме.
Следующие методы вызываются в полусинхронном режиме:
- SWbemServices.AssociatorsOf
- SWbemServices.Delete
- SWbemServices.ExecMethod
- SWbemServices.ExecNotificationQuery
- SWbemServices.ExecQuery
- SWbemServices.Get
- SWbemServices.InstancesOf
- SWbemServices.ReferencesTo
- SWbemServices.SubclassesOf
- SWbemServices.Put
Дополнительные сведения о полусинхронном режиме см. в статье Создание полусинхронного вызова с помощью C++ и создание полусинхронного вызова с помощью VBScript.
Связанные разделы