Bagikan melalui


Mewakili Objek dalam XML

Komponen penyandi XML di WMI menghasilkan representasi XML objek.

Di C++, Anda dapat memulai encoder XML dengan panggilan ke metode IWbemObjectTextSrc.GetText, menentukan objek yang akan diwakili dalam XML dan format teks untuk digunakan dalam representasi. Untuk informasi selengkapnya dan contoh kode, lihat Untuk mengodekan objek di XML menggunakan C/C++.

Di VBScript atau Visual Basic, untuk mengodekan data untuk instans XML, panggil SWbemObjectEx.GetText. Untuk informasi selengkapnya dan contoh kode, lihat Untuk mengodekan objek di XML menggunakan VBScript.

Bagian berikut dibahas dalam topik ini:

Mengodekan Objek Menggunakan C atau C++

Prosedur berikut menjelaskan cara mengodekan objek di XML menggunakan C atau C++.

Untuk mengodekan objek di XML menggunakan C atau C++

  1. Siapkan program Anda untuk mengakses data WMI.

    Karena WMI didasarkan pada teknologi COM, Anda harus melakukan panggilan yang diperlukan ke fungsi CoInitializeEx dan CoInitializeSecurity untuk mengakses WMI. Untuk informasi selengkapnya, lihat Menginisialisasi COM untuk aplikasi WMI.

  2. Secara opsional, buat objek IWbemContext dan inisialisasi.

    Anda tidak perlu membuat objek IWbemContext kecuali Anda perlu mengubah operasi default. Objek konteks digunakan oleh encoder XML untuk mengontrol jumlah informasi yang disertakan dalam representasi XML objek.

    Tabel berikut mencantumkan nilai opsional yang dapat ditentukan untuk objek konteks.

    Nilai/jenis Arti
    VT_BOOL "HanyaLokal" Ketika TRUE, hanya properti dan metode yang ditentukan secara lokal di kelas yang ada dalam XML yang dihasilkan. Nilai defaultnya adalah FALSE.
    VT_BOOL "TermasukKualifikasi" Ketika TRUE, kelas, instans, properti, dan kualifikasi metode disertakan dalam XML yang dihasilkan. Nilai defaultnya adalah FALSE.
    "ExcludeSystemProperties" VT_BOOL Ketika TRUE, properti sistem WMI dikeluarkan dari hasil keluaran. Nilai defaultnya adalah FALSE.
    VT_I4 "PathLevel"
    0 = Elemen <CLASS> atau <INSTANCE> dihasilkan.
    1 = NILAI <. Elemen> NAMEDOBJECT dihasilkan.
    2 = NILAI <. Elemen> OBJECTWITHLOCALPATH dihasilkan.
    3 = NILAI <. OBJECTWITHPATH> dihasilkan.
    Defaultnya adalah 0 (nol).

    Contoh kode berikut menunjukkan bagaimana objek konteks diinisialisasi untuk menyertakan kualifikasi dan mengecualikan properti sistem.

    VARIANT vValue;
    IWbemContext *pContext = NULL;
    HRESULT hr = CoCreateInstance (CLSID_WbemContext, 
                           NULL, 
                           CLSCTX_INPROC_SERVER,
                           IID_IWbemContext, 
                           (void**) &pContext);
    if (FAILED(hr))
    {
      printf("Create context failed with %x\n", hr);
      return hr;
    }
    
    // Generate a <VALUE.OBJECTWITHLOCALPATH> element
    VariantInit(&vValue);
    vValue.vt = VT_I4;
    vValue.lVal = 2;
    pContext->SetValue(L"PathLevel", 0, &vValue);
    VariantClear(&vValue);
    
    // Include qualifiers
    VariantInit(&vValue);
    vValue.vt = VT_BOOL;
    vValue.boolVal = VARIANT_TRUE;
    pContext->SetValue(L"IncludeQualifiers", 0, &vValue);
    VariantClear(&vValue);
    
    // Exclude system properties
    VariantInit(&vValue);
    vValue.vt = VT_BOOL;
    vValue.boolVal = VARIANT_TRUE;
    pContext->SetValue(L"ExcludeSystemProperties", 0, &vValue);
    VariantClear(&vValue);
    
  3. Dapatkan referensi ke kelas atau instans untuk dikodekan di XML.

    Setelah Anda menginisialisasi COM dan tersambung ke WMI, panggil GetObject untuk mengambil referensi ke kelas atau instans yang ditentukan. Jika Anda menggunakan BSTR untuk menentukan kelas atau instans, panggil SysFreeString untuk membebaskan memori yang dialokasikan oleh SysAllocString.

    Contoh kode berikut mengambil referensi ke instans Win32_LogicalDisk.

    HRESULT hr = NULL;
    IWbemClassObject *pClass = NULL;
    BSTR strObj = SysAllocString(L"Win32_LogicalDisk");
    
    hr = pConnection->GetObject(strObj, 
                                0, 
                                NULL, 
                                &pClass, 
                                NULL);
    
    SysFreeString(strObj);
    if (FAILED(hr))
    {
      printf("GetObject failed with %x\n",hr)
      return hr;
    }
    
  4. Buat objekIWbemObjectTextSrc.

    Setelah Anda memiliki referensi ke objek, Anda harus membuat objek IWbemObjectTextSrc dengan panggilan ke CoCreateInstance. Objek IWbemObjectTextSrc digunakan untuk menghasilkan teks XML yang sebenarnya.

    Contoh kode berikut menunjukkan cara membuat objekIWbemObjectTextSrcdengan memanggil CoCreateInstance.

    HRESULT hr = NULL;
    IWbemObjectTextSrc *pSrc = NULL;
    
    hr = CoCreateInstance (CLSID_WbemObjectTextSrc, 
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           IID_IWbemObjectTextSrc, 
                           (void**) &pSrc);
    
    if (FAILED(hr))
    {
        printf("CoCreateInstance of IWbemObjectTextSrc failed %x\n",hr);
        return hr;
    }
    
  5. Panggil metodeIWbemObjectTextSrc.GetTextuntuk mendapatkan representasi XML objek.

    Setelah mengatur konteks untuk representasi objek, mendapatkan referensi ke objek, dan membuat objek IWbemObjectTextSrc, Anda siap untuk menghasilkan representasi XML dari objek yang ditentukan dengan memanggil metode IWbemObjectTextSrc.GetText.

    Kode contoh C++ berikut menghasilkan representasi XML dari objek yang direferensikan oleh pClass. Representasi XML dikembalikan dalam strText. Parameter ketigaGetTextmenentukan format teks yang akan digunakan untuk XML dan harus WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) atau WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Untuk informasi selengkapnya tentang nilai-nilai ini, lihat IWbemObjectTextSrc::GetText Parameter Values.

    HRESULT hr = NULL;
    BSTR strText = NULL;
    hr = pSrc->GetText(0, 
                       pClass, 
                       WMI_OBJ_TEXT_CIM_DTD_2_0,
                       pContext, 
                       &strText);
    
    // Perform a task with strText
    SysFreeString(strText);
    
    if (FAILED(hr))
    {
      printf("GetText failed with %x\n", hr);
      return hr;
    }
    

