You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C++客户端使用osquery获取操作系统信息?

使用C++调用osquery获取系统信息

核心思路

osquery本身提供原生C++ API,无需通过扩展方案,直接链接osquery开发库就能执行SQL查询获取系统信息,核心是利用osquery::SQL接口和相关核心组件完成查询逻辑。

步骤实现

1. 环境准备

  • 安装osquery开发依赖:确保系统中存在osquery的头文件(如osquery/sql.h、osquery/core/query.h)和静态/动态库(如libosquery_core.so、libosquery_sql.so),可通过源码编译或包管理器(Linux下如osquery-dev包)获取。
  • 编译时需链接osquery的核心库,具体库名根据版本和安装方式调整。

2. 基础代码示例

以下是直接查询操作系统版本和指定用户信息的C++代码:

#include <osquery/sql.h>
#include <osquery/core/query.h>
#include <iostream>
#include <vector>
#include <map>

int main() {
    // 初始化osquery核心环境
    osquery::Initializer osquery_init;

    // 查询操作系统版本信息
    auto os_version_result = osquery::SQL::selectAllFrom("os_version");
    if (os_version_result.ok()) {
        std::cout << "=== 操作系统信息 ===" << std::endl;
        for (const auto& row : os_version_result.rows()) {
            for (const auto& field : row) {
                std::cout << field.first << ": " << field.second << std::endl;
            }
            std::cout << "---------------------" << std::endl;
        }
    } else {
        std::cerr << "查询os_version失败: " << os_version_result.getMessage() << std::endl;
    }

    // 查询root用户信息(带WHERE条件)
    auto root_user_result = osquery::SQL::selectAllFrom("users", "username = 'root'");
    if (root_user_result.ok()) {
        std::cout << "\n=== root用户信息 ===" << std::endl;
        for (const auto& row : root_user_result.rows()) {
            for (const auto& field : row) {
                std::cout << field.first << ": " << field.second << std::endl;
            }
        }
    } else {
        std::cerr << "查询users失败: " << root_user_result.getMessage() << std::endl;
    }

    return 0;
}

3. 编译命令示例(Linux)

假设代码文件名为osquery_cpp_client.cpp,编译命令如下:

g++ osquery_cpp_client.cpp -o osquery_cpp_client -losquery_core -losquery_sql -losquery_utils

注:实际链接的库可能因osquery版本差异略有调整,需根据本地环境适配。

关键说明

  • osquery::Initializer必须调用,用来初始化osquery的注册表、配置等核心组件。
  • osquery::SQL::selectAllFrom是便捷查询接口,第一个参数为osquery表名,第二个可选参数为SQL WHERE条件语句。
  • 查询结果QueryData本质是std::vector<std::map<std::string, std::string>>,可直接遍历获取字段名和对应值。
  • 全程无需扩展开发,仅通过osquery核心API即可完成系统信息检索。

内容的提问来源于stack exchange,提问作者Baab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:15:51