Partilhar via


Chamando um método WMI

O WMI fornece métodos na API COM e na API de scripting para obter informações ou manipular objetos em um sistema empresarial. Por exemplo, o método de script WMI SWbemServices.ExecQuery consulta para obter 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 seguintes seções são discutidas neste tópico:

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

Usando método WMI chamadas combinadas com método de provedor chamadas, você pode recuperar e manipular informações sobre sua empresa. Para obter mais informações, consulte chamando um método WMI e chamando 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 Scripting with SWbemObject.

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

Os seguintes métodos WMI e provedor estão localizados no Scripting API for WMI:

Você pode consultar o código que pode aparecer em "Retorno" na secçã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 = "Alerter"'
foreach ($objService in $colServices)
{
    $objService.StopService()
}

Modos 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:

  • síncrono
  • assíncrono
  • semissíncrona

Modo síncrono

O modo síncrono ocorre quando o programa ou scripts pausam 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 script no computador que executa o programa ou script. Por exemplo, recuperar de forma síncrona 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, 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 retornem grandes conjuntos de dados no modo síncrono. Os seguintes métodos SWbemServices podem ser chamados com segurança no modo síncrono:

Qualquer método SWbemServices sem a palavra "Async" no nome pode ser chamado 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. À medida que cada objeto é criado, o WMI retorna todos os objetos do método para um objeto SWbemSink . O programa ou script de chamada deve ter um objeto SWbemSink e um manipulador de eventosSWbemSink.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 recursos do modo síncrono, o modo assíncrono pode criar sérios riscos de segurança porque os resultados armazenados no objeto SWbemSinkpodem 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 reduzir esses riscos de segurança, consulte Definindo a segurança em uma chamada assíncrona.

Os 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, na medida em que o programa ou script continua a ser executado depois de chamar o método. No modo semissíncrono, o WMI recupera os objetos em segundo plano à medida que o 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 da instância poderá monopolizar os recursos disponíveis, o que pode degradar o desempenho do programa ou script e do computador que usa 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 iFlags parâmetro definido com o wbemFlagForwardOnly e wbemFlagReturnImmediately sinalizadores para instruir o WMI a retornar um somente para encaminhamento SWbemObjectSet. Um SWbemObjectSet somente para encaminhamento elimina o problema de desempenho causado por um grande conjunto de dados, libertando a memória após a enumeração do objeto.

Qualquer método SWbemServices que não pode 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++ e Making a Semisynchronous Call with VBScript.

Melhorando o desempenho da enumeração

Programação com SWbemObject

WbemFlagEnum