Contoh: Membuat Aplikasi WMI
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, membaca beberapa data, dan membersihkan. Menyambungkan ke WMI pada Komputer Jarak Jauh menjelaskan cara mendapatkan data dari komputer jarak jauh.
Prosedur berikut ini mencakup semua langkah yang diperlukan oleh semua aplikasi C++ WMI.
Menginisialisasi parameter COM dengan panggilan ke CoInitializeEx.
Untuk informasi selengkapnya, lihat Menginisialisasi COM untuk Aplikasi WMI.
Menginisialisasi keamanan proses COM dengan memanggil CoInitializeSecurity.
Untuk informasi selengkapnya, lihat Mengatur Tingkat Keamanan Proses Default Menggunakan C++.
Dapatkan pointer ke IWbemServices untuk namespace pada komputer host tertentu—komputer lokal dalam kasus sederhana—dengan memanggil IWbemLocator::ConnectServer.
Untuk menyambungkan ke komputer jarak jauh, misalnya Computer_A, gunakan parameter jalur objek berikut:
_bstr_t(L"\\COMPUTER_A\ROOT\\CIMV2")
Untuk informasi selengkapnya, lihat Membuat Koneksi ke Namespace Layanan 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 penunjuk IWbemServices untuk membuat permintaan WMI. Misalnya, mengkueri semua instans Win32_Service untuk menentukan layanan mana yang dihentikan.
Untuk informasi selengkapnya, lihat Memanipulasi Informasi Kelas dan Instans, Mengkueri WMI, dan Menerima Peristiwa WMI.
Bersihkan objek dan COM.
Untuk informasi selengkapnya, lihat Membersihkan dan Mematikan Aplikasi WMI.
Contoh kode berikut adalah aplikasi klien WMI lengkap.
#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;
// 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.
}
// Initialize
hres = CoInitializeSecurity(
NULL,
-1, // COM negotiates service
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // 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.
}
// Obtain the initial locator to Windows Management
// on a particular host computer.
IWbemLocator *pLoc = 0;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object. "
<< "Error code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
IWbemServices *pSvc = 0;
// 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"), // WMI namespace
NULL, // User name
NULL, // User password
0, // Locale
NULL, // Security flags
0, // Authority
0, // Context object
&pSvc // 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;
// Set the IWbemServices proxy so that impersonation
// of the user (client) occurs.
hres = CoSetProxyBlanket(
pSvc, // the proxy to set
RPC_C_AUTHN_WINNT, // authentication service
RPC_C_AUTHZ_NONE, // authorization service
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
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.
}
// Use the IWbemServices pointer to make requests of WMI.
// Make requests here:
// For example, query for all the running processes
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_Process"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for processes failed. "
<< "Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
else
{
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while (pEnumerator)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
VARIANT vtProp;
// Get the value of the Name property
hres = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
wcout << "Process Name : " << vtProp.bstrVal << endl;
VariantClear(&vtProp);
pclsObj->Release();
pclsObj = NULL;
}
}
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
return 0; // Program successfully completed.
}