Bagikan melalui


Mengambil bagian dari instans WMI

Pengambilan instance parsial adalah saat WMI hanya mengambil sebagian properti dari sebuah instance. Misalnya, WMI dapat mengambil hanya 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 dengan berbagai cara. Seperti halnya mengambil instans, PowerShell akan secara default mengembalikan semua instans 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 sebagian dari instance WMI menggunakan C# (System.Management)

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

Nota

System.Management adalah namespace .NET asli yang digunakan untuk mengakses WMI; namun, API di namespace ini umumnya lebih lambat dan tidak menskalakan dengan baik dibandingkan mitra 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 sebagian instans WMI menggunakan VBScript

Anda dapat memperoleh properti individual dari sebuah 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 objekIWbemContextdengan panggilan ke CoCreateInstance.

    Objek konteks adalah objek yang digunakan WMI untuk meneruskan informasi lebih lanjut ke penyedia WMI. Dalam hal ini, Anda menggunakan objekIWbemContext 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 objekIWbemContext.

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

    Nilai yang dinamai 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 digunakan.
    __GET_EXT_PROPERTIES
    SAFEARRAY kumpulan string yang mencantumkan properti yang akan diperoleh. 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 pemanggil 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 pCtx parameter.

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

Jika penyedia tidak dapat memproses 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 instance yang sepenuhnya lengkap. 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