windows下WMI使用C++查询用户硬件信息
最近需要做下用户信息统计,发现WMI真是个好东西,同时觉得COM这东西,还真不能少>_<!!
下面是源码:
/********************************************************************
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;
}
windows下WMI使用C++查询用户硬件信息的更多相关文章
- 转:mysql日志(Windows下开启Mysql慢查询、通用日志)
一.Windows下开启Mysql慢查询详解 //show variables like '%quer%';查询是否开启了慢查询!! 第一步:修改my.ini(mysql配置文件) 在my.ini中 ...
- 清除在Windows下访问共享文件夹时的登录信息
清除在Windows下访问共享文件夹时的登录信息 在实际工作中,经常需要访问局域网内其他机子上的共享文件夹,例如\\192.168.1.100\d$ , 首次访问时,需要输入用户名和密码才可以进入,即 ...
- Windows下Kettle定时任务执行并发送错误信息邮件
Windows下Kettle定时任务执行并发送错误信息邮件 1.首先安装JDK 2.配置JDK环境 3.下载并解压PDI(kettle) 目前我用的是版本V7的,可以直接百度搜索下载社区版,企业版收费 ...
- Linux下使用fstatfs/statfs查询系统相关信息
Linux下使用fstatfs/statfs查询系统相关信息 1. 功能 #include < sys/statfs.h > int statfs(const char *path, ...
- 在Windows下Mysql如何重置root用户密码
原文链接:http://www.feeldesignstudio.com/2013/05/windows-mysql-root-password-reset 网上的很多在Windows下重置root用 ...
- Linux和windows下清除svn保存的账号密码信息
linux是什么用户登录就是什么用户的home下,如root用户就是/root,如果xiangdong就是/home/xiangdong 用Svn时会有一种需求是需要换个帐号测试一下什么的,但往往有缓 ...
- Oracle 查询用户表信息,导入导出处理表空间不一致
select table_name,tablespace_name from user_tables t; //查询用户默认表空间信息 SELECT t.* FROM USER_USERS t; 导入 ...
- Windows下如何查看当前登录用户
1.通过whoami命令查看 2.通过username变量查看,具体命令如下:echo %username% 上述两种方法只能查看当前会话用户信息,那么如何看到其他登录用户呢? 可以通过执行query ...
- windows下根据tcp端口查询对应的进程id(端口被占用)
如下: 查询监听LISTENING的端口1027 netstat -navo|find /i "listen"|find /i ":1027" 结果如下(最后一 ...
随机推荐
- snmp 默认团体名检测利用
[root@izj6c2n1nth4tg8emd8h58z tmp]# lsb_release LSB Version: :core-4.1-amd64:core-4.1-noarch[root ...
- MFC 获得各类指针、句柄的方法(转)
原文转自 https://blog.csdn.net/abcjennifer/article/details/7480019 1.MFC中获取常见类句柄<视图类,文档类,框架类,应用程序类> ...
- (二十二)函数fseek() 用法
fseek 函数名: fseek功 能: 重定位流上的文件指针用 法: int fseek(FILE *stream, long offset, int fromwhere);描 述: 函数设置文件指 ...
- 删除 Myeclipse 遗留的 workspace
有时因需要而创建多个 workspace 并在它们之间切换,但是如果某些 workspace 内容被物理删除(不再需要)后,当你点击 File --> Switch Workspace 时,旧的 ...
- R 语言词云wordcloud
来源:http://blog.chinaunix.net/uid-25135004-id-4311592.html wordcloud函数--用于绘制词云图 用法: wordcloud(words,f ...
- (8)java基础知识-字符编码
这块比较乱待整理... http://www.regexlab.com/zh/encoding.htm 字符编码 将各种文字.图形.标点.数字整合在一个集合叫做字符集. 把这些字符集按照不用规则进行编 ...
- 【bzoj3173】【Tjoi2013】【最长上升子序列】treap+dp二分优化
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61560361 向大(hei)佬(e)实力学(di ...
- 一致性hash-java实现treemap版
把不同号段的数据储存在不同的机器上,以用来分散压力.假如我们有一百万个QQ号,十台机器,,如何划分呢? 最简单粗暴的方法是用QQ号直接对10求余,结果为0-9 分别对应上面的十台机器.比如QQ号为 2 ...
- JAVA中使用freemark生成自定义文件(json、excel、yaml、txt)
原文:http://blog.csdn.net/jinzhencs/article/details/51461776 场景:在我们工作中,有时需要生成一些文件,可能它不是一种标准的格式,比如JSON. ...
- jq和js中click 事件的几种方式总结和click事件的累加问题解决办法
1:常见的三种绑定click事件: 第一种:$("#click").click(function(){ alert("Hello World click") ...