Kode contoh C++ berikut mencakup semua langkah dalam prosedur sebelumnya dan mengodekan kelas Win32_LogicalDisk di XML termasuk kualifikasi kelas, properti, dan metode dan tidak termasuk properti sistem.

// The following #define statement is needed so that 
// the proper values are loaded by the #include files.
#define _WIN32_WINNT 0x0500

#include <stdio.h>
#include <wbemcli.h>
#pragma comment(lib, "wbemuuid.lib")

// Initialize the context object
// ---------------------------------------------
void FillUpContext(IWbemContext *pContext)
{
  VARIANT vValue;

  // IncludeQualifiers
  VariantInit(&vValue);
  vValue.vt = VT_BOOL;
  vValue.boolVal = VARIANT_FALSE;
  pContext->SetValue(L"IncludeQualifiers", 0, &vValue);
  VariantClear(&vValue);

  VariantInit(&vValue);
  vValue.vt = VT_I4;
  vValue.lVal = 0;
  pContext->SetValue(L"PathLevel", 0, &vValue);
  VariantClear(&vValue);

  // ExcludeSystemProperties
  VariantInit(&vValue);
  vValue.vt = VT_BOOL;
  vValue.boolVal = VARIANT_TRUE;
  pContext->SetValue(L"ExcludeSystemProperties", 0, &vValue);
  VariantClear(&vValue);
}

