企业网站建设验收,百度推广退款电话,网站建设公司的选择,wordpress获取首页地址Windows Management Instrumentation#xff08;WMI#xff09;是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口#xff0c;通过这个接口#xff0c;可以获取有关计算机系统硬件、操作系统和应用程序的信息#xf…Windows Management InstrumentationWMI是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口通过这个接口可以获取有关计算机系统硬件、操作系统和应用程序的信息以及对系统进行管理和控制的能力。
WMI允许通过编程方式查询系统信息、监视性能、执行管理任务等。它提供了一种统一的方式来访问和管理Windows操作系统的各个方面而无需了解底层实现细节。通过WMI可以使用各种编程语言如C#、VBScript、PowerShell等来执行诸如查询系统信息、监控性能、配置系统设置等任务。
当需要通过WMI编程提取参数时我们就需要使用WQLWindows Management Instrumentation Query Language它是一种查询语言专门用于查询Windows Management Instrumentation (WMI)数据。WMI 是Windows操作系统中用于管理和监视的框架而WQL则是用于与WMI进行交互的查询语言。
查询分析器下载https://download.csdn.net/download/lyshark_csdn/87950095
WQL 的语法类似于 SQLStructured Query Language使用WQL可以执行各种查询来检索关于计算机系统、硬件、软件和其他管理信息的数据。这些查询可以用于编写脚本、管理任务、监视性能等。为了方便查询获取参数这里提供一个简单的查询工具供大家查询使用下载后打开其默认查询的是Win32_ComputerSystem也就是系统的基本参数信息 如果我们需要获取其他信息比如得到计算机中所安装的所有Windows服务信息可以执行SELECT * FROM Win32_Service语句当然也有许多其他的通用语句可以让我们使用例如如下几种常用的语句。
查询所有安装的软件 SELECT * FROM Win32_Product 查询所有逻辑磁盘的信息 SELECT * FROM Win32_LogicalDisk 查询所有网络适配器的信息 SELECT * FROM Win32_NetworkAdapter 查询操作系统信息 SELECT * FROM Win32_OperatingSystem 查询所有正在运行的进程 SELECT * FROM Win32_Process 查询所有用户账户信息 SELECT * FROM Win32_UserAccount 查询系统启动项 SELECT * FROM Win32_StartupCommand 查询物理内存 SELECT * FROM Win32_PhysicalMemory 如上图所示查询将返回Win32_Service类中所有服务的信息。你可以根据需要编写更复杂的查询以满足特定的管理或监视要求。
为了让读者更加方便的使用查询功能此处我封装了一个SelectQuerySQL查询函数该函数需要传入特定的查询语句特定的查询字段以及返回值缓冲区此时只需要读取缓冲区内的数据即可得到查询结果。
#define _CRT_SECURE_NO_WARNINGS
#define _WIN32_DCOM
#define _CRT_NONSTDC_NO_DEPRECATE#include comdef.h
#include Wbemidl.h
#include iostream
#include string# pragma comment(lib, wbemuuid.lib)using namespace std;// 去掉字符串中的空格
void Trims(char* data)
{int i -1, j 0;int ch ;while (data[i] ! \0){if (data[i] ! ch){data[j] data[i];}}data[j] \0;
}// 通用查询方法,每次查询一条
bool SelectQuerySQL(LPCWSTR SQL, LPCWSTR Key, OUT char OutBuf[1024])
{HRESULT hres;CoUninitialize();hres CoInitializeEx(0, COINIT_MULTITHREADED);if (FAILED(hres)){return false;}hres CoInitializeSecurity(0, -1, 0, 0, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, 0, EOAC_NONE, 0);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(LROOT\\CIMV2), 0, 0, 0, 0, 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;// 执行WSQL语句hres pSvc-ExecQuery(bstr_t(WQL),bstr_t(SQL),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;// 获取到指定Key字段hr pclsObj-Get(Key, 0, vtProp, 0, 0);// 将获取到的数据返回给OutBufwcstombs(OutBuf, vtProp.bstrVal, 1024);VariantClear(vtProp);pclsObj-Release();}pSvc-Release();pLoc-Release();pEnumerator-Release();CoUninitialize();return true;
}有了上述函数的封装那么实现查询就变得很容易了当我们需要查询CPU序列号时可以直接执行SELECT * FROM win32_Processor并取出里面的ProcessorId字段使用函数时可以总结为如下所示的案例
int main(int argc, char *argv[])
{char RefBuffer[1024] { 0 };bool ref false;ref SelectQuerySQL(LSELECT * FROM win32_Processor, LProcessorId, RefBuffer);std::cout 获取CPU序列号: RefBuffer std::endl;Trims(RefBuffer);system(pause);return 0;
}输出效果如下所示 根据这个查询方法我们就可以得到系统的各类固件序列号这对于软件认证尤为重要
int main(int argc, char *argv[])
{char RefBuffer[1024] { 0 };bool ref false;ref SelectQuerySQL(LSELECT * FROM win32_Processor, LProcessorId, RefBuffer);std::cout 获取CPU序列号: RefBuffer std::endl;Trims(RefBuffer);ref SelectQuerySQL(LSELECT * FROM Win32_BaseBoard, LSerialNumber, RefBuffer);std::cout 获取主板ID号: RefBuffer std::endl;Trims(RefBuffer);ref SelectQuerySQL(LSELECT * FROM Win32_BIOS, LSerialNumber, RefBuffer);std::cout 获取BIOS序列号: RefBuffer std::endl;Trims(RefBuffer);ref SelectQuerySQL(LSELECT * FROM Win32_PhysicalMemory, LSerialNumber, RefBuffer);std::cout 获取内存序列号: RefBuffer std::endl;Trims(RefBuffer);ref SelectQuerySQL(LSELECT * FROM Win32_DiskDrive WHERE Index 0, LSerialNumber, RefBuffer);Trims(RefBuffer);std::cout 获取硬盘序列号: RefBuffer std::endl;system(pause);return 0;
}输出效果如下所示 当然有时我们也需要一次性输出多个参数某些数据存在多条记录在输出时也需要增加一些代码我们以Win32_LogicalDisk为例代码需要进行一定的改进在循环时分别取出不同的字段此时的查询函数需要相应的做一些改进如下是查询函数需要变化的位置。
while (pEnumerator)
{HRESULT hr pEnumerator-Next(WBEM_INFINITE, 1, pclsObj, uReturn);if (0 uReturn){break;}// 输出盘符字段VARIANT vtProp_DeviceID;VARIANT vtProp_FreeSpace;VARIANT vtProp_Size;// 获取到指定Key字段hr pclsObj-Get(LDeviceID, 0, vtProp_DeviceID, 0, 0);hr pclsObj-Get(LFreeSpace, 0, vtProp_FreeSpace, 0, 0);hr pclsObj-Get(LSize, 0, vtProp_Size, 0, 0);// 转换数据为字符串char x[32], y[32], z[32];wcstombs(x, vtProp_DeviceID.bstrVal, 32);wcstombs(y, vtProp_FreeSpace.bstrVal, 32);wcstombs(z, vtProp_Size.bstrVal, 32);std::cout 分区: x std::endl;std::cout 剩余: y std::endl;std::cout 容量: z std::endl;// 清理VariantClear(vtProp_DeviceID);VariantClear(vtProp_FreeSpace);VariantClear(vtProp_Size);pclsObj-Release();
}此外在查询参数上也应该修改为对应的SELECT * FROM Win32_LogicalDisk查询磁盘
int main(int argc, char *argv[])
{char RefBuffer[1024] { 0 };bool ref false;ref SelectQuerySQL(LSELECT * FROM Win32_LogicalDisk, LProcessorId, RefBuffer);Trims(RefBuffer);system(pause);return 0;
}此时当再一次运行这段代码就可以查询到当前系统中所有的磁盘信息如下图所示