Chamando 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. Exemplos são os métodos Win32_LogicalDiskChkdsk e ScheduleAutoChk fornecidos pelo provedor Win32.

As seções a seguir são discutidas neste tópico:

Métodos WMI comparados aos 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 um 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 provedor.

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

Você pode pesquisar o código que pode aparecer em "Retornar" na seção Códigos de Retorno para 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 Method-Calling 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 scripts pausa 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 de cada evento e 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 depois de chamar o método. O WMI retorna todos os objetos do método para um objeto SWbemSink à medida que cada objeto é criado. O programa de chamada ou script 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 para o modo assíncrono, consulte Recebendo 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 de segurança porque os resultados armazenados no objeto SWbemSink podem não vir do programa de chamada ou script. 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 atenuar esses riscos de segurança, consulte Configurando a segurança em uma chamada assíncrona.

Métodos acrescentados com a palavra Assíncrono 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 script e do computador usando o programa ou 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 frente. Um SWbemObjectSet somente para frente elimina o problema de desempenho causado por um conjunto de dados grande 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 Making a Semisynchronous Call with C++ and Making a Semisynchronous Call with VBScript.

Melhorando o desempenho da enumeração

Scripts com SWbemObject

WbemFlagEnum