Вызов метода 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
Вы можете найти код, который может появиться в поле Return (Возврат) в разделе "Коды возврата" для 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".
Связанные темы