Вызов метода WMI
WMI предоставляет методы в COM-API и API скриптов для получения информации или управления объектами в корпоративной системе. Например, метод скрипта WMI SWbemServices.ExecQuery запрашивает данные. Поставщики также имеют методы, определенные в классах, которые они регистрируют. Примерами являются Win32_LogicalDisk методы Chkdsk и 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 можно найти код, который может отображаться в разделе "Return" в разделе Коды возврата.
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.
Связанные темы