#include <comdef.h>
#include <wbemidl.h>
#pragma comment ( lib, "wbemuuid.lib")
#include <string>
using namespace std;
void CdeltoolDlg ::GetSoftwareList()
{
HRESULT hres;
//Initialize COM.--------------------------------------------
hres = CoInitializeEx( NULL , COINIT_MULTITHREADED );
if (FAILED (hres))
{
CString str;
str.Format( _T ("Failed to initialize COM library.Error Code = %d" ), GetLastError());
AfxMessageBox(str);
}
//DebugLog::Instance().WriteLog("Failed to initialize COM library. Error Code = %d", GetLastError());
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))
{
CString str;
str.Format( _T ("Failed to initialize security. Error Code = %d" ), GetLastError());
AfxMessageBox(str);
CoUninitialize();
return ; // Program has failed.
}
IWbemLocator *pLoc = NULL ;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER ,
IID_IWbemLocator, ( LPVOID *)&pLoc);
if (FAILED (hres))
{
// DebugLog::Instance().WriteLog("Failed to create IWbemLocator object. Error Code = %d", GetLastError());
CString str;
str.Format( _T ("Failed to create IWbemLocator object. Error Code = %d" ), GetLastError());
AfxMessageBox(str);
CoUninitialize();
return ; // Program has failed.
}
IWbemServices *pSvc = NULL ;
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))
{
CString str;
str.Format( _T ("Could not connect. Error Code = %d" ), GetLastError());
AfxMessageBox(str);
//DebugLog::Instance().WriteLog("Could not connect. Error Code = %d", GetLastError());
pLoc->Release();
CoUninitialize();
return ; // Program has failed.
}
CString str;
str.Format( _T ("Connected to ROOT\\CIMV2 WMI namespace" ));
//AfxMessageBox(str);
//DebugLog::Instance().WriteLog("Connected to ROOT\\CIMV2 WMI namespace");
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))
{
CString str;
str.Format( _T ("Could not set proxy blanket. Error code = %d" ), GetLastError());
AfxMessageBox(str);
//DebugLog::Instance().WriteLog("Could not set proxy blanket. Error code = %d", GetLastError());
pSvc->Release();
pLoc->Release();
CoUninitialize();
return ; // Program has failed.
}
IEnumWbemClassObject * pEnumerator = NULL ;
hres = pSvc->ExecQuery(
bstr_t ("WQL" ),
bstr_t ("SELECT * FROM Win32_Product" ), /*Win32_OperatingSystem*/
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY ,
NULL ,
&pEnumerator);
if (FAILED (hres))
{
CString str;
str.Format( _T ("Query for install software failed. Error code = %d" ), GetLastError());
AfxMessageBox(str);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return ;
}
IWbemClassObject *pclsObj = NULL ;
ULONG uReturn = 0;
while (pEnumerator)
{
//CString str;
//str.Format(_T("********************************"""));
// AfxMessageBox(str);
HRESULT hr = pEnumerator->Next(/*WBEM_INFINITE*//*WBEM_NO_WAIT*/ WBEM_INFINITE , 1, &pclsObj, &uReturn);
if (0 == uReturn)
{
int ma = GetLastError();
CString str;
str.Format( _T ("GetLastError() == %d" ), GetLastError());
// AfxMessageBox(str);
break ;
}
else
{
VARIANT vtProp;
// Get the value of the Name property
hr = pclsObj->Get(L"Name" , 0, &vtProp, NULL, NULL);
char * lpszName = _com_util::ConvertBSTRToString(vtProp.bstrVal);
hr = pclsObj->Get(L"InstallLocation" , 0, &vtProp, NULL, NULL);
char * lpszInstallLocation = _com_util::ConvertBSTRToString(vtProp.bstrVal);
USES_CONVERSION ;
m_list.InsertItem(0, A2W (lpszName));
m_list.SetItemText(0, 1, A2W (lpszInstallLocation));
VariantClear(&vtProp);
pclsObj->Release();
}
}
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
}
WMI Win32_Product的成员 https://msdn.microsoft.com/en-us/library/aa394378.aspx
[Provider("MSIProv"), Dynamic]
class Win32_Product : CIM_Product
{
uint16 AssignmentType;
string Caption;
string Description;
string IdentifyingNumber;
string InstallDate;
datetime InstallDate2;
string InstallLocation;
sint16 InstallState;
string HelpLink;
string HelpTelephone;
string InstallSource;
string Language;
string LocalPackage;
string Name;
string PackageCache;
string PackageCode;
string PackageName;
string ProductID;
string RegOwner;
string RegCompany;
string SKUNumber;
string Transforms;
string URLInfoAbout;
string URLUpdateInfo;
string Vendor;
uint32 WordCount;
string Version;
};
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。