C++获取Windows系统License信息的方法
2013-07-04 16:59
621 查看
是通过调用WMI获得License信息的。
#include "stdafx.h" #include <atlstr.h> #include <Chstring.h> #include <iostream> #include <atlbase.h> #include <wbemidl.h> #include <comutil.h> #pragma comment(lib, "Framedyn.lib") #pragma comment(lib, "Wbemuuid.lib") #pragma comment(lib, "comsuppw.lib") using namespace std; void get_win_license_demo(); int _tmain(int argc, _TCHAR* argv[]) { get_win_license_demo(); return 0; } void get_win_license_demo() { int retVal; //初始化 HRESULT hres; hres = CoInitializeEx (0, COINIT_MULTITHREADED); // 初始化 COM。 if (FAILED (hres)) { cout << "初始化 COM 库失败。错误代码 = 0x" << hex << hres << endl; return ; } //设置安全级别 hres = CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, 0); if (FAILED (hres)) { cout << "初始化安全性失败。错误代码 = 0x" << hex << hres << endl; retVal = 1; goto CleanUp; } //初始化 IWbemLocator 接口 IWbemLocator *pLoc = 0; hres = CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED (hres)) { cout << "创建 IWbemLocator 对象失败。错误代码 = 0x" << hex << hres << endl; retVal = 1; goto CleanUp; } //连接到 WMI IWbemServices *pServices = NULL; // 以当前用户身份连接到 root\cimv2 名称空间。 hres = pLoc->ConnectServer ( L"ROOT\\CIMV2", //_bstr_t(L"ROOT\\CIMV2") NULL, NULL, 0, NULL, 0, 0, &pServices ); if (FAILED(hres)) { cout << "无法连接。错误代码 = 0x" << hex << hres << endl; retVal = 1; goto CleanUp; } // 设置代理,以模拟客户。 hres = CoSetProxyBlanket(pServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); if (FAILED(hres)) { cout << "无法设置代理层。错误代码 = 0x" << hex << hres << endl; retVal = 1; goto CleanUp; } IEnumWbemClassObject* enumerator; HRESULT hr = pServices->ExecQuery( L"WQL", L"SELECT ID, PartialProductKey, Description, Name, \ ProductKeyID, LicenseStatus, TrustedTime, GracePeriodRemaining \ FROM SoftwareLicensingProduct", WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator ); if ( SUCCEEDED( hr ) ) { CComPtr<IWbemClassObject> ptrInfo = NULL; ULONG retcnt; while(1){ ptrInfo = NULL; hr = enumerator->Next( WBEM_INFINITE, 1L, reinterpret_cast<IWbemClassObject**>( &ptrInfo ), &retcnt ); if ( SUCCEEDED( hr ) ) { if ( retcnt > 0 ) { _variant_t var_val; hr = ptrInfo->Get( L"PartialProductKey", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr )) { if(var_val.vt != VT_NULL){ _bstr_t str = var_val; hr = ptrInfo->Get( L"LicenseStatus", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) && var_val.vt != VT_NULL) { _bstr_t str = var_val; _bstr_t str1 = "1"; if(str == str1){ std::cout << "[License Status]: Licensed" << std::endl; }else{ std::cout << "[License Status]: Unlicensed" << std::endl; } }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } hr = ptrInfo->Get( L"ID", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) ) { _bstr_t str = var_val; std::cout << "[ID]: "<< str << std::endl; }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } hr = ptrInfo->Get( L"PartialProductKey", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) && var_val.vt != VT_NULL) { _bstr_t str = var_val; std::cout << "[PartialProductKey]: " << str << std::endl; }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } hr = ptrInfo->Get( L"Description", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) ) { _bstr_t str = var_val; std::cout << "[Description]: " << str << std::endl; }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } hr = ptrInfo->Get( L"Name", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) ) { _bstr_t str = var_val; std::cout << "[Name]: " << str << std::endl; }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } hr = ptrInfo->Get( L"ProductKeyID", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) && var_val.vt != VT_NULL) { _bstr_t str = var_val; std::cout << "[ProductKeyID]: " << str << std::endl; }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } hr = ptrInfo->Get( L"TrustedTime", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) && var_val.vt != VT_NULL) { _bstr_t str = var_val; std::cout << "[TrustedTime]: " << str << std::endl; }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } hr = ptrInfo->Get( L"GracePeriodRemaining", 0, &var_val, NULL, NULL ); if ( SUCCEEDED( hr ) && var_val.vt != VT_NULL) { _bstr_t str = var_val; std::cout << "[Volume activation expiration]: " << str << " minute(s)" << std::endl; }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } std::cout << std::endl; }else{ continue; } }else{ std::cerr << "IWbemClassObject::Get failed" << std::endl; } } else break; } }//end while }else{ printf("Query failed: 0x%x\n", hr); } cout << "Press Enter to Exit..." << endl; getchar(); if(pServices) pServices->Release(); if(enumerator) enumerator->Release(); CleanUp: CoUninitialize(); return ; }
相关文章推荐
- windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
- windows平台下 c++获取 系统版本 网卡 内存 CPU 硬盘 显卡信息<转>
- windows 系统资源获取的c++ 方法
- windows平台下 c++获取 系统版本 网卡 内存 CPU 硬盘 显卡信息
- Windows下c++获取系统时间的三种方法
- windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
- C++程序获取系统信息方法
- windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
- windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
- 获取windows系统版本信息
- C++获取系统图标方法
- 获取windows系统信息
- c/c++在windows下获取时间和计算时间差的几种方法总结
- C/C++获取操作系统、CPU、内存信息(windows和linux)
- c++ 在windows下获取时间和计算时间差的几种方法总结
- 获取windows 系统信息
- .NET插件系统之二——不实例化获取插件信息和可视化方法
- php中获取系统信息的方法
- Window系统下C/C++程序毫秒级和微秒级执行时间获取方法
- 获取Windows系统的进程运行信息