Last active
September 11, 2023 06:58
-
-
Save daiakushi/735b2558f8a0e6551db1 to your computer and use it in GitHub Desktop.
Windows WMI Example to: 1. Get properties from WMI Class 2. Execute methods provided by WMI Class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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\\Security\\MicrosoftVolumeEncryption"), | |
// 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 << "Unable to connect, are you administrator? Error code = 0x" | |
<< hex << hres << endl; | |
pLoc->Release(); | |
CoUninitialize(); | |
return 1; // Program has failed. | |
} | |
// 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_EncryptableVolume"), | |
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; | |
ULONG uReturn = 0; | |
while (pEnumerator) { | |
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, | |
&pclsObj, &uReturn); | |
if (0 == uReturn) break; | |
VARIANT vtPropDriveLetter, vtPropProtectionStatus; | |
// Get the value of the Name property | |
hr = pclsObj->Get(L"DriveLetter", 0, &vtPropDriveLetter, 0, 0); | |
if (!FAILED(hr)) | |
wcout << " DriveLetter : " << vtPropDriveLetter.bstrVal << endl; | |
VariantClear(&vtPropDriveLetter); | |
hr = pclsObj->Get(L"ProtectionStatus", 0, &vtPropProtectionStatus, 0, 0); | |
if (!FAILED(hr)) | |
wcout << " ProtectionStatus : " << vtPropProtectionStatus.intVal << endl; | |
VariantClear(&vtPropProtectionStatus); | |
pclsObj->Release(); | |
} | |
// Cleanup | |
// ======== | |
pSvc->Release(); | |
pLoc->Release(); | |
pEnumerator->Release(); | |
if (!pclsObj) pclsObj->Release(); | |
CoUninitialize(); | |
return 0; // Program successfully completed. | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
BOOLEAN isComInit = FALSE; | |
BSTR MethodName = SysAllocString(L"IsEnabled"); | |
BSTR ClassName = SysAllocString(L"Win32_Tpm=@"); | |
IWbemLocator *pLoc = NULL; | |
IWbemServices *pSvc = NULL; | |
IWbemClassObject* pClass = NULL; | |
IWbemClassObject* pOutputDefinition = NULL; | |
VARIANT varClassPath, varReturn; | |
hres = CoInitializeEx(0, COINIT_MULTITHREADED); | |
if (FAILED(hres)) { | |
cout << "Failed to initialize COM library. Error code = 0x" | |
<< hex << hres << endl; | |
return 1; | |
} | |
isComInit = TRUE; | |
hres = CoInitializeSecurity( | |
NULL, | |
-1, // COM negotiates service | |
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; | |
goto Finale; | |
} | |
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; | |
goto Finale; | |
} | |
hres = pLoc->ConnectServer( | |
_bstr_t(L"ROOT\\CIMV2\\Security\\MicrosoftTpm"), | |
NULL, | |
NULL, | |
0, | |
NULL, | |
0, | |
0, | |
&pSvc); | |
if (FAILED(hres)) { | |
cout << "Could not connect. Error code = 0x" | |
<< hex << hres << endl; | |
goto Finale; | |
} | |
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; | |
goto Finale; | |
} | |
hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL); | |
if (FAILED(hres)) { | |
cout << "Could not get class. Error code = 0x" | |
<< hex << hres << endl; | |
goto Finale; | |
} | |
VariantInit(&varClassPath); | |
hres = pClass->Get(_bstr_t(L"__PATH"), 0, &varClassPath, NULL, NULL); | |
if (FAILED(hres)) { | |
cout << "Could not get class path. Error code = 0x" | |
<< hex << hres << endl; | |
goto Finale; | |
} | |
hres = pSvc->ExecMethod( | |
varClassPath.bstrVal, | |
MethodName, | |
0, | |
NULL, | |
NULL, | |
&pOutputDefinition, | |
NULL); | |
if (FAILED(hres)) { | |
cout << "Could not execute method. Error code = 0x" | |
<< hex << hres << endl; | |
goto Finale; | |
} | |
hres = pOutputDefinition->Get(_bstr_t(L"IsEnabled"), 0, &varReturn, NULL, 0); | |
if (FAILED(hres)) { | |
cout << "Could not get return object. Error code = 0x" | |
<< hex << hres << endl; | |
goto Finale; | |
} | |
cout << "TPM IsEnabled() : " << varReturn.boolVal << endl; | |
Finale: | |
SysFreeString(MethodName); | |
SysFreeString(ClassName); | |
if (pClass) pClass->Release(); | |
if (pOutputDefinition) pOutputDefinition->Release(); | |
if (pSvc) pSvc->Release(); | |
if (pLoc) pLoc->Release(); | |
if (isComInit) CoUninitialize(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment