windows下WMI使用C++查询用户硬件信息

最近需要做下用户信息统计,发现WMI真是个好东西,同时觉得COM这东西,还真不能少>_<!!

下面是源码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

/********************************************************************

    created:    2014/02/18

    author:     baesky

    

    purpose:    Gater user infomation

*********************************************************************/

#include <comdef.h>

#include <Wbemidl.h>

# pragma comment(lib, "wbemuuid.lib")

struct UserInfo

{

    /** your spec*/

};

/** video card and OS */

bool GetUserInfo(UserInfo& Info)

{

    HRESULT hres;

    hres =  CoInitialize( NULL );

    if (FAILED(hres))

    {

        return false;                

    }

    hres =  CoInitializeSecurity(

        NULL,

        -1,                         

        NULL,                       

        NULL,                       

        RPC_C_AUTHN_LEVEL_DEFAULT,  

        RPC_C_IMP_LEVEL_IMPERSONATE,

        NULL,                       

        EOAC_NONE,                  

        NULL                        

        );

    if (FAILED(hres))

    {

        CoUninitialize();

        return false;                  

    }

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(

        CLSID_WbemLocator,            

        0,

        CLSCTX_INPROC_SERVER,

        IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hres))

    {

        CoUninitialize();

        return false;                

    }

    IWbemServices *pSvc = NULL;

    hres = pLoc->ConnectServer(

        _bstr_t(L"ROOT\\CIMV2"),

        NULL,                   

        NULL,                   

        0,                      

        NULL,                   

        0,                      

        0,                      

        &pSvc                   

        );

    if (FAILED(hres))

    {

        pLoc->Release();    

        CoUninitialize();

        return false;              

    }

    hres = 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(hres))

    {

        pSvc->Release();

        pLoc->Release();    

        CoUninitialize();

        return false;              

    }

    IEnumWbemClassObject* pEnumerator = NULL;

    hres = pSvc->ExecQuery(

        bstr_t("WQL"),

        bstr_t("SELECT * FROM Win32_OperatingSystem"),

        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

        NULL,

        &pEnumerator);

    if (FAILED(hres))

    {

        pSvc->Release();

        pLoc->Release();

        CoUninitialize();

        return false;              

    }

    IWbemClassObject *pclsObj;

    ULONG uReturn = 0;

    while (pEnumerator)

    {

        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,

            &pclsObj, &uReturn);

        if(0 == uReturn)

        {

            break;

        }

        VARIANT vtProp;

        hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);  //os

        //vtProp.bstrVal is what you need.

        //VariantClear(&vtProp);

        //hr = pclsObj->Get(L"CSDVersion", 0, &vtProp, 0, 0); // example "sp3"

        //VariantClear(&vtProp);

        //hr = pclsObj->Get(L"OSArchitecture", 0, &vtProp, 0, 0); // example x64

        //VariantClear(&vtProp);

        pclsObj->Release();

    }

    

    pEnumerator->Release();

    pEnumerator=NULL;

    hres = pSvc->ExecQuery(

        bstr_t("WQL"),

        bstr_t("SELECT * FROM Win32_VideoController"),

        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

        NULL,

        &pEnumerator);

    if (FAILED(hres))

    {

        pSvc->Release();

        pLoc->Release();

        CoUninitialize();

        return false;              

    }

    while (pEnumerator)

    {

        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,

            &pclsObj, &uReturn);

        if(0 == uReturn)

        {

            break;

        }

        VARIANT vtProp;

        hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);  //video desc

                /**

                  .,,,,,,,,,,,,,,,,,,,,,,your logic

                 */

        VariantClear(&vtProp);

        pclsObj->Release();

    }

    pEnumerator->Release();

    pEnumerator=NULL;

    hres = pSvc->ExecQuery(

        bstr_t("WQL"),

        bstr_t("SELECT * FROM Win32_Processor"),

        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

        NULL,

        &pEnumerator);

    if (FAILED(hres))

    {

        pSvc->Release();

        pLoc->Release();

        CoUninitialize();

        return false;              

    }

    while (pEnumerator)

    {

        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,

            &pclsObj, &uReturn);

        if(0 == uReturn)

        {

            break;

        }

        VARIANT vtProp;

        hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);  //video desc

         /**

                  .,,,,,,,,,,,,,,,,,,,,,,your logic

                 */

        VariantClear(&vtProp);

        pclsObj->Release();

    }

    

    pSvc->Release();

    pLoc->Release();

    pEnumerator->Release();

    

    CoUninitialize();

    return true;

}                        

  

时间: 2024-12-28 08:05:03

windows下WMI使用C++查询用户硬件信息的相关文章

Linux下使用fstatfs/statfs查询系统相关信息

Linux下使用fstatfs/statfs查询系统相关信息 1.   功能 #include < sys/statfs.h > int statfs(const char *path, struct statfs *buf); int fstatfs(int fd, struct statfs *buf); 查询文件系统相关的信息. 2.   參数 path: 须要查询信息的文件系统的文件路径名. fd: 须要查询信息的文件系统的文件描写叙述符. buf:下面结构体的指针变量,用于储存文件系

清除在Windows下访问共享文件夹时的登录信息

清除在Windows下访问共享文件夹时的登录信息 在实际工作中,经常需要访问局域网内其他机子上的共享文件夹,例如\\192.168.1.100\d$ , 首次访问时,需要输入用户名和密码才可以进入,即使没有勾选”保存密码”选项,下次登录时也会直接进入,虽然这个功能方便实用,但是当需要切换到另外 一个账号时,就不知所措了. 那么:如何才能清除本机Windows环境下访问这些共享文件夹时的登录信息(用户名和密码)呢? 下面给大家介绍一下. 一.命令行(cmd窗口)操作 当在命令提示窗口输入net u

Windows下Kettle定时任务执行并发送错误信息邮件

Windows下Kettle定时任务执行并发送错误信息邮件 1.首先安装JDK 2.配置JDK环境 3.下载并解压PDI(kettle) 目前我用的是版本V7的,可以直接百度搜索下载社区版,企业版收费,社区版免费 下载地址:https://sourceforge.net/projects/pentaho/files/Data%20Integration/ 4.打开解压文件夹kettle找到spoon.bat,双击打开 5.新建作业 点击左上角文件=>新建=>作业 如下图: 6.然后开始建立作业

Linux和windows下清除svn保存的账号密码信息

linux是什么用户登录就是什么用户的home下,如root用户就是/root,如果xiangdong就是/home/xiangdong 用Svn时会有一种需求是需要换个帐号测试一下什么的,但往往有缓存,于是需要清理下才行:一搬来说在客户端清理一下即可,经过实践是Ok的,如下:1.在项目上右键,选择TortoiseSVN-->settings,2.在弹出的TortoiseSVN Settings页面中选择“Saved Data”选项,3.然后点击“Authentication data”对应的“

windows下根据tcp端口查询对应的进程id

如下: 查询监听LISTENING的端口1027 netstat -navo|find /i "listen"|find /i ":1027" 结果如下(最后一列是进程id): C:\Users\Administrator>netstat -navo|find /i "listen"|find /i ":1027" TCP 0.0.0.0:1027 0.0.0.0:0 LISTENING 888 TCP [::]:102

Windows下使用EasyBCD和LiLi USB Creator安装Linux系统

Windows下使用EasyBCD和LiLi USB Creator安装Linux系统 写在前面:针对BIOS出现故障或者对U盘启动安装不是很熟练的朋友而写. 使用Win10朋友大多数使用UEFI启动+GPT分区.在UEFI里面修改启动项之后装机会进不了Win10,在给朋友通过PE装Win10 的时候如果设置Legacy启动,在PE里面安装完Win10重启之后会报错:提示您的什么不对,Wndows无法安装.就到无限循环的地步,设置成UEFI启动之后,再重启系统,Win10根本就不启动了,使用UE

05Mybatis_入门程序——根据id查询用户

这篇文章我们来做一个入门的案例: 建表: 1 /* 2 SQLyog v10.2 3 MySQL - 5.1.72-community : Database - mybatis 4 ********************************************************************* 5 */ 6 7 8 /*!40101 SET NAMES utf8 */; 9 10 /*!40101 SET SQL_MODE=''*/; 11 12 /*!40014 SE

05Mybatis_根据id查询用户

这篇文章我们来做一个入门的案例: 建表: 给出案例结构: 第一步:编写po类:User.java package cn.itcast.mybatis.po; import java.util.Date; public class User { private int id;//主键 private String username;//用户的名称 private Date birthday;//生日 private String sex;//性别 private String address;//

如何在Windows、Linux中获取主机的网络信息和公网地址

在我们的日常工作中,我们会需要进行查询主机当下的网络信息和公网上看到的IP地址信息,他们就像是网路上的名片,让我们找到彼此. Windows下如何获取内网和公网信息 在windows下该如何获取网路信息呢? 打开windows下的命令行,输入如下命令:  大家可以看到,在上述的截图中列出了内网地址,DNS信息,网关信息,内网地址,外网地址等等信息,包括无线还是优先的网卡等等信息. 这里截取了某个无线网卡的网络信息,做一个简单的示例. 那如何获取其公网信息呢? -** baidu.com中输入公网