C/C++ 中运用WMI接口查询系统各类信息,如软件信息、磁盘信息...

这篇具有很好参考价值的文章主要介绍了C/C++ 中运用WMI接口查询系统各类信息,如软件信息、磁盘信息...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C/C++ 中运用WMI接口查询系统各类信息,如软件信息、磁盘信息...

 

在C/C++中使用WMI(Windows Management Instrumentation)接口查询系统信息是一种强大的方法。下面是一个简单的例子,演示如何使用WMI查询系统信息,包括安装的软件信息、磁盘信息、网络适配器信息、操作系统信息等。请注意,这里使用的是COM接口,因此需要在代码中进行COM的初始化和反初始化。

#include <Windows.h>
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>

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

void QueryWMI(const wchar_t* query)
{
    // 初始化COM
    HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres))
    {
        std::wcerr << L"Failed to initialize COM library. Error code = 0x" << std::hex << hres << std::endl;
        return;
    }

    // 初始化COM安全性
    hres = CoInitializeSecurity(
        nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE, nullptr);

    if (FAILED(hres))
    {
        std::wcerr << L"Failed to initialize security. Error code = 0x" << std::hex << hres << std::endl;
        CoUninitialize();
        return;
    }

    // 创建WMI实例
    IWbemLocator* pLoc = nullptr;
    hres = CoCreateInstance(
        CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLoc));

    if (FAILED(hres))
    {
        std::wcerr << L"Failed to create IWbemLocator object. Error code = 0x" << std::hex << hres << std::endl;
        CoUninitialize();
        return;
    }

    // 连接到WMI
    IWbemServices* pSvc = nullptr;
    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"), nullptr, nullptr, 0, nullptr, 0, 0, &pSvc);

    if (FAILED(hres))
    {
        std::wcerr << L"Failed to connect to ROOT\\CIMV2. Error code = 0x" << std::hex << hres << std::endl;
        pLoc->Release();
        CoUninitialize();
        return;
    }

    // 设置安全级别
    hres = CoSetProxyBlanket(
        pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE);

    if (FAILED(hres))
    {
        std::wcerr << L"Failed to set proxy blanket. Error code = 0x" << std::hex << hres << std::endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return;
    }

    // 执行WMI查询
    IEnumWbemClassObject* pEnumerator = nullptr;
    hres = pSvc->ExecQuery(
        _bstr_t(L"WQL"), _bstr_t(query), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, nullptr, &pEnumerator);

    if (FAILED(hres))
    {
        std::wcerr << L"Query for data failed. Error code = 0x" << std::hex << hres << std::endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return;
    }

    // 枚举查询结果
    IWbemClassObject* pclsObj = nullptr;
    ULONG uReturn = 0;

    while (pEnumerator)
    {
        hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

        if (uReturn == 0)
            break;

        VARIANT vtProp;

        // 获取属性值
        hres = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);

        if (SUCCEEDED(hres))
        {
            std::wcout << L"Name : " << vtProp.bstrVal << std::endl;
            VariantClear(&vtProp);
        }

        pclsObj->Release();
    }

    // 释放资源
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
}

int main()
{
    // 查询所有已安装的软件
    QueryWMI(L"SELECT * FROM Win32_Product");

    // 查询磁盘信息
    QueryWMI(L"SELECT * FROM Win32_DiskDrive");

    // 查询网络适配器信息
    QueryWMI(L"SELECT * FROM Win32_NetworkAdapter");

    // 查询操作系统信息
    QueryWMI(L"SELECT * FROM Win32_OperatingSystem");

    // 查询正在运行的进程信息
    QueryWMI(L"SELECT * FROM Win32_Process");

    // 查询所有用户账户信息
    QueryWMI(L"SELECT * FROM Win32_UserAccount");

    // 查询系统启动项信息
    QueryWMI(L"SELECT * FROM Win32_StartupCommand");

    // 查询物理内存信息
    QueryWMI(L"SELECT * FROM Win32_PhysicalMemory");

    return 0;
}

这只是一个简单的例子,你可能需要根据自己的需求修改查询语句和处理结果的方式。此外,确保在使用WMI之前充分了解WMI的概念和相应的类。

 

C/C++ 中运用WMI接口查询系统各类信息,如软件信息、磁盘信息...文章来源地址https://www.toymoban.com/news/detail-760409.html

