chromium 05 在chromium中获取系统的UUID

01 uuid获取途径

js中有个组件 systeminformation 可以查到系统的UUID。
在windows中代码的大约如下。

          exec(util.getWmic() + ' csproduct get /value', opts, function (error, stdout) {
            if (!error) {
              // let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0)[0].trim().split(/\s\s+/);
              let lines = stdout.split('\r\n');
              result.manufacturer = util.getValue(lines, 'vendor', '=');
              result.model = util.getValue(lines, 'name', '=');
              result.version = util.getValue(lines, 'version', '=');
              result.serial = util.getValue(lines, 'identifyingnumber', '=');
              result.uuid = util.getValue(lines, 'uuid', '=');
              exec(util.getWmic() + ' /namespace:\\\\root\\wmi path MS_SystemInformation get /value', opts, function (error, stdout) {
                if (!error) {
                  let lines = stdout.split('\r\n');
                  result.sku = util.getValue(lines, 'systemsku', '=');
                }
                if (callback) { callback(result); }
                resolve(result);
              });
            }
            if (callback) { callback(result); }
            resolve(result);
          });  

原理可以cmd命令行运行windows命令行

WMIC csproduct list /format

结果如下:

Description=计算机系统产品
IdentifyingNumber=Default string
Name=Z370 HD3
SKUNumber=
UUID=03D502E0-045E-05A0-6B06-B40700080009
Vendor=Gigabyte Technology Co., Ltd.
Version=Default string

UUID=03D502E0-045E-05A0-6B06-B40700080009

02 c++ 实现

#include <Shlobj.h>
#include <Wbemidl.h>
#include <comdef.h>
#include <codecvt>
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "wbemuuid.lib")
bool get_system_uuid(std::string& uuid, std::string& device_name) {
  bool bRet = false;
  HRESULT hres;

  // Step 1: --------------------------------------------------
  // Initialize COM. ------------------------------------------

  hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
  if (FAILED(hres)) {
    std::cout << "Failed to initialize COM library. Error code = 0x" << std::hex
              << hres << std::endl;
    return bRet;
  }

  // Step 2: --------------------------------------------------
  // Set general COM security levels --------------------------

  // 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)) {
  //  std::cout << "Failed to initialize security. Error code = 0x" << std::hex
  //            << hres << std::endl;
  //  CoUninitialize();
  //  return bRet;
  //}

  // Step 3: ---------------------------------------------------
  // Obtain the initial locator to WMI -------------------------

  IWbemLocator* pLoc = NULL;

  hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
                          IID_IWbemLocator, (LPVOID*)&pLoc);

  if (FAILED(hres)) {
    std::cout << "Failed to create IWbemLocator object."
              << " Err code = 0x" << std::hex << hres << std::endl;
    CoUninitialize();
    return bRet;
  }

  // Step 4: -----------------------------------------------------
  // Connect to WMI through the IWbemLocator::ConnectServer method

  IWbemServices* pSvc = NULL;

  // Connect to the root\cimv2 namespace with
  // the current user and obtain pointer pSvc
  // to make IWbemServices calls.
  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)) {
    std::cout << "Could not connect. Error code = 0x" << std::hex << hres
              << std::endl;
    pLoc->Release();
    CoUninitialize();
    return bRet;
  }

  std::cout << "Connected to ROOT\\CIMV2 WMI namespace" << std::endl;

  // Step 5: --------------------------------------------------
  // Set security levels on the proxy -------------------------
  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)) {
    std::cout << "Could not set proxy blanket. Error code = 0x" << std::hex
              << hres << std::endl;
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return bRet;
  }

03 注意事项

比较重要的是:单独进程获取,没问题,如果进程中有其他com类应用,就需要注意。
比如:在chromium主进程中使用时,需要单独起一个线程来运行这个函数。才能正常运行。

1 不能调用 CoInitializeSecurity 函数
2 CoInitializeEx(0, COINIT_APARTMENTTHREADED);中的参数使用COINIT_APARTMENTTHREADED,而不是COINIT_MULTITHREADED。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Chromium 109在Windows系统上的构建非常简单,你可以通过以下步骤完成:1. 下载Chromium源代码;2. 从Chromium源代码构建Windows系统版本;3. 使用Visual Studio编译Chromium;4. 在Windows系统上运行Chromium。 ### 回答2: Chromium是一款开源的网络浏览器项目,它的源代码可以通过开源社区获取并进行构建。下面是Chromium 109在Windows系统上的构建步骤: 1. 准备开发环境:首先,需要安装Windows操作系统,并确保系统已经安装了Git以及Python等必要的开发工具。 2. 下载源代码:进入Chromium的官方源代码仓库(https://chromium.googlesource.com/chromium/src),通过Git将源代码下载到本地计算机。 3. 安装依赖项:在源代码的根目录下运行一些脚本文件,脚本文件会检测环境并安装必要的依赖项,如编译器、库文件等。 4. 配置构建:Chromium有许多构建选项,可以通过在源代码根目录下运行GN命令配置构建。GN文件是一个用于配置构建的文本文件,可以在其指定编译器、构建类型、构建目标等选项。 5. 开始构建:运行Ninja命令开始构建Chromium。Ninja是一个构建系统,它会根据GN配置文件生成一系列的构建指令,并进行编译链接。 6. 等待构建完成:构建过程可能需要一些时间,取决于计算机性能以及网络速度。 7. 完成构建:构建成功后,在构建目录就能找到生成的Chromium可执行文件。 以上是Chromium 109在Windows系统上的简要构建步骤,具体的步骤可能会因为开发环境和个人需求的不同而有所变化,但总体上是类似的。 ### 回答3: Chromium 109是指在Windows操作系统上构建Chromium(Google Chrome的开源版本)的步骤。 构建Chromium的第一步是设置开发环境。首先,您需要下载并安装Visual Studio,这是Windows系统上的主要开发工具。然后,您需要安装depot_tools,这是Chromium开发所需的一组工具。您还需要安装Python,并将其添加到系统的环境变量。 接下来的步骤是获取Chromium的源代码。您可以使用depot_tools的命令行工具"fetch"来执行此操作。执行"fetch chromium"命令将下载最新的Chromium源代码。 下载完成后,您需要为构建过程选择适当的构建配置。Chromium支持多个配置选项,如Debug、Release、ThinLTO等。您可以使用gclient命令将配置设置为您希望构建的配置。 在选择了构建配置后,您可以使用gn工具生成构建脚本。gn生成的构建脚本将包含构建Chromium所需的所有编译选项和依赖库。 接下来,您需要运行ninja命令来执行实际的构建。ninja命令将按照gn生成的构建脚本所定义的规则进行构建。这个过程可能需要一些时间,具体取决于您的计算机的性能和网络速度。 构建完成后,您可以在构建输出文件夹找到生成的可执行文件和其他相关文件。您可以运行生成的可执行文件来启动Chromium浏览器。 总的来说,构建Chromium 109在Windows系统上需要准备开发环境、获取源代码、选择构建配置、生成构建脚本和执行构建等步骤。这些步骤需要一些开发工具和命令行操作,并可能需要一些时间和计算资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值