Voorbeeld: WMI-gegevens ophalen van de lokale computer
U kunt de procedure en codevoorbeelden in dit onderwerp gebruiken om een volledige WMI-clienttoepassing te maken die COM-initialisatie uitvoert, verbinding maakt met WMI op de lokale computer, gegevens semisynchroon ophaalt en vervolgens opschoont. In dit voorbeeld wordt de naam van het besturingssysteem op de lokale computer op de lokale computer weergegeven. Zie voorbeeld: WMI-gegevens ophalen van een externe computerom gegevens op te halen van een externe computer. Zie voorbeeld: WMI-gegevens ophalen van de lokale computer asynchroonvoor informatie over het asynchroon ophalen van de gegevens.
De volgende procedure wordt gebruikt om de WMI-toepassing uit te voeren. Stap 1 tot en met 5 bevat alle stappen die nodig zijn om WMI in te stellen en er verbinding mee te maken, en stap 6 en 7 zijn waar gegevens worden opgevraagd en ontvangen.
Initialiseer COM-parameters met een aanroep naar CoInitializeEx.
Zie COM initialiseren voor een WMI-toepassingvoor meer informatie.
Initialiseer com-procesbeveiliging door CoInitializeSecurityaan te roepen.
Zie Het standaardniveau voor procesbeveiliging instellen met C++voor meer informatie.
Haal de eerste locator naar WMI op door CoCreateInstance-aan te roepen.
Zie Een verbinding maken met een WMI-naamruimtevoor meer informatie.
Vraag een aanwijzer naar IWbemServices- voor de root\cimv2-naamruimte op de lokale computer door IWbemLocator::ConnectServeraan te roepen. Zie voorbeeld: WMI-gegevens ophalen van een externe computerom verbinding te maken met een externe computer.
Zie Een verbinding maken met een WMI-naamruimtevoor meer informatie.
Stel IWbemServices proxybeveiliging in, zodat de WMI-service de client kan imiteren door CoSetProxyBlanket-aan te roepen.
Zie Beveiligingsniveaus instellen voor een WMI-verbindingvoor meer informatie.
Gebruik de IWbemServices aanwijzer om aanvragen van WMI te doen. In dit voorbeeld wordt een query uitgevoerd voor de naam van het besturingssysteem door IWbemServices::ExecQueryaan te roepen.
De volgende WQL-query is een van de methodeargumenten.
SELECT * FROM Win32_OperatingSystem
Het resultaat van deze query wordt opgeslagen in een IEnumWbemClassObject aanwijzer. Hierdoor kunnen de gegevensobjecten van de query semisynchroon worden opgehaald met de interface IEnumWbemClassObject. Zie WMI-opsommen voor meer informatie. Zie voorbeeld: WMI-gegevens ophalen van de lokale computer asynchroonvoor informatie over het asynchroon ophalen van de gegevens.
Zie Manipulating Class and Instance Information, Query's uitvoeren op WMI-en Een methode aanroepenvoor meer informatie over het indienen van aanvragen bij WMI.
Haal de gegevens op uit de WQL-query en geef deze weer. De IEnumWbemClassObject aanwijzer is gekoppeld aan de gegevensobjecten die de query heeft geretourneerd en de gegevensobjecten kunnen worden opgehaald met de methode IEnumWbemClassObject::Next. Met deze methode worden de gegevensobjecten gekoppeld aan een IWbemClassObject aanwijzer die wordt doorgegeven aan de methode. Gebruik de methode IWbemClassObject::Get om de gewenste informatie op te halen uit de gegevensobjecten.
Het volgende codevoorbeeld wordt gebruikt om de eigenschap Name op te halen uit het gegevensobject, dat de naam van het besturingssysteem bevat.
VARIANT vtProp; VariantInit(&vtProp); // Get the value of the Name property hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
Nadat de waarde van de eigenschap Name is opgeslagen in de VARIANT variabele vtProp, kan deze vervolgens worden weergegeven aan de gebruiker.
Zie WMI-opsommen voor meer informatie.
In het volgende codevoorbeeld worden WMI-gegevens semisynchroon opgehaald van een lokale computer.
#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.
}