Llamar a un método WMI

WMI proporciona métodos en la API COM y la API de scripting para obtener información o manipular objetos en un sistema empresarial. Por ejemplo, el método de scripting WMI SWbemServices.ExecQuery consulta los datos. Los proveedores también tienen métodos definidos en las clases que registran. Algunos ejemplos son los métodos Win32_LogicalDiskChkdsk y ScheduleAutoChk proporcionados por el proveedor win32.

En este tema se describen las secciones siguientes:

Métodos WMI en comparación con los métodos de proveedor

Mediante el uso de llamadas de método WMI combinadas con llamadas de método de proveedor , puede recuperar y manipular información sobre su empresa. Para obtener más información, vea Llamar a un método WMI y Llamar a un método de proveedor.

Los métodos del objeto de scripting WMI SWbemObject tienen un estado especial porque se pueden aplicar a cualquier clase de datos WMI. Para obtener más información, vea Scripting with SWbemObject.

En el ejemplo de código siguiente se llama a los métodos WMI y provider.

Los siguientes métodos de proveedor y WMI se encuentran en la API de scripting para WMI:

Puede buscar el código que puede aparecer en "Devolver" en la sección 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 en WMI

El modo de llamada semiincrónico suele proporcionar el mejor equilibrio entre seguridad y rendimiento.

Para obtener más información sobre cada uno de los modos posibles, vea lo siguiente:

Modo sincrónico

El modo sincrónico se produce cuando el programa o los scripts se pausan hasta que la llamada al método devuelve un objeto de colección SWbemObjectSet . WMI compila esta colección en memoria antes de devolver el objeto de colección al programa o script que llama.

El modo sincrónico puede tener un efecto adverso en el rendimiento del programa o script en el equipo que ejecuta el programa o script. Por ejemplo, la recuperación sincrónica de miles de eventos del registro de eventos puede tardar mucho tiempo y usar una gran cantidad de memoria porque WMI crea un objeto a partir de cada evento y, a continuación, coloca esos objetos en una colección antes de pasar la colección al método .

Solo debe llamar a métodos que no devuelvan grandes conjuntos de datos en modo sincrónico. Los métodos SWbemServices siguientes se pueden llamar de forma segura en modo sincrónico:

Cualquier método SWbemServices sin la palabra "Async" en el nombre se puede llamar en modo sincrónico estableciendo el valor wbemFlagReturnWhenComplete en el parámetro iFlags .

Modo asíncrono

El modo asincrónico se produce cuando el programa o script continúa ejecutándose después de llamar al método . WMI devuelve todos los objetos del método a un objeto SWbemSink a medida que se crea cada objeto. El programa o script que realiza la llamada debe tener un objeto SWbemSink y un controlador de eventos SWbemSink.OnObjectReady para procesar los objetos devueltos. Para obtener más información sobre cómo crear un controlador de eventos para el modo asincrónico, vea Recepción de un evento WMI.

Aunque este modo no tiene el rendimiento y la penalización de recursos del modo sincrónico, el modo asincrónico puede crear riesgos de seguridad graves porque los resultados almacenados en el objeto SWbemSink pueden no provenir del programa o script de llamada. WMI reduce el nivel de autenticación en el objeto SWbemSink hasta que el método se realiza correctamente. Para obtener más información sobre cómo mitigar estos riesgos de seguridad, vea Establecer la seguridad en una llamada asincrónica.

Los métodos anexados con la palabra Async son métodos para el modo asincrónico. Los métodos siguientes son llamadas asincrónicas:

Para obtener más información sobre el modo asincrónico, vea:

Modo semiincrónico

El modo semiincrónico es similar al modo asincrónico en que el programa o script continúa ejecutándose después de llamar al método . En modo semisincrónico, WMI recupera los objetos en segundo plano a medida que el script o programa continúa ejecutándose. WMI devuelve cada objeto devuelto al método que realiza la llamada justo después de crear el objeto.

Dado que WMI administra el objeto, el modo semisincrónico es más seguro que el modo asincrónico. Sin embargo, si usa el modo semisincrónico con más de 1000 instancias, la recuperación de instancias puede monopolior los recursos disponibles, lo que puede degradar el rendimiento del programa o script y el equipo mediante el programa o script. Cada objeto ocupa los recursos necesarios hasta que se libera la memoria.

Para solucionar esta condición, puede llamar al método con el parámetro iFlags establecido con las marcas wbemFlagForwardOnly y wbemFlagReturnImmediately para indicar a WMI que devuelva un SWbemObjectSet de solo avance. Un SWbemObjectSet de solo avance elimina el problema de rendimiento causado por un conjunto de datos grande liberando la memoria después de enumerar el objeto.

Cualquier método SWbemServices al que no se pueda llamar en modo sincrónico o asincrónico se llama en modo semiincrónico.

Se llama a los métodos siguientes en modo semisincrónico:

Para obtener más información sobre el modo semiincrónico, vea Making a Semisynchronous Call with C++ and Making a Semisynchronous Call with VBScript.

Mejora del rendimiento de enumeración

Scripting con SWbemObject

WbemFlagEnum