到了这里,关于C/C++ 中运用WMI接口查询系统各类信息,如软件信息、磁盘信息...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 抖音在线查权重系统源码,附带查询接口

    抖音权重在线查询只需输入抖音主页链接,即可查询作品情况。 搭建教程 上传源码并解压 修改数据库“bygoukai.sql” 修改“config.php” 如需修改水印请修改第40行 如需修改限制次数,请修改第156行 访问域名+user.php即可查看访问用户,停留时间和ip

    2024年02月02日
    浏览(37)
  • 1ll大学学生信息管理系统系统_学院管理_查询新增或修改删除标准接口_

    目录 修订版本 1. 目的 2. 阅读人员 3. 参考文档 ll大学学生信息管理系统系统_学院管理_查询新增或修改删除标准接口 4.1 接口概述 4.2 接口名称 4.3查询学院信息接口标准 4.4新增学院信息接口标准 4.5修改学院信息接口标准 学生信息管理系统系统_学院管理_查询新增或修改删

    2024年02月17日
    浏览(42)
  • Linux 系统服务日志查询 journalctl:查询 systemd 日记

    systemd 在取代 SUSE Linux Enterprise 12 中的传统 init 脚本时(参见第 13 章 “systemd 守护程序”),引入了自身的称为日记的日志记录系统。由于所有系统事件都将写入到日记中,因此,用户不再需要运行基于 syslog 的服务。 日记本身是 systemd 管理的系统服务,全名为 systemd-journal

    2024年02月07日
    浏览(38)
  • 大厂报价查询系统性能优化之道!

    机票查询系统,日均亿级流量,要求高吞吐,低延迟架构设计。提升缓存的效率以及实时计算模块长尾延迟,成为制约机票查询系统性能关键。本文介绍机票查询系统在缓存和实时计算两个领域的架构提升。 1.1 机票搜索的业务特点 机票搜索业务:输入目的地,然后点击搜索

    2024年03月25日
    浏览(32)
  • 【CentOS】查询系统内核版本、系统版本、32位or64位

    一、查看centos内核的版本: [root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@builder10.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 14:58:14 EDT 2010 [root@localhost ~]# uname -a Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux [r

    2024年02月11日
    浏览(37)
  • Php+sql成绩查询系统(系统+论文+答辩PPT)

    众所周知,现代信息技术是现代教育技术的基础和核心,培养和创新型的人才必须依靠现代教育技术。从这一层意义上讲,我们说掌握一定的计算机应用技能已经成为国家未来的合格建设者的必备素质,所以现在在大学中对非计算机系的学生开设了计算机文化基础课,并且通

    2024年02月09日
    浏览(31)
  • 城市公交查询系统的设计与实现

    目 录 摘 要 I Abstract II 第1章 引 言 1 1.1 课题背景 1 1.2 论文的研究内容 1 1.3 论文的组织结构 2 第2章 系统的开发工具与环境 3 2.1 ASP.NET简介 3 2.2 ADO.NET概述 4 2.3 系统的开发要求 5 第3章 需求分析 6 3.1 系统需求分析 6 3.2 数据库需求分析 6 3.3 性能需求 7 第4章 系统概要设计 9 4.1 概

    2024年02月07日
    浏览(34)
  • 基于java+springboot+vue城市轨道交通线路查询系统-公交车线路查询

    本系统是针对目前交通管理的实际需求,从实际工作出发,对过去的市轨道交通线路查询系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的

    2024年02月05日
    浏览(39)
  • 【外卖系统】员工信息分页查询

    当数据较多时,如果将数据在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般系统都会以分页的方式来展示列表数据。 页面发送ajax请求,将分页查询参数( page 、 pageSize 、 name )提交到服务端 服务端 Controller 接收页面提交的数据并调用 Service 查询数据 Serv

    2024年02月15日
    浏览(26)
  • Linux系统内存、磁盘占用情况查询

    #查看磁盘占用空间 显示所有磁盘的使用情况,包括磁盘的总大小、已用空间、可用空间和文件系统类型等。 #查看运行内存的占用情况 #查看进程 1、 ps 命令:该命令用于列出当前用户的进程。以下是几个常用的选项: ps -ef :列出所有进程(包括系统进程)的详细信息。

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包