0%

操作系统的关键信息查询(1)

简介

很多情况下,我们需要收集操作系统的关键信息,比如 内存大小 已安装软件 已安装补丁 等等信息。
所有的这些信息,我们可以起通过操作系统自带的 WMI 功能来查询到,它使用的是一种 WQL 数据库
访问语言。WMI 功能相当的庞大,我们这里只列出一部分我们感兴趣的项。

WMI使用

WMI 全称 Windows Management Instrumentation 中文叫 Windows管理规范,用户可以使用 WMI
管理本地和远程计算机,它对外开放的网络端口为 135,一般情况下,我们应该主动关闭这个端口,
防止远程访问进行一些恶意操作。

WMI的使用方式包含 COM API 脚本API WQL(SQL for WMI) 几种方式,我们这里使用的是 WQL
方式,其他使用方式请自行查询相关资料。(http://www.yfvb.com/help/wmi/index.htm)

示例查询代码

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
// 回调函数的定义
typedef HRESULT (*WMICALLBACK)(VARIANT& vtInfo);

HRESULT WmiQueryInfo(LPCWSTR wszCmd, LPCWSTR wszName, WMICALLBACK Callback)
{
// 检查参数的有效性
if ((wszCmd == NULL) || (wszName == NULL) || (Callback == NULL)) return S_FALSE;
// 初始化COM的进程安全(CoInitializeEx)(原因:WMI的进程和应用程序进程不在同一个级别)
CoInitializeEx(0, COINIT_MULTITHREADED);
HRESULT hr = CoInitializeSecurity(
NULL,
-1, // COM authentication COM认证
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 ((hr != S_OK) && (hr != RPC_E_TOO_LATE)) return hr;
// 用指定的类标识符创建一个Com对象,用指定的类标识符创建一个未初始化的对象。
IWbemLocator *pLocator = NULL;
hr = CoCreateInstance(
CLSID_WbemLocator, // 创建的Com对象的类标识符(CLSID)
0, // 指向接口IUnknown的指针
CLSCTX_INPROC_SERVER, // 运行可执行代码的上下文
IID_IWbemLocator, // 创建的Com对象的接口标识符
(LPVOID *)&pLocator); // 用来接收指向Com对象接口地址的指针变量
if (hr != S_OK) return hr;
// 获取IWbemServices指针(IWbemLocator::ConnectServer)
// 创建WMI服务
IWbemServices *pServices = NULL;
hr = pLocator->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 (e.g. Kerberos)
0, // Context object
&pServices); // pointer to IWbemServices proxy
if (hr != S_OK)
{
pLocator->Release();
return hr;
}
// 设置CoSetProxyBlanket代理安全(CoSetProxyBlanket),使WMI服务可以模拟客户端
hr = CoSetProxyBlanket(
pServices, // 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 (hr != S_OK)
{
pServices->Release();
pLocator->Release();
return hr;
}
// WMI查询(IWbemServices), 主要使用WQL语句,保存到全局变量中
// 使用iwbemservices指针请求WMI
IEnumWbemClassObject* pEnumerator = NULL;
hr = pServices->ExecQuery(
_bstr_t(L"WQL"),
_bstr_t(wszCmd), // 参数传入的命令
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, // 同步查询
NULL,
&pEnumerator);
if (hr != S_OK)
{
pServices->Release();
pLocator->Release();
return hr;
}
// 枚举所有信息
ULONG uReturn = 0;
VARIANT vtInfo = { 0 };
IWbemClassObject* pClassObject = NULL;
while (pEnumerator != NULL)
{
// 获取每条信息的内容
hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObject, &uReturn);
if ((hr != S_OK) || (uReturn == 0) || (pClassObject == NULL)) break;
VariantInit(&vtInfo);
// 得到要返回的信息表中的某个字段值放入到变量vtInfo中。
hr = pClassObject->Get(wszName, 0, &vtInfo, NULL, NULL);
if (hr != S_OK) break;
// 调用参数中的回调函数
hr = Callback(vtInfo);
if (hr != S_OK) break;
VariantClear(&vtInfo);
}
if (pClassObject != NULL) pClassObject->Release();
if (pEnumerator != NULL) pEnumerator->Release();
pServices->Release();
pLocator->Release();
return hr;
}

相关查询指令

查询CPU信息,其 L"ProcessorId" 字段为 CPUID

1
L"SELECT * FROM Win32_Processor" // CPU信息

查询硬盘信息,其 L"SerialNumber" 字段为 硬盘序列号

1
L"SELECT * FROM Win32_DiskDrive" // 硬盘信息

查询内存信息,其 L"Capacity" 字段为 内存大小

1
L"SELECT * FROM Win32_PhysicalMemory" // 内存信息

查询已安装补丁信息,其 L"HotFixID" 字段为 已安装补丁ID

1
L"SELECT * FROM Win32_QuickFixEngineering" // 已安装补丁信息

WMIC.EXE工具

操作系统提供了一个具有WMI功能的 wmic.exe 程序,可以运行 wmic.exe /? 来查看该程序如何使用。

常见查询总结

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
Win32_Processor // CPU 处理器
Win32_PhysicalMemory // 物理内存
Win32_Keyboard // 键盘
Win32_PointingDevice // 点输入设备,如鼠标
Win32_DiskDrive // 硬盘驱动器
Win32_CDROMDrive // 光盘驱动器
Win32_BaseBoard // 主板
Win32_BIOS // BIOS 芯片
Win32_ParallelPort // 并口
Win32_SerialPort // 串口
Win32_SoundDevice // 多媒体设置
Win32_USBController // USB 控制器
Win32_NetworkAdapter // 网络适配器
Win32_NetworkAdapterConfiguration // 网络适配器设置
Win32_Printer // 打印机
Win32_PrinterConfiguration // 打印机设置
Win32_PrintJob // 打印机任务
Win32_TCPIPPrinterPort // 打印机端口
Win32_POTSModem // MODEM
Win32_POTSModemToSerialPort // MODEM 端口
Win32_DesktopMonitor // 显示器
Win32_VideoController // 显卡细节
Win32_VideoSettings // 显卡支持的显示模式
Win32_TimeZone // 时区
Win32_SystemDriver // 驱动程序
Win32_DiskPartition // 磁盘分区
Win32_LogicalDisk // 逻辑磁盘
Win32_LogicalMemoryConfiguration // 逻辑内存配置
Win32_PageFile // 系统页文件信息
Win32_PageFileSetting // 页文件设置
Win32_BootConfiguration // 系统启动配置
Win32_OperatingSystem // 操作系统信息
Win32_StartupCommand // 系统自动启动程序
Win32_Service // 系统安装的服务
Win32_Group // 系统管理组
Win32_GroupUser // 系统组帐号
Win32_UserAccount // 用户帐号
Win32_Process // 系统进程
Win32_Thread // 系统线程
Win32_Share // 共享
Win32_NetworkClient // 已安装的网络客户端
Win32_NetworkProtocol // 已安装的网络协议