21xrx.com
2024-11-22 13:06:05 Friday
登录
文章检索 我的文章 写文章
如何用C++获取系统激活状态
2023-06-22 02:49:04 深夜i     --     --
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++编写应用程序,那么上面的示例程序可以为您提供一些参考。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复