Delen via


Een deel van een WMI-exemplaar ophalen

Wanneer WMI slechts een subset van de eigenschappen van een instantie ophaalt, spreken we van een gedeeltelijke ophaalbewerking. WMI kan bijvoorbeeld alleen de eigenschappen Name en Key ophalen. Het meest voorkomende gebruik van het ophalen van gedeeltelijke exemplaren is op grote inventarisaties met meerdere eigenschappen.

Een deel van een WMI-exemplaar ophalen met behulp van PowerShell

U kunt een afzonderlijke eigenschap van een exemplaar ophalen met behulp van Get-WmiObjecten de eigenschap zelf kan op verschillende manieren worden opgehaald en weergegeven. Net als bij het ophalen van een exemplaar retourneert PowerShell standaard alle exemplaren van een bepaalde klasse; u moet een specifieke waarde opgeven als u slechts één exemplaar wilt ophalen.

In het volgende codevoorbeeld wordt het serienummer van het volume weergegeven voor een exemplaar van de Win32_LogicalDisk-klasse.

(Get-WmiObject -class Win32_logicalDisk).DeviceID

#or

Get-WmiObject -class Win32_LogicalDisk | format-list DeviceID

#or

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

Een deel van een WMI-exemplaar ophalen met C# (System.Management)

U kunt een afzonderlijke eigenschap van een exemplaar ophalen door een nieuw ManagementObject te maken met behulp van de details van een specifiek exemplaar. U kunt vervolgens impliciet een of meer eigenschappen van het exemplaar ophalen met de methode GetPropertyValue.

Notitie

System.Management was de oorspronkelijke .NET-naamruimte die wordt gebruikt voor toegang tot WMI; De API's in deze naamruimte zijn over het algemeen echter langzamer en worden niet zo goed geschaald ten opzichte van hun modernere Microsoft.Management.Infrastructure tegenhangers.

In het volgende codevoorbeeld wordt het serienummer van het volume weergegeven voor een exemplaar van de Win32_LogicalDisk-klasse.

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

Een deel van een WMI-exemplaar ophalen met behulp van VBScript

U kunt een afzonderlijke eigenschap van een exemplaar ophalen met behulp van GetObject-.

In het volgende codevoorbeeld wordt het serienummer van het volume weergegeven voor een exemplaar van de Win32_LogicalDisk-klasse.

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

Een deel van een WMI-exemplaar ophalen met C++

De volgende procedure wordt gebruikt om een gedeeltelijke instantie-ophaalbewerking aan te vragen met C++.

Een gedeeltelijke ophaalbewerking aanvragen met behulp van C++

  1. Maak een IWbemContext-object met een aanroep naar CoCreateInstance.

    Een contextobject is een object dat WMI gebruikt om meer informatie door te geven aan een WMI-provider. In dit geval gebruikt u het object IWbemContext om de provider te instrueren een gedeeltelijke ophaalbewerking te verwerken.

  2. Voeg __GET_EXTENSIONS, __GET_EXT_CLIENT_REQUEST en eventuele andere benoemde waarden toe die de eigenschappen beschrijven die u wilt ophalen naar het object IWbemContext.

    De volgende tabel bevat de verschillende benoemde waarden die worden gebruikt in uw ophaalaanroep.

    Benoemde waarde Beschrijving
    __GET_EXTENSIONS
    VT_BOOL ingesteld op VARIANT_TRUE. Wordt gebruikt om aan te geven dat bewerkingen voor het ophalen van gedeeltelijke exemplaren worden gebruikt. Hierdoor kunt u snel één controle uitvoeren zonder dat u het hele contextobject hoeft op te sommen. Als een van de andere waarden wordt gebruikt, moet dit zijn.
    __GET_EXT_PROPERTIES
    SAFEARRAY- tekenreeksen met de eigenschappen die moeten worden opgehaald. Kan niet tegelijkertijd worden opgegeven met __GET_EXT_KEYS_ONLY.
    Een sterretje *is een ongeldige eigenschapsnaam voor __GET_EXT_PROPERTIES.
    __GET_EXT_KEYS_ONLY
    VT_BOOL ingesteld op VARIANT_TRUE. Geeft aan dat alleen sleutels moeten worden opgegeven in het geretourneerde object. Kan niet tegelijkertijd worden opgegeven met __GET_EXT_PROPERTIES. In plaats daarvan heeft voorrang op __GET_EXT_PROPERTIES.
    __GET_EXT_CLIENT_REQUEST
    VT_BOOL ingesteld op VARIANT_TRUE. Geeft aan dat de aanroeper de waarde in het contextobject heeft geschreven en dat deze niet is doorgegeven vanuit een andere afhankelijke bewerking.
  3. Geef het contextobject IWbemContext door in een van de aanroepen van IWbemServices::GetObject, IWbemServices::GetObjectAsync, IWbemServices::CreateInstanceEnumof IWbemServices::CreateInstanceEnumAsync via de parameter pCtx.

    Het doorgeven van het IWbemContext-object instrueert de provider om gedeeltelijke objecten op te halen. Bij het ophalen van een volledige instantie stelt u pCtx in op een null-waarde. Als de provider het ophalen van gedeeltelijke exemplaren niet ondersteunt, wordt er een foutbericht weergegeven.

Als de provider niet kan voldoen aan de gedeeltelijk-exemplaar-bewerking, gaat de provider verder alsof u het contextobject niet hebt ingevoerd, of retourneert hij WBEM_E_UNSUPPORTED_PARAMETER.

In het volgende voorbeeld wordt beschreven hoe u een volledig exemplaar kunt ophalen van Win32_LogicalDisken vervolgens een gedeeltelijk exemplaar kunt ophalen van de eigenschap 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
};

Wanneer dit wordt uitgevoerd, schrijft het vorige codevoorbeeld de volgende informatie. De eerste objectbeschrijving is afkomstig van het ophalen van het volledige exemplaar. De tweede objectbeschrijving is afkomstig van het ophalen van gedeeltelijke instances. In de laatste sectie ziet u dat u een null--waarde ontvangt als u een eigenschap aanvraagt die niet is aangevraagd in de oorspronkelijke GetObject-aanroep.

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";
};

De volgende uitvoer wordt gegenereerd door het vorige voorbeeld.

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