Invocar una consulta sincrónica

Una consulta sincrónica es una consulta que mantiene el control sobre el proceso de la aplicación durante la duración de la consulta. Una consulta sincrónica requiere una sola llamada de interfaz y, por tanto, es más sencilla que una llamada asincrónica. Sin embargo, una consulta sincrónica tiene la posibilidad de bloquear la aplicación para consultas de gran tamaño, o para consultas a través de una red.

En el procedimiento siguiente se describe cómo emitir una consulta de datos sincrónica mediante PowerShell.

Para emitir una consulta de datos sincrónica en PowerShell

  • Describa la consulta a WMI mediante el cmdlet Get-WmiObject de WMI y el parámetro -query. El cmdlet devuelve un único objeto o una colección de objetos, en función del número de objetos que se ajusten a la consulta.

    Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
    

En el procedimiento siguiente se describe cómo emitir una consulta de datos sincrónica mediante C#.

Para emitir una consulta de datos sincrónica en C# (Microsoft.Management.Infrastructure)

  1. Describa la consulta a WMI mediante CimSession.QueryInstances. Este método devuelve una colección de objetos CimInstance.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM Win32_LogicalDisk";
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstances = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    
  2. Use técnicas estándar de colección de lenguajes de C# para tener acceso a cada objeto devuelto.

    foreach (CimInstance drive in queryInstances)
    {
       Console.WriteLine(drive.CimInstanceProperties["DeviceID"]);
    }
    

En el procedimiento siguiente se describe cómo emitir una consulta de datos sincrónica mediante C#.

Para emitir una consulta de datos sincrónica en C# (System.Management)

  1. Cree la consulta con un objeto ManagementObjectSearcher y recupere la información con una llamada a ManagementObjectSearcher.Get.

    Este método devuelve un objeto ManagementObjectCollection.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Use técnicas estándar de colección de lenguajes de C# para tener acceso a cada objeto devuelto.

    foreach (ManagementObject drive in objCol)
    {
       Console.WriteLine(drive["DeviceID"]);
    }
    

En el procedimiento siguiente se describe cómo emitir una consulta de datos sincrónica mediante VBScript.

Para emitir una consulta de datos sincrónica en VBScript

  1. Describa la consulta a WMI mediante SWbemServices.ExecQuery. Este método devuelve un objeto SWbemObjectSet.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Use técnicas estándar de colección de lenguajes de scripting para tener acceso a cada objeto devuelto.

    for each Service in _ 
        GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
        WScript.Echo "  "& Service.DisplayName & " [", Service.Name, "]"
    next
    

En el procedimiento siguiente se describe cómo emitir una consulta de datos sincrónica mediante C++.

Para emitir una consulta sincrónica en C++

  1. Describa la consulta a WMI a través de una llamada a IWbemServices::ExecQuery.

    El método ExecQuery adopta una cadena de búsqueda de WQL como parámetro que describe la consulta. WMI realiza la consulta y devuelve un puntero de interfaz IEnumWbemClassObject. A través de la interfaz IEnumWbemClassObject, puede acceder a las clases o instancias que componen el conjunto de resultados.

  2. Después de recibir la consulta, puede enumerar la consulta con una llamada a IEnumWbemClassObject::Next. Para obtener más información, consulte Enumerar WMI.

    El ejemplo de código siguiente requiere las siguientes referencias e instrucciones #include para compilarse correctamente.

    #include <wbemidl.h>
    #include <iostream>
    using namespace std;
    

    En el ejemplo de código siguiente se describe cómo consultar los objetos que representan a los usuarios y grupos de WMI.

    void ExecQuerySync(IWbemServices *pSvc)
    {
        // Query for all users and groups.
    
        BSTR Language = SysAllocString(L"WQL");
        BSTR Query = SysAllocString(L"SELECT * FROM __Namespace");
    
        // Initialize the IEnumWbemClassObject pointer.
        IEnumWbemClassObject *pEnum = 0;
    
        // Issue the query.
        HRESULT hRes = pSvc->ExecQuery(
            Language,
            Query,
            WBEM_FLAG_FORWARD_ONLY,         // Flags
            0,                              // Context
            &pEnum
            );
    
        SysFreeString(Query);
        SysFreeString(Language);
    
        if (hRes != 0)
        {
            printf("Error\n");
            return;
        }
    
        ULONG uTotal = 0;
    
        // Retrieve the objects in the result set.
        for (;;)
        {
            IWbemClassObject *pObj = 0;
            ULONG uReturned = 0;
    
            hRes = pEnum->Next(
                0,                  // Time out
                1,                  // One object
                &pObj,
                &uReturned
                );
    
            uTotal += uReturned;
    
            if (uReturned == 0)
                break;
    
            // Use the object.
    
            // ...
    
            // Release it.
            // ===========
    
            pObj->Release();    // Release objects not owned.            
        }
    
        // All done.
        pEnum->Release();
    }