Partager via


Appel d’une requête synchrone

Une requête synchrone est une requête qui conserve le contrôle sur le processus de votre application pendant la durée de la requête. Une requête synchrone nécessite un seul appel d’interface et est donc plus simple qu’un appel asynchrone. Toutefois, une requête synchrone a le potentiel de verrouiller votre application pour les requêtes volumineuses ou les requêtes sur un réseau.

La procédure suivante décrit comment émettre une requête de données synchrone à l’aide de PowerShell.

Pour émettre une requête de données synchrone dans PowerShell

  • Décrivez votre requête dans WMI à l’aide de l’applet de commande Get-WmiObject WMI et du paramètre -query. L’applet de commande retourne un objet unique ou une collection d’objets, selon le nombre d’objets correspondant à la requête.

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

La procédure suivante décrit comment émettre une requête de données synchrone à l’aide de C#.

Pour émettre une requête de données synchrone en C# (Microsoft.Management.Infrastructure)

  1. Décrivez votre requête à WMI à l’aide de CimSession.QueryInstances. Cette méthode retourne une collection d’objets 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. Utilisez les techniques de collection de langage C# standard pour accéder à chaque objet retourné.

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

La procédure suivante décrit comment émettre une requête de données synchrone à l’aide de C#.

Pour émettre une requête de données synchrone en C# (System.Management)

  1. Créez la requête avec un objet ManagementObjectSearcher et récupérez les informations avec un appel à ManagementObjectSearcher.Get.

    Cette méthode retourne un objet ManagementObjectCollection.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Utilisez les techniques de collection de langage C# standard pour accéder à chaque objet retourné.

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

La procédure suivante décrit comment émettre une requête de données synchrone à l’aide de VBScript.

Pour émettre une requête de données synchrone dans VBScript

  1. Décrivez votre requête à WMI à l’aide de SWbemServices.ExecQuery. Cette méthode retourne un SWbemObjectSet.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Utilisez les techniques de collection de langage de script standard pour accéder à chaque objet retourné.

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

La procédure suivante décrit comment émettre une requête de données synchrone à l’aide de C++.

Pour émettre une requête synchrone en C++

  1. Décrivez votre requête à WMI via un appel à IWbemServices::ExecQuery.

    La méthode ExecQuery prend une chaîne de recherche WQL comme paramètre qui décrit votre requête. WMI exécute la requête et retourne un pointeur d’interface IEnumWbemClassObject. Via l’interface IEnumWbemClassObject, vous pouvez accéder aux classes ou instances qui composent le jeu de résultats.

  2. Après avoir reçu votre requête, vous pouvez énumérer votre requête avec un appel à IEnumWbemClassObject::Next. Pour plus d’informations, consultez Énumération de WMI.

    L’exemple de code suivant nécessite les références et les instructions #include suivantes pour être compilé correctement.

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

    L’exemple de code suivant explique comment interroger les objets qui représentent les utilisateurs et les groupes dans 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();
    }