// Main method ... drives the program
// ---------------------------------------------
int _cdecl main(int argc, char * argv[])
{
  BSTR strNs = NULL;
  BSTR strObj = NULL;
  BSTR strText = NULL;

  if(FAILED(CoInitialize(NULL)))
    return 1;
  HRESULT hr = E_FAIL;
  IWbemObjectTextSrc *pSrc = NULL;

  IWbemLocator *pL = NULL;
  if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemLocator, 
                                      NULL, 
                                      CLSCTX_INPROC_SERVER,
                                      IID_IWbemLocator, 
                                      (void**) &pL)))
  {
    // Create a context object
    IWbemContext *pContext = NULL;
    if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemContext, 
                                        NULL, 
                                        CLSCTX_INPROC_SERVER,
                                        IID_IWbemContext, 
                                        (void**) &pContext)))
    {
      FillUpContext(pContext);
      IWbemServices *pConnection = NULL;
      strNs = SysAllocString(L"root\\cimv2");
      strText = NULL;
      if(SUCCEEDED(hr = pL->ConnectServer(strNs, 
                                          NULL, 
                                          NULL, 
                                          NULL, 
                                          0, 
                                          NULL, 
                                          NULL, 
                                          &pConnection)))
      {
        IWbemClassObject *pClass = NULL;
        strObj = SysAllocString(L"Win32_LogicalDisk");

        if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemObjectTextSrc, 
                                            NULL,
                                            CLSCTX_INPROC_SERVER,
                                            IID_IWbemObjectTextSrc, 
                                            (void**) &pSrc)))
        {
          // Test for GetObject
          if(SUCCEEDED(hr = pConnection->GetObject(strObj, 
                                                   0, 
                                                   NULL, 
                                                   &pClass, 
                                                   NULL)))
          {
            if(SUCCEEDED(hr = pSrc->GetText(0, 
                                            pClass, 
                                            WMI_OBJ_TEXT_CIM_DTD_2_0,
                                            pContext, 
                                            &strText)))
            {
              printf("GETOBJECT SUCCEEDED\n");
              printf("==========================================\n");
              wprintf(strText);
              pContext->Release();
              pClass->Release();
            }
            else
            {
              printf("GetText failed with %x\n", hr);
              // Free up the object
              pContext->Release();
              pClass->Release();
            }
          }
          else
            printf("GetObject failed with %x\n", hr);
        }
        else
          printf("CoCreateInstance on WbemObjectTextSrc failed with %x\n", hr);
      }
      else
        printf("ConnectServer on root\\cimv2 failed with %x\n", hr);
    }
    else
      printf("CoCreateInstance on Context failed with %x\n", hr);
  }
  else
    printf("CoCreateInstance on Locator failed with %x\n", hr);

// Clean up memory
  if (strNs != NULL)
    SysFreeString(strNs);
  if (strObj != NULL)
    SysFreeString(strObj);
  if (strText != NULL)
    SysFreeString(strText);
  if (pSrc != NULL)
    pSrc->Release();
  if (pL != NULL)
    pL->Release();
  return 0;
}

Mengodekan Objek Menggunakan VBScript

Prosedur berikut menjelaskan cara mengodekan objek di XML menggunakan VBScript.

