Récupération d’une partie d’une instance WMI

Une récupération d’instance partielle se produit lorsque WMI récupère uniquement un sous-ensemble des propriétés d’une instance. Par exemple, WMI pouvait récupérer uniquement les propriétés Name et Key . L’utilisation la plus courante de la récupération d’instance partielle est sur des énumérations volumineuses qui ont plusieurs propriétés.

Récupération d’une partie d’une instance WMI à l’aide de PowerShell

Vous pouvez récupérer une propriété individuelle d’un instance à l’aide de Get-WmiObject ; la propriété elle-même peut être récupérée et affichée de plusieurs façons. Comme pour la récupération d’une instance, PowerShell retourne par défaut toutes les instances d’une classe donnée ; vous devez spécifier une valeur spécifique si vous souhaitez récupérer une seule instance.

L’exemple de code suivant affiche le numéro de série du volume d’une instance de la classe Win32_LogicalDisk.

(Get-WmiObject -class Win32_logicalDisk).DeviceID

#or

Get-WmiObject -class Win32_LogicalDisk | format-list DeviceID

#or

$myDisk = Get-WmiObject -class Win32_LogicalDisk
$myDisk.DeviceID

Récupération d’une partie d’une instance WMI à l’aide de C# (System.Management)

Vous pouvez récupérer une propriété individuelle d’un instance en créant un ManagementObject à l’aide des détails d’un instance spécifique. Vous pouvez ensuite récupérer implicitement une ou plusieurs propriétés du instance avec la méthode GetPropertyValue.

Notes

System.Management était l’espace de noms .NET d’origine utilisé pour accéder à WMI ; toutefois, les API de cet espace de noms sont généralement plus lentes et ne sont pas mises à l’échelle aussi bien par rapport à leurs équivalents Microsoft.Management.Infrastructure plus modernes.

L’exemple de code suivant affiche le numéro de série du volume d’une instance de la classe Win32_LogicalDisk.

using System.Management;
...
ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
string myProperty = myDisk.GetPropertyValue("VolumeSerialNumber").ToString();
Console.WriteLine(myProperty);

Récupération d’une partie d’une instance WMI à l’aide de VBScript

Vous pouvez récupérer une propriété individuelle d’un instance à l’aide de GetObject.

L’exemple de code suivant affiche le numéro de série du volume d’une instance de la classe Win32_LogicalDisk.

MsgBox (GetObject("WinMgmts:Win32_LogicalDisk='C:'").VolumeSerialNumber)

Récupération d’une partie d’une instance WMI à l’aide de C++

La procédure suivante est utilisée pour demander une récupération d’instance partielle à l’aide de C++.

Pour demander une récupération partielle instance à l’aide de C++

  1. Créez un objet IWbemContext avec un appel à CoCreateInstance.

    Un objet de contexte est un objet que WMI utilise pour transmettre plus d’informations à un fournisseur WMI. Dans ce cas, vous utilisez l’objet IWbemContext pour indiquer au fournisseur d’accepter des mises à jour de instance partielles.

  2. Ajoutez __GET_EXTENSIONS, __GET_EXT_CLIENT_REQUEST et toutes les autres valeurs nommées qui décrivent les propriétés que vous souhaitez récupérer à l’objet IWbemContext .

    Le tableau suivant répertorie les différentes valeurs nommées utilisées dans votre appel de récupération.

    Valeur nommée Description
    __GET_EXTENSIONS
    VT_BOOL défini sur VARIANT_TRUE. Utilisé pour signaler que des opérations de récupération d’instance partielle sont utilisées. Cela permet une vérification rapide et unique sans avoir à énumérer l’ensemble de l’objet de contexte. Si l’une des autres valeurs est utilisée, celle-ci doit l’être.
    __GET_EXT_PROPERTIES
    SAFEARRAY des chaînes répertoriant les propriétés à récupérer. Ne peut pas être spécifié simultanément avec __GET_EXT_KEYS_ONLY.
    Un astérisque « * » est un nom de propriété non valide pour __GET_EXT_PROPERTIES.
    __GET_EXT_KEYS_ONLY
    VT_BOOL défini sur VARIANT_TRUE. Indique que seules les clés doivent être fournies dans l’objet retourné. Ne peut pas être spécifié simultanément avec __GET_EXT_PROPERTIES. Au lieu de cela, est prioritaire sur __GET_EXT_PROPERTIES.
    __GET_EXT_CLIENT_REQUEST
    VT_BOOL défini sur VARIANT_TRUE. Indique que l’appelant est celui qui a écrit la valeur dans l’objet de contexte et qu’elle n’a pas été propagée à partir d’une autre opération dépendante.
  3. Transmettez l’objet de contexte IWbemContext dans n’importe quel appel à IWbemServices::GetObject, IWbemServices::GetObjectAsync, IWbemServices::CreateInstanceEnum ou IWbemServices::CreateInstanceEnumAsync via le paramètre pCtx .

    La transmission de l’objet IWbemContext indique au fournisseur d’autoriser les mises à jour de instance partielles. Dans une récupération instance complète, vous définissez pCtx sur une valeur null. Si le fournisseur ne prend pas en charge la récupération partielle d’instance, vous recevrez un message d’erreur.

