假如你是一名系统管理员,负责管理公司内的多个服务器。为了确保这些服务器的健康状态,你需要定期从这些服务器收集系统信息,例如CPU使用率、内存使用情况、硬盘空间等。这些信息可以通过WMI接口远程获取。可以编写一个工具,利用WMI
(Windows Management Instrumentation)从远程服务器获取这些数据。
#define _WIN32_DCOM
#include <comdef.h>
#include <WbemIdl.h>
#include <stdio.h>
#pragma comment(lib, "wbemuuid.lib")
// 连接到远程WMI服务器
HRESULT ConnectToWmiServer(
IWbemLocator* pLoc,
const wchar_t* hostname,
const wchar_t* username,
const wchar_t* password,
IWbemServices** pSvc
) {
// 目标主机和命名空间
wchar_t cimv2[256] = { 0 };
swprintf_s(cimv2, 256, L"\\\\%ls\\ROOT\\CIMV2", hostname);
// 将wchar_t*字符串转换为BSTR
BSTR strNamespace = SysAllocString(cimv2);
BSTR strUser = SysAllocString(username);
BSTR strPassword = SysAllocString(password);
// 连接到WMI服务器
HRESULT hr = pLoc->ConnectServer(
strNamespace, // 命名空间
strUser, // 用户名
strPassword, // 用户密码
NULL, // 区域设置
0, // 安全标志
NULL, // 权限
NULL, // 上下文对象
pSvc // IWbemServices代理
);
// 释放BSTR
SysFreeString(strNamespace);
SysFreeString(strUser);
SysFreeString(strPassword);
return hr;
}
int wmain(int argc, wchar_t* argv[]) {
HRESULT hr;
IWbemLocator* pLoc = NULL;
// 初始化COM库
hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr)) {
wprintf(L"初始化COM库失败。错误代码 = 0x%X\n", hr);
return 1; // 程序失败
}
// 设置COM安全级别
hr = CoInitializeSecurity(
NULL,
-1, // COM认证
NULL, // 认证服务
NULL, // 保留
RPC_C_AUTHN_LEVEL_DEFAULT, // 默认认证
RPC_C_IMP_LEVEL_IMPERSONATE, // 默认模拟级别
NULL, // 认证信息
EOAC_NONE, // 其他能力
NULL // 保留
);
if (FAILED(hr)) {
wprintf(L"初始化安全性失败。错误代码 = 0x%X\n", hr);
CoUninitialize();
return 1; // 程序失败
}
// 获取WMI定位器
hr = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hr)) {
wprintf(L"创建IWbemLocator对象失败。错误代码 = 0x%X\n", hr);
CoUninitialize();
return 1; // 程序失败
}
// 调用连接函数
IWbemServices* pSvc = NULL;
hr = ConnectToWmiServer(pLoc, argv[1], argv[2], argv[3], &pSvc);
if (FAILED(hr)) {
wprintf(L"无法连接到服务器。错误代码 = 0x%X\n", hr);
pLoc->Release();
CoUninitialize();
return 1; // 程序失败
}
// <具体操作逻辑……>
// 清理资源
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0; // 成功完成
}