VC 获取软件安装列表

#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 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注