Contoh: Mendapatkan Data WMI dari Komputer Lokal
Anda dapat menggunakan prosedur dan contoh kode dalam topik ini untuk membuat aplikasi klien WMI lengkap yang melakukan inisialisasi COM, terhubung ke WMI di komputer lokal, mengambil data secara semisinkron, lalu membersihkannya. Contoh ini mendapatkan nama sistem operasi di komputer lokal dan menampilkannya. Untuk mengambil data dari komputer jarak jauh, lihat Contoh: Mendapatkan Data WMI dari Komputer Jarak Jauh. Untuk mendapatkan data secara asinkron, lihat Contoh: Mendapatkan Data WMI dari Komputer Lokal Secara Asinkron.
Prosedur berikut digunakan untuk menjalankan aplikasi WMI. Langkah 1 hingga 5 berisi semua langkah yang diperlukan untuk menyiapkan dan menyambungkan ke WMI, dan langkah 6 dan 7 adalah tempat data dikueri dan diterima.
Menginisialisasi parameter COM dengan panggilan ke CoInitializeEx.
Untuk informasi selengkapnya, lihat Menginisialisasi COM untuk Aplikasi WMI.
Inisialisasi keamanan proses COM dengan memanggil CoInitializeSecurity.
Untuk informasi selengkapnya, lihat Mengatur Tingkat Keamanan Proses Default Menggunakan C++.
Dapatkan pencari lokasi awal ke WMI dengan memanggil CoCreateInstance.
Untuk informasi selengkapnya, lihat Membuat Koneksi ke Namespace WMI.
Dapatkan pointer ke IWbemServices untuk namespace root\cimv2 di komputer lokal dengan memanggil IWbemLocator::ConnectServer. Untuk menyambungkan ke komputer jarak jauh, lihat Contoh: Mendapatkan Data WMI dari Komputer Jarak Jauh.
Untuk informasi selengkapnya, lihat Membuat Koneksi ke Namespace WMI.
Atur keamanan proksi IWbemServices sehingga layanan WMI dapat meniru klien dengan memanggil CoSetProxyBlanket.
Untuk informasi selengkapnya, lihat Mengatur Tingkat Keamanan pada Koneksi WMI.
Gunakan pointer IWbemServices untuk membuat permintaan WMI. Contoh ini menjalankan kueri untuk nama sistem operasi dengan memanggil IWbemServices::ExecQuery.
Kueri WQL berikut adalah salah satu argumen metode.
SELECT * FROM Win32_OperatingSystem
Hasil kueri ini disimpan dalam penunjuk IEnumWbemClassObject . Ini memungkinkan objek data dari kueri diambil secara semisinkron dengan antarmuka IEnumWbemClassObject . Untuk informasi selengkapnya, lihat Menghitung WMI. Untuk mendapatkan data secara asinkron, lihat Contoh: Mendapatkan Data WMI dari Komputer Lokal Secara Asinkron.
Untuk informasi selengkapnya tentang membuat permintaan ke WMI, lihat Memanipulasi Informasi Kelas dan Instans, Mengkueri WMI, dan Memanggil Metode.
Dapatkan dan tampilkan data dari kueri WQL. Penunjuk IEnumWbemClassObject ditautkan ke objek data yang dikembalikan kueri, dan objek data dapat diambil dengan metode IEnumWbemClassObject::Next. Metode ini menautkan objek data ke pointer IWbemClassObject yang diteruskan ke metode . Gunakan metode IWbemClassObject::Get untuk mendapatkan informasi yang diinginkan dari objek data.
Contoh kode berikut digunakan untuk mendapatkan properti Nama dari objek data, yang menyediakan nama sistem operasi.
VARIANT vtProp; VariantInit(&vtProp); // Get the value of the Name property hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
Setelah nilai properti Nama disimpan dalam variabel VARIAN vtProp, properti tersebut kemudian dapat ditampilkan kepada pengguna.
Untuk informasi selengkapnya, lihat Menghitung WMI.
Contoh kode berikut mengambil data WMI secara semisinkron dari komputer lokal.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
int main(int argc, char **argv)
{
HRESULT hres;
// Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI -------------------------
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object."
<< " Err code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
// Step 4: -----------------------------------------------------
// Connect to WMI through the IWbemLocator::ConnectServer method
IWbemServices *pSvc = NULL;
// Connect to the root\cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (for example, Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
{
cout << "Could not connect. Error code = 0x"
<< hex << hres << endl;
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
// Step 5: --------------------------------------------------
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
{
cout << "Could not set proxy blanket. Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
// Step 6: --------------------------------------------------
// Use the IWbemServices pointer to make requests of WMI ----
// For example, get the name of the operating system
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_OperatingSystem"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for operating system name failed."
<< " Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
// Step 7: -------------------------------------------------
// Get the data from the query in step 6 -------------------
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
VARIANT vtProp;
VariantInit(&vtProp);
// Get the value of the Name property
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
wcout << " OS Name : " << vtProp.bstrVal << endl;
VariantClear(&vtProp);
pclsObj->Release();
}
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
return 0; // Program successfully completed.
}