您的位置:首页 > 编程语言 > C语言/C++

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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: