Chamar um método WMI

O WMI fornece métodos na API COM e na API de script para obter informações ou manipular objetos em um sistema corporativo. Por exemplo, o método de script WMI SWbemServices.ExecQuery consulta dados. Os provedores também têm métodos definidos nas classes que registram. Os exemplos são os métodos Win32_LogicalDiskChkdsk e ScheduleAutoChk fornecidos pelo provedor Win32.

As seguintes seções são abordadas neste tópico:

Métodos WMI em comparação com métodos de provedor

Usando chamadas de método WMI combinadas com chamadas de método de provedor, você pode recuperar e manipular informações sobre sua empresa. Para obter mais informações, consulte Chamar um método WMI e Chamar um método de provedor.

Os métodos do objeto de script WMI SWbemObject têm uma status especial porque podem ser aplicados a qualquer classe de dados WMI. Para obter mais informações, consulte Scripts com SWbemObject.

O exemplo de código a seguir chama os métodos WMI e de provedor.

Os seguintes métodos WMI e de provedor estão localizados na API de script para WMI:

É possível pesquisar o código que pode aparecer em "Return" na seção Códigos de retorno em 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 = &quot;Alerter&quot;'
foreach ($objService in $colServices)
{
    $objService.StopService()
}

Modos de chamada de método no WMI

O modo de chamada semissíncrona geralmente fornece o melhor equilíbrio entre segurança e desempenho.

Para obter mais informações sobre cada um dos modos possíveis, consulte o seguinte:

Modo síncrono

O modo síncrono ocorre quando o programa ou os scripts são pausados até que a chamada de método retorne um objeto de coleção SWbemObjectSet. O WMI cria essa coleção na memória antes de retornar o objeto de coleção para o programa ou script de chamada.

O modo síncrono pode ter um efeito adverso do desempenho do programa ou do script no computador que executa o programa ou o script. Por exemplo, a recuperação síncrona de milhares de eventos do log de eventos pode levar muito tempo e usar muita memória, porque o WMI cria um objeto em cada evento e, em seguida, coloca esses objetos em uma coleção antes de passar a coleção para o método.

Você só deve chamar métodos que não retornam grandes conjuntos de dados no modo síncrono. Os seguintes métodos SWbemServices podem ser chamados com segurança no modo síncrono:

Todos os métodos SWbemServices sem a palavra "Async" no nome podem ser chamados no modo síncrono definindo o valor wbemFlagReturnWhenComplete no parâmetro iFlags.

Modo assíncrono

O modo assíncrono ocorre quando o programa ou script continua a ser executado após chamar o método. O WMI retorna todos os objetos do método para um objeto SWbemSink à medida que cada objeto é criado. O programa ou script de chamada deve ter um objeto SWbemSink e um manipulador de eventos SWbemSink.OnObjectReady para processar os objetos retornados. Para obter mais informações sobre como criar um manipulador de eventos no modo assíncrono, consulte Receber um evento WMI.

Embora esse modo não tenha a penalidade de desempenho e recurso do modo síncrono, o modo assíncrono pode criar sérios riscos à segurança, porque os resultados armazenados no objeto SWbemSink podem não vir do programa ou script de chamada. O WMI reduz o nível de autenticação no objeto SWbemSink até que o método seja bem-sucedido. Para obter mais informações sobre como mitigar esses riscos à segurança, consulte Configurar a segurança em uma chamada assíncrona.

Métodos acrescentados com a palavra Async são métodos para o modo assíncrono. Os seguintes métodos são chamadas assíncronas:

Para obter mais informações sobre o modo assíncrono, consulte:

Modo semissíncrono

O modo semissíncrono é semelhante ao modo assíncrono no qual o programa ou script continua a ser executado após chamar o método. No modo semissíncrono, o WMI recupera os objetos em segundo plano à medida que seu script ou programa continua a ser executado. O WMI retorna cada objeto retornado ao método de chamada logo após a criação do objeto.

Como o WMI gerencia o objeto, o modo semissíncrono é mais seguro do que o modo assíncrono. No entanto, se você usar o modo semissíncrono com mais de 1.000 instâncias, a recuperação de instância poderá monopolizar os recursos disponíveis, o que pode prejudicar o desempenho do programa ou do script e do computador que usa o programa ou o script. Cada objeto ocupa os recursos necessários até que a memória seja liberada.

Para contornar essa condição, você pode chamar o método com o parâmetro iFlags definido com os sinalizadores wbemFlagForwardOnly e wbemFlagReturnImmediately para instruir o WMI a retornar um SWbemObjectSet somente para encaminhamento. Um SWbemObjectSet somente para encaminhamento elimina o problema de desempenho causado por um grande conjunto de dados liberando a memória depois que o objeto é enumerado.

Qualquer método SWbemServices que não possa ser chamado no modo síncrono ou assíncrono é chamado no modo semissíncrono.

Os seguintes métodos são chamados no modo semissíncrono:

Para obter mais informações sobre o modo semissíncrono, consulte Fazer uma chamada semissíncrona com C++ e Fazer uma chamada semissíncrona com VBScript.

Melhorar o desempenho da enumeração

Scripts com SWbemObject

WbemFlagEnum