C++调用WMI类查询获取操作系统名

  1 #define _WIN32_DCOM
  2 #include <iostream>
  3 #include <comdef.h>
  4 #include <Wbemidl.h>
  5
  6 using namespace std;
  7
  8 #pragma comment(lib, "wbemuuid.lib")
  9
 10 int main(int argc, char **argv)
 11 {
 12     HRESULT hres;
 13
 14     // 第一步:初始化COM
 15     hres = CoInitializeEx(0, COINIT_MULTITHREADED);
 16     if (FAILED(hres))
 17     {
 18         cout << "Failed to initialize COM library. Error code = 0x"
 19             << hex << hres << endl;
 20         return 1;                  // Program has failed.
 21     }
 22
 23     // 第二步:设置COM安全级别
 24     hres = CoInitializeSecurity(
 25         NULL,
 26         -1,                          // COM 认证
 27         NULL,                        // 服务认证
 28         NULL,                        // 保留NULL
 29         RPC_C_AUTHN_LEVEL_DEFAULT,   // 默认权限
 30         RPC_C_IMP_LEVEL_IMPERSONATE, // 默认模拟
 31         NULL,                        // 认证信息
 32         EOAC_NONE,                   // Additional capabilities
 33         NULL                         // Reserved
 34         );
 35
 36
 37     if (FAILED(hres))
 38     {
 39         cout << "安全级别初始化失败,错误代码 = 0x" << hex << hres << endl;
 40         CoUninitialize();
 41         return 1;                    // Program has failed.
 42     }
 43
 44     // 第三步:获取初始化本地WMI
 45     IWbemLocator *pLoc = NULL;
 46
 47     hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
 48
 49     if (FAILED(hres))
 50     {
 51         cout << "创建IWbemLocator对象失败,错误代码 = 0x" << hex << hres << endl;
 52         CoUninitialize();
 53         return 1;                 // Program has failed.
 54     }
 55
 56     // 第四步:通过 IWbemLocator::ConnectServer 方法连接WMI
 57     IWbemServices *pSvc = NULL;
 58
 59     // 使用IWbemServices 连接 root\cimv2 命名空间
 60     hres = pLoc->ConnectServer(
 61         _bstr_t(L"ROOT\\CIMV2"), // 对象路径
 62         NULL,                    // 用户名为空默认当前用户
 63         NULL,                    // 用户密码为空默认当前密码
 64         0,                       // 本地,NULL表示当前
 65         NULL,                    // 安全标志
 66         0,                       // 授权人
 67         0,                       // 上下文对象
 68         &pSvc                    // IWbemServices代理指针
 69         );
 70
 71     if (FAILED(hres))
 72     {
 73         cout << "无法连接,错误代码 = 0x" << hex << hres << endl;
 74         pLoc->Release();
 75         CoUninitialize();
 76         return 1;                // Program has failed.
 77     }
 78
 79     cout << "已连接到 ROOT\\CIMV2 WMI 命名空间" << endl;
 80
 81
 82     // 第五步:设置代理安全级别
 83
 84     hres = CoSetProxyBlanket(
 85         pSvc,                        // 要设置的代理指针
 86         RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
 87         RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
 88         NULL,                        // 委托服务名
 89         RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
 90         RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
 91         NULL,                        // 客户端身份
 92         EOAC_NONE                    // 代理能力
 93         );
 94
 95     if (FAILED(hres))
 96     {
 97         cout << "代理设置失败,错误代码 = 0x" << hex << hres << endl;
 98         pSvc->Release();
 99         pLoc->Release();
100         CoUninitialize();
101         return 1;               // Program has failed.
102     }
103
104     // 第六步:使用 IWbemServices 指针获取系统名
105     IEnumWbemClassObject* pEnumerator = NULL;
106     hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
107
108     if (FAILED(hres))
109     {
110         cout << "查询系统名失败,错误代码 = 0x" << hex << hres << endl;
111         pSvc->Release();
112         pLoc->Release();
113         CoUninitialize();
114         return 1;               // Program has failed.
115     }
116
117     // 第七步:获取查询数据
118     IWbemClassObject *pclsObj = NULL;
119     ULONG uReturn = 0;
120
121     while (pEnumerator)
122     {
123         HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,&pclsObj, &uReturn);
124
125         if (0 == uReturn)
126         {
127             break;
128         }
129
130         VARIANT vtProp;
131
132         // 获取Name属性值
133         hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
134         wcout << " 系统名 : " << vtProp.bstrVal << endl;
135         VariantClear(&vtProp);
136
137         pclsObj->Release();
138     }
139
140     // 清理工作
141     pSvc->Release();
142     pLoc->Release();
143     pEnumerator->Release();
144     CoUninitialize();
145     system("pause");
146     return 0;   // Program successfully completed.
147
148 }

