21xrx.com
2025-03-25 10:43:44 Tuesday
文章检索 我的文章 写文章
如何用C++获取系统激活状态
2023-06-22 02:49:04 深夜i     39     0
C++ 系统激活状态 操作系统 许可证 API

C++是一种强大的编程语言,它可以用于开发各种类型的应用程序。其中之一就是用于获取系统激活状态的应用程序。在这篇文章中,我们将介绍使用C++如何获取系统激活状态。

获取系统激活状态的过程是通过访问Windows管理对象来完成的。其中最重要的是WMI(Windows Management Instrumentation)服务。WMI提供了一种机制,使开发人员能够获取Windows系统中的各种信息,包括系统激活状态。

下面是一个获取系统激活状态的示例程序:

#include <iostream>
#include <Windows.h>
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
int main()
{
  HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  if (FAILED(hr))
  
    std::cout << "Failed to initialize COM library" << std::endl;
    return hr;
  
  hr = CoInitializeSecurity(
    NULL,
    -1,
    NULL,
    NULL,
    RPC_C_AUTHN_LEVEL_DEFAULT,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL,
    EOAC_NONE,
    NULL);
  if (FAILED(hr))
  {
    std::cout << "Failed to initialize security" << std::endl;
    CoUninitialize();
    return hr;
  }
  IWbemLocator* pLoc = NULL;
  hr = CoCreateInstance(
    CLSID_WbemLocator,
    0,
    CLSCTX_INPROC_SERVER,
    IID_IWbemLocator,
    (LPVOID*)&pLoc);
  if (FAILED(hr))
  {
    std::cout << "Failed to create IWbemLocator object" << std::endl;
    CoUninitialize();
    return hr;
  }
  IWbemServices* pSvc = NULL;
  hr = pLoc->ConnectServer(
    _bstr_t(L"ROOT\\CIMV2"),
    NULL,
    NULL,
    0,
    NULL,
    0,
    0,
    &pSvc);
  if (FAILED(hr))
  {
    std::cout << "Failed to connect to WMI services" << std::endl;
    pLoc->Release();
    CoUninitialize();
    return hr;
  }
  hr = CoSetProxyBlanket(
    pSvc,
    RPC_C_AUTHN_WINNT,
    RPC_C_AUTHZ_NONE,
    NULL,
    RPC_C_AUTHN_LEVEL_CALL,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL,
    EOAC_NONE);
  if (FAILED(hr))
  {
    std::cout << "Failed to set proxy blanket" << std::endl;
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return hr;
  }
  IEnumWbemClassObject* pEnumerator = NULL;
  hr = pSvc->ExecQuery(
    _bstr_t("WQL"),
    _bstr_t("SELECT * FROM SoftwareLicensingService"),
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
    NULL,
    &pEnumerator);
  if (FAILED(hr))
  {
    std::cout << "Failed to execute WMI query" << std::endl;
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return hr;
  }
  IWbemClassObject* pclsObj = NULL;
  ULONG uReturn = 0;
  while (pEnumerator)
  {
    hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
    if (0 == uReturn)
      break;
    VARIANT vtValue;
    hr = pclsObj->Get(L"OA3xOriginalProductKey", 0, &vtValue, NULL, NULL);
    if (SUCCEEDED(hr))
    {
      std::cout << "System is activated. Product key: " << _com_util::ConvertBSTRToString(vtValue.bstrVal) << std::endl;
    }
    else
    
      std::cout << "System is not activated" << std::endl;
    
    VariantClear(&vtValue);
    pclsObj->Release();
  }
  pSvc->Release();
  pLoc->Release();
  pEnumerator->Release();
  CoUninitialize();
  return S_OK;
}

该示例程序首先要初始化COM库和安全性,然后创建一个WMI定位器对象。接下来,通过这个定位器对象连接到WMI服务,并设置代理设置,以便向WMI服务请求信息。然后,通过WMI服务执行查询,并获取结果。最后,清理资源并返回程序状态。

在上面的示例程序中,我们使用了“SoftwareLicensingService” WMI类获取系统激活状态。这个类包含一个名为“OA3xOriginalProductKey”的属性,该属性保存激活系统时输入的产品密钥。如果该属性的值为NULL,则表示系统未激活。

总之,C++是一种非常强大的编程语言,但也需要花费一些时间和精力学习。如果您想获取系统激活状态并使用C++编写应用程序,那么上面的示例程序可以为您提供一些参考。

  
  

评论区