Si le fournisseur ne peut pas se conformer à l’opération de instance partielle, le fournisseur procède comme si vous n’avez pas entré l’objet de contexte, ou retourne WBEM_E_UNSUPPORTED_PARAMETER.

L’exemple suivant décrit comment effectuer une récupération complète instance des Win32_LogicalDisk, puis effectuer une récupération partielle instance de la propriété Win32_LogicalDisk.Caption.

#include <stdio.h>
#define _WIN32_DCOM
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#include <iostream>
using namespace std;
#include <comdef.h>


void main(void)
{
    HRESULT hr;
    _bstr_t bstrNamespace;
    IWbemLocator *pWbemLocator = NULL;
    IWbemServices *pServices = NULL;
    IWbemClassObject *pDrive = NULL;
    

    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
                         RPC_C_AUTHN_LEVEL_CONNECT,
                         RPC_C_IMP_LEVEL_IMPERSONATE,
                         NULL, EOAC_NONE, 0);
 
    if (FAILED(hr))
    {
       CoUninitialize();
       cout << "Failed to initialize security. Error code = 0x" 
            << hex << hr << endl;
       return;
    }

    hr = CoCreateInstance(CLSID_WbemLocator, NULL, 
                          CLSCTX_INPROC_SERVER, IID_IWbemLocator, 
                          (void**) &pWbemLocator);
    if( FAILED(hr) ) 
    {
        CoUninitialize();
        printf("failed CoCreateInstance\n");
        return;
    }
    
    bstrNamespace = L"root\\cimv2";
    hr = pWbemLocator->ConnectServer(bstrNamespace, 
              NULL, NULL, NULL, 0, NULL, NULL, &pServices);
    if( FAILED(hr) ) 
    {
        pWbemLocator->Release();
        CoUninitialize();
        printf("failed ConnectServer\n");
        return;
    }
    pWbemLocator->Release();
    printf("Successfully connected to namespace.\n");

    
    BSTR bstrPath = 
         SysAllocString(L"Win32_LogicalDisk.DeviceID=\"C:\"");
   // *******************************************************//
   // Perform a full-instance retrieval. 
   // *******************************************************//
    hr = pServices->GetObject(bstrPath,
                              0,0, &pDrive, 0);
    if( FAILED(hr) )
    { 
        pServices->Release();
        CoUninitialize();
        printf("failed GetObject\n");
        return;
    }    
    // Display the object
    BSTR  bstrDriveObj;
    hr = pDrive->GetObjectText(0, &bstrDriveObj);
    printf("%S\n\n", bstrDriveObj);

    pDrive->Release();
    pDrive = NULL;

   // *****************************************************//
   // Perform a partial-instance retrieval. 
   // *****************************************************//
    
    IWbemContext  *pctxDrive; // Create context object
    hr = CoCreateInstance(CLSID_WbemContext, NULL, 
                          CLSCTX_INPROC_SERVER, IID_IWbemContext, 
                          (void**) &pctxDrive);
    if (FAILED(hr))
    {
        pServices->Release();
        pDrive->Release();    
        CoUninitialize();
        printf("create instance failed for context object.\n");
        return;
    }
    
    VARIANT  vExtensions;
    VARIANT  vClient;
    VARIANT  vPropertyList;
    VARIANT  vProperty;
    SAFEARRAY  *psaProperties;
    SAFEARRAYBOUND saBounds;
    LONG  lArrayIndex = 0;
    
    // Add named values to the context object. 
    VariantInit(&vExtensions);
    V_VT(&vExtensions) = VT_BOOL;
    V_BOOL(&vExtensions) = VARIANT_TRUE;
    hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXTENSIONS"), 
        0, &vExtensions);
    VariantClear(&vExtensions);

    VariantInit(&vClient);
    V_VT(&vClient) = VT_BOOL;
    V_BOOL(&vClient) = VARIANT_TRUE;
    hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXT_CLIENT_REQUEST"), 
       0, &vClient);
    VariantClear(&vClient);
    // Create an array of properties to return.
    saBounds.cElements = 1;
    saBounds.lLbound = 0;
    psaProperties = SafeArrayCreate(VT_BSTR, 1, &saBounds);

    // Add the Caption property to the array.
    VariantInit(&vProperty);
    V_VT(&vProperty) = VT_BSTR;
    V_BSTR(&vProperty) = _bstr_t(L"Caption");
    SafeArrayPutElement(psaProperties, &lArrayIndex, 
       V_BSTR(&vProperty));
    VariantClear(&vProperty);
    
    VariantInit(&vPropertyList);
    V_VT(&vPropertyList) = VT_ARRAY | VT_BSTR;
    V_ARRAY(&vPropertyList) = psaProperties;
    // Put the array in the named value __GET_EXT_PROPERTIES.
    hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXT_PROPERTIES"), 
        0, &vPropertyList);
    VariantClear(&vPropertyList);
    SafeArrayDestroy(psaProperties);

    // Pass the context object as the pCtx parameter of GetObject.
    hr = pServices->GetObject(bstrPath, 0, pctxDrive, &pDrive, 0);
    if( FAILED(hr) )
    { 
        pServices->Release();
        CoUninitialize();
        printf("failed property GetObject\n");
        return;
    }    
    // Display the object
    hr = pDrive->GetObjectText(0, &bstrDriveObj);
    printf("%S\n\n", bstrDriveObj);

    SysFreeString(bstrPath);

    VARIANT vFileSystem;
    // Attempt to get a property that was not requested.
    // The following should return a NULL property if
    // the partial-instance retrieval succeeded.

    hr = pDrive->Get(_bstr_t(L"FileSystem"), 0,
                       &vFileSystem, NULL, NULL);

    if( FAILED(hr) )
    { 
        pServices->Release();
        pDrive->Release();    
        CoUninitialize();
        printf("failed get for file system\n");
        return;
    }    
 
    if (V_VT(&vFileSystem) == VT_NULL)
        printf("file system variable is null - expected\n");
    else
        printf("FileSystem = %S\n", V_BSTR(&vFileSystem));
    
    VariantClear(&vFileSystem);

    pDrive->Release();    
    pctxDrive->Release();
    pServices->Release();
    pServices = NULL;    // MUST be set to NULL
    CoUninitialize();
    return;  // -- program successfully completed
};