说明都在源码注释里,效果图:

原文地址:https://www.cnblogs.com/biaoge140/p/10779763.html

时间: 2024-11-14 09:09:23

C++调用WMI类查询获取操作系统名的相关文章

Java工具类(获取当前主机操作系统名)

package com.fly.jenkins.util; /** * 操作系统类: 获取System.getProperty("os.name")对应的操作系统 * * @author isea533 */ public class OSinfo { private static String OS = System.getProperty("os.name").toLowerCase(); private static OSinfo _instance = ne

使用Powershell 的获取别的机器WMI类失败解决方法!

有些时候需要连接多台机器去获取他们的类,但是有些时候我们发现计算机无法连接,这个时候怎么办呢? 请修改组策略中以下配置: 可以使用Gpmc.msc 进行以后,本地计算机策略--计算机配置--管理模板--网络--网络连接--WIndow防火墙--允许远程管理启用 即可 截图如下: 使用Powershell 的获取别的机器WMI类失败解决方法!,布布扣,bubuko.com

java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

/** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中 * 3.将容器中的内容遍历,写入到指定文件中 * */ 代码:  FilenameFilter 过滤器: package com.lp.ecjtu.File.filter; import java.io.File; import java.i

windows和linux下如何远程获取操作系统版本和主机名

远程获取windows和linux操作系统版本和主机名需要具备以下条件: 假设 主机A(windows 7),ip:192.168.12.2 主机B(centos 6.3),ip:192.168.12.3 主机C(windows 2008)-为远程要获取信息的主机,ip:192.168.12.4 主机D(centos 6.3)-为远程要获取信息的主机,ip:192.168.12.5 windows: 1.主机A可以ping通主机C: 2.主机B可以ping通主机C: 3.主机B可以通过161端口

使用bat脚本调用py文件直接获取应用的包名和targetversion

背景: 在上一篇已经介绍过如何利用python调用aapt获取包名 https://www.cnblogs.com/reseelei-despair/p/11078750.html 但是因为每次都要修改py文件内的安装包所在路径,感觉不是很方便,所以想办法用bat脚本实现直接将文件拖入bat文件直接运行获取到相关信息 思路: 批处理脚本直接运行py文件,修改py文件,导入sys模块,直接在cmd中将安装包路径传入py后运行 代码: bat脚本代码如下 @echo off COLOR 2 set

.Net一个很有用的帮助类,包含获取获取浏览器版本号、 获取操作系统版本号、获取客户端IP地址、取客户端真实IP、获取公网IP、判断是否是IP格式

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;using System.Web; namespace ZC.Common.Log{    class UserHelper    { #region 获取浏览器版本号 /// <summary>   

C# 获取操作系统相关的信息

本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件.硬件相关信息. 涉及到知识点: Environment 提供有关当前环境和平台的信息以及操作它们的方法. ManagementClass 表示公共信息模型 (CIM) 管理类.管理类是一个 WMI 类,如 Win32_LogicalDisk 和 Win32_Process,前者表示磁盘驱动器,后者表示进程(如 Notepad.exe).通过该类的成员,可以使用特定的 WMI 类路

(转)在JSP中调用JAVA类和使用JavaBean有什么区别?

在JSP中调用JAVA类和使用JavaBean有什么区别? 可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类.特殊在可以通过<jsp:useBean   />调用JavaBean而其他类,可以和一般java中一样使用.  Bean的参数中还可以指定范围, <jsp:useBean  scope="application"   />该Bean在服务器的JVM中将只有一个实例. Bean是和WebServer相关的,不同的页面可以通过Bean 交

在C语言中以编程的方式获取函数名

调试常用的 __FILE__, __FUNCTION__, __LINE__ 调试常用的 __FILE__, __FUNCTION__, __LINE__ 没想到 VC6 不支持 __FUNCTION__ 所以我写了如下的奇怪代码 //用来记录当前行和当前函数//也可说是记录 堆栈void log_stack(const char *file, int line, const char * function); //当然还要对 __FUNCTION__ 宏作点修饰,因为这个宏只是在函数里面才起作