Untuk mengodekan objek di XML menggunakan VBScript

  1. Secara opsional, buat objek SWbemNamedValueSet dan inisialisasi sehingga dapat mengatur nilai konteks yang diperlukan untuk representasi XML.

    Contoh kode berikut menunjukkan bagaimana nilai tersebut memerintahkan encoder XML untuk menghasilkan elemen <VALUE.OBJECTWITHLOCALPATH>, termasuk semua kualifikasi dan mengecualikan properti sistem ketika encoder menyusun representasi XML dari objek.

    ' Create an optional SWbemNamedValueSet object
    set context = CreateObject("wbemscripting.SWbemNamedValueSet")
    
    ' Initialize the value set object to set the context
    ' Generate a <VALUE.OBJECTWITHLOCALPATH> element
    context.add "PathLevel", 2 
    context.add "IncludeQualifiers", true 
    context.add "ExcludeSystemProperties", true '
    
  2. Ambil instans objek atau kelas untuk diwakili dalam XML.

    Contoh kode berikut mengambil sebuah instans dari objek.

    ' Retrieve the object/class to be represented in XML
    set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
    
  3. Panggil metode GetText_ instans yang dibuat pada langkah sebelumnya, menggunakan 1 sebagai parameter untuk menentukan format teks yang sesuai dengan CIM DTD versi 2.0, atau 2 untuk menentukan format teks yang sesuai dengan WMI DTD versi 2.0. Jika Anda membuat objek SWbemNamedValueSet di Langkah 1, sertakan dalam daftar parameter sebagai parameter ketiga.

    Contoh kode berikut menunjukkan cara memanggil metode GetText_ instans.

    ' Get the XML representation of the object
    strText = myObj.GetText_(2,,context)
    
    ' If you have not used a SWbemNamedValueSet object
    ' enter the following line.
    strText = myObj.GetText_(2)
    
  4. Secara opsional, validasi bahwa XML yang dihasilkan di Langkah 3 adalah XML yang terbentuk dengan baik, dengan membuat dan menginisialisasi objek Xml Document Object Model (DOM) lalu memuat teks XML ke dalamnya.

    Contoh kode berikut menunjukkan cara membuat dan menginisialisasi objek XML DOM dan memuat teks XML ke dalamnya.

    ' Create an XMLDOM object
    set xml = CreateObject("Microsoft.xmldom")
    
    ' Initialize the XMLDOM object so results are returned synchronously
    xml.async = false
    
    ' Load the XML into the XMLDOM object
    xml.loadxml strText
    
  5. Keluarkan representasi XML objek.

    Contoh kode berikut menunjukkan cara menggunakan wscript untuk menghasilkan XML.

    wscript.echo strText
    

    Jika Anda memilih untuk menggunakan XML DOM untuk memverifikasi bahwa XML yang dihasilkan terbentuk dengan baik, ganti baris sebelumnya dengan yang berikut ini.

    wscript.echo xml.xml
    

Contoh kode VBScript berikut mencakup semua langkah dalam prosedur sebelumnya dan mengodekan kelas Win32_LogicalDisk di XML, termasuk kualifikasi kelas, properti, dan metode dan tidak termasuk properti sistem.

' Create optional SWbemNamedValueSet object
set context = CreateObject("Wbemscripting.SWbemNamedValueSet")

' Initialize the context object
context.add "PathLevel", 2
context.add "IncludeQualifiers", true
context.add "ExcludeSystemProperties", true

' Retrieve the object/class to be represented in XML
set myObj = GetObject("winmgmts:\\.\root\cimv2:Win32_LogicalDisk")

' Get the XML representation of the object
strText = myObj.GetText_(2,,context)
' If you have not used a SWbemNamedValueSet object 
'   use the following line
'   strText = myObj.GetText(2)

' Print the XML representation
wscript.echo strText

' If you choose to use the XML DOM to verify 
'   that the XML generated is well-formed, replace the last
'   line in the above code example with the following lines:

' Create an XMLDOM object
set xml = CreateObject("Microsoft.xmldom")

' Initialize the XMLDOM object so results are 
'   returned synchronously
xml.async = false

' Load the XML into the XMLDOM object
xml.loadxml strText

' Print the XML representation
wscript.echo xml.xml

Menggunakan WMI