Lorsqu’il est exécuté, l’exemple de code précédent écrit les informations suivantes. La première description de l’objet provient de la récupération complète de l’instance. La deuxième description de l’objet provient de la récupération partielle de l’instance. La dernière section indique que vous recevez une valeur null si vous demandez une propriété qui n’a pas été demandée dans l’appel GetObject d’origine.

Successfully connected to namespace

instance of Win32_LogicalDisk
{
        Caption = "C:";
        Compressed = FALSE;
        CreationClassName = "Win32_LogicalDisk";
        Description = "Local Fixed Disk";
        DeviceID = "C:";
        DriveType = 3;
        FileSystem = "NTFS";
        FreeSpace = "3085668352";
        MaximumComponentLength = 255;
        MediaType = 12;
        Name = "C:";
        Size = "4581445632";
        SupportsFileBasedCompression = TRUE;
        SystemCreationClassName = "Win32_ComputerSystem";
        SystemName = "TITUS";
        VolumeName = "titus-c";
        VolumeSerialNumber = "7CB4B90E";
};

instance of Win32_LogicalDisk
{
        Caption = "C:";
        CreationClassName = "Win32_LogicalDisk";
        Description = "Local Fixed Disk";
        DeviceID = "C:";
        DriveType = 3;
        MediaType = 12;
        Name = "C:";
        SystemCreationClassName = "Win32_ComputerSystem";
        SystemName = "MySystem";
};

La sortie suivante est générée par l’exemple précédent.

file system variable is null - expected
Press any key to continue