Llamada a un método de 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 que suministra el proveedor Win32.
En este tema, se describen las secciones siguientes:
- Métodos WMI en comparación con los métodos de proveedor
- Modos de llamada a métodos en WMI
- Temas relacionados
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 más información, consulte Llamada a un método WMI y Llamada 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 más información, consulte Creación de scripts con SWbemObject.
En el ejemplo de código siguiente, se llama tanto a métodos WMI como de proveedor.
Los métodos WMI y de proveedor siguientes se encuentran en la API de scripting para WMI:
- objWMIService.ExecQuery llama al método de scripting WMI SWbemServices.ExecQuery
- objService.StopService() llama al método de proveedor Win32_Service.StopService
Puede buscar el código que posiblemente aparezca en "Retorno" en la sección Códigos de retorno de 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 de llamada a métodos en WMI
Por lo general, el modo de llamada asincrónico proporciona el mejor equilibrio entre seguridad y rendimiento.
Para más información sobre cada uno de los modos posibles, consulte 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 el script. Por ejemplo, la recuperación sincrónica de miles de eventos desde el 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, luego, 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 conjuntos de datos de gran tamaño en modo sincrónico. En modo sincrónico, se puede llamar de manera segura a los métodos SWbemServices:
En modo sincrónico, se posible llamar a los métodos SWbemServices que no tienen la palabra "Async"; para ello, establezca el valor wbemFlagReturnWhenComplete en el parámetro iFlags.
Modo asíncrono
El modo asincrónico se produce cuando el programa o script se sigue ejecutando 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 llama debe tener un objeto SWbemSink y un controlador de eventos SWbemSink.OnObjectReady para procesar los objetos devueltos. Para más información sobre cómo crear un controlador de eventos para el modo asincrónico, consulte Recepción de un evento WMI.
Si bien en este modo no existe la penalización de rendimiento y recurso del modo sincrónico, el modo asincrónico puede crear riesgos de seguridad graves porque es posible que los resultados almacenados en el objeto SWbemSink no provengan del programa o script que llama. WMI reduce el nivel de autenticación en el objeto SWbemSink hasta que el método se realice correctamente. Para más información sobre cómo mitigar estos riesgos de seguridad, consulte Establecimiento de 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:
- SWbemServices.AssociatorsOfAsync
- SWbemServices.DeleteAsync
- SWbemServices.ExecMethodAsync
- SWbemServices.ExecNotificationQueryAsync
- SWbemServices.ExecQueryAsync
- SWbemServices.InstancesOfAsync
- SWbemServices.ReferencesToAsync
- SWbemServices.SubclassesOfAsync
Para más información sobre el modo asincrónico, consulte:
Modo semisincrónico
El modo semisincrónico es similar al modo asincrónico en que el programa o script se sigue ejecutando después de llamar al método. En modo semisincrónico, WMI recupera los objetos en segundo plano a medida que el script o el programa se sigue ejecutando. WMI devuelve cada objeto devuelto al método de 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 monopolizar 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 que provoca un conjunto de datos grande; para ello, libera la memoria después de enumerar el objeto.
Los métodos SWbemServices que no se pueden llamar en modo sincrónico ni asincrónico se llaman en modo semisincrónico.
Estos métodos se llaman en modo semisincrónico:
- SWbemServices.AssociatorsOf
- SWbemServices.Delete
- SWbemServices.ExecMethod
- SWbemServices.ExecNotificationQuery
- SWbemServices.ExecQuery
- SWbemServices.Get
- SWbemServices.InstancesOf
- SWbemServices.ReferencesTo
- SWbemServices.SubclassesOf
- SWbemServices.Put
Para más información sobre el modo semisincrónico, consulte Realización de una llamada semisincrónica con C++ y Realización de una llama semisincrónica con VBScript.
Temas relacionados