Mengambil bagian dari instans WMI

Pengambilan instans parsial adalah ketika WMI hanya mengambil subset properti instans. Misalnya, WMI hanya dapat mengambil properti Nama dan Kunci . Penggunaan pengambilan instans parsial yang paling umum adalah pada enumerasi besar yang memiliki beberapa properti.

Mengambil bagian dari instans WMI menggunakan PowerShell

Anda dapat mengambil properti individual instans dengan menggunakan Get-WmiObject; properti itu sendiri dapat diambil dan ditampilkan sejumlah cara. Seperti halnya mengambil instans, PowerShell secara default akan mengembalikan semua instans dari kelas tertentu; Anda harus menentukan nilai tertentu jika Anda hanya ingin mengambil satu instans.

Contoh kode berikut menampilkan nomor seri volume untuk instans kelas 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

Mengambil bagian dari instans WMI menggunakan C# (System.Management)

Anda dapat mengambil properti individual instans dengan membuat ManagementObject baru menggunakan detail instans tertentu. Anda kemudian dapat secara implisit mengambil satu atau beberapa properti instans dengan metode GetPropertyValue .

Catatan

System.Management adalah namespace .NET asli yang digunakan untuk mengakses WMI; namun, API di namespace ini umumnya lebih lambat dan tidak menskalakan juga relatif terhadap rekan-rekan Microsoft.Management.Infrastructure yang lebih modern.

Contoh kode berikut menampilkan nomor seri volume untuk instans kelas Win32_LogicalDisk .

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

Mengambil bagian dari instans WMI menggunakan VBScript

Anda dapat mengambil properti individual instans dengan menggunakan GetObject.

Contoh kode berikut menampilkan nomor seri volume untuk instans kelas Win32_LogicalDisk .

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

Mengambil bagian dari instans WMI menggunakan C++

Prosedur berikut digunakan untuk meminta pengambilan instans parsial menggunakan C++.

Untuk meminta pengambilan instans parsial menggunakan C++

  1. Buat objek IWbemContext dengan panggilan ke CoCreateInstance.

    Objek konteks adalah objek yang digunakan WMI untuk meneruskan informasi lebih lanjut ke penyedia WMI. Dalam hal ini, Anda menggunakan objek IWbemContext untuk menginstruksikan penyedia untuk memproses pengambilan instans parsial.

  2. Tambahkan __GET_EXTENSIONS, __GET_EXT_CLIENT_REQUEST, dan nilai bernama lainnya yang menjelaskan properti yang ingin Anda ambil ke objek IWbemContext .

    Tabel berikut ini mencantumkan nilai bernama berbeda yang digunakan dalam panggilan pengambilan Anda.

    Nilai bernama Deskripsi
    __GET_EXTENSIONS
    VT_BOOL diatur ke VARIANT_TRUE. Digunakan untuk memberi sinyal bahwa operasi pengambilan instans parsial sedang digunakan. Ini memungkinkan pemeriksaan tunggal yang cepat tanpa harus menghitung seluruh objek konteks. Jika salah satu nilai lain digunakan, nilai ini harus.
    __GET_EXT_PROPERTIES
    SAFEARRAY string yang mencantumkan properti yang akan diambil. Tidak dapat ditentukan secara bersamaan dengan __GET_EXT_KEYS_ONLY.
    Tanda bintang "*" adalah nama properti yang tidak valid untuk __GET_EXT_PROPERTIES.
    __GET_EXT_KEYS_ONLY
    VT_BOOL diatur ke VARIANT_TRUE. Menunjukkan bahwa hanya kunci yang harus disediakan di objek yang dikembalikan. Tidak dapat ditentukan secara bersamaan dengan __GET_EXT_PROPERTIES. Sebaliknya, lebih diutamakan daripada __GET_EXT_PROPERTIES.
    __GET_EXT_CLIENT_REQUEST
    VT_BOOL diatur ke VARIANT_TRUE. Menunjukkan bahwa penelepon adalah orang yang menulis nilai ke dalam objek konteks dan tidak disebarluaskan dari operasi dependen lain.
  3. Teruskan objek konteks IWbemContext ke dalam panggilan apa pun ke IWbemServices::GetObject, IWbemServices::GetObjectAsync, IWbemServices::CreateInstanceEnum, atau IWbemServices::CreateInstanceEnumAsync melalui parameter pCtx .

    Meneruskan objek IWbemContext menginstruksikan penyedia untuk mengizinkan pengambilan instans parsial. Dalam pengambilan instans penuh, Anda akan mengatur pCtx ke nilai null . Jika penyedia tidak mendukung pengambilan instans parsial, Anda akan menerima pesan kesalahan.

Jika penyedia tidak dapat mematuhi operasi instans parsial, penyedia melanjutkan seolah-olah Anda tidak memasukkan objek konteks, atau mengembalikan WBEM_E_UNSUPPORTED_PARAMETER.

Contoh berikut menjelaskan cara melakukan pengambilan instans lengkap Win32_LogicalDisk, lalu melakukan pengambilan instans parsial dari properti 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
};

Saat dijalankan, contoh kode sebelumnya menulis informasi berikut. Deskripsi objek pertama berasal dari pengambilan instans penuh. Deskripsi objek kedua berasal dari pengambilan instans parsial. Bagian terakhir menunjukkan bahwa Anda menerima nilai null jika Anda meminta properti yang tidak diminta dalam panggilan GetObject asli.

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

Output berikut dihasilkan oleh contoh sebelumnya.

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