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

基于Debian的Linux主机执行PowerShell远程WMI采集任务的最佳方案

最佳实践方案

优先推荐基于Python的原生WMI(DCOM)远程调用方案,无需目标Windows主机额外配置,完全适配原有需求;同时提供其他可选方案供参考:

1. Python + Impacket 原生WMI调用(首选)

Impacket库支持直接通过DCOM协议远程访问Windows的WMI服务,和你原来的PowerShell脚本使用的协议一致,域内Windows主机默认开启WMI服务,无需额外配置。

步骤1:在Debian上安装依赖

# 安装Python3和pip
sudo apt update && sudo apt install python3 python3-pip -y
# 安装Impacket库
pip3 install impacket

步骤2:Python实现代码

from impacket.dcerpc.v5.dcom import wmi
from impacket.dcerpc.v5.dtypes import NULL
import json

def fetch_win32_product(host, username, password):
    conn = wmi.WMIConnection()
    try:
        # 建立WMI连接
        conn.connect(host, username, password, NULL, NULL, NULL)
        wmi_service = conn.get_service()
        # 执行WMI查询
        query = "SELECT * FROM Win32_Product"
        query_results = wmi_service.exec_query(query)
        
        # 转换结果为字典列表并排序
        product_list = []
        for item in query_results:
            product_info = {prop.Name: prop.Value for prop in item.Properties_}
            product_list.append(product_info)
        sorted_products = sorted(product_list, key=lambda x: x["Name"])
        
        # 返回JSON格式结果
        return json.dumps(sorted_products, indent=2, ensure_ascii=False)
    finally:
        # 确保断开连接
        conn.disconnect()

# 调用示例
if __name__ == "__main__":
    DOMAIN_USER = "你的域用户名"
    USER_PASSWORD = "VerySecurePassword"
    TARGET_HOST = "192.168.0.101"  # 或目标主机名

    result = fetch_win32_product(TARGET_HOST, DOMAIN_USER, USER_PASSWORD)
    print(result)

优势

  • 无需目标主机做任何额外配置,直接利用域内默认开启的WMI服务
  • 完全匹配原有PowerShell脚本的功能逻辑,支持所有WMI类查询
  • Debian上部署成本极低,仅需Python和Impacket依赖

2. 可选:Python + PyWinRM(需目标主机配置WinRM)

如果可以接受一次性批量配置域内Windows主机的WinRM服务,PyWinRM是更现代、安全的选择(支持HTTPS加密传输)。

步骤1:批量配置WinRM(域环境下用组策略)

通过域组策略执行以下脚本,一键开启所有域内主机的WinRM:

winrm quickconfig -quiet
winrm set winrm/config/service/auth @{Basic="true"}
winrm set winrm/config/service @{AllowUnencrypted="true"}  # 生产环境建议配置HTTPS加密

步骤2:安装依赖并编写代码

pip3 install pywinrm
import winrm
import json

def fetch_win32_product_winrm(host, username, password):
    # 建立WinRM会话(默认HTTP端口5985,HTTPS为5986)
    session = winrm.Session(host, auth=(username, password))
    # 执行PowerShell查询并转为JSON
    ps_script = """
    Get-WmiObject Win32_Product | Sort-Object Name | ConvertTo-Json -Depth 10
    """
    result = session.run_ps(ps_script)
    
    if result.status_code == 0:
        return json.dumps(json.loads(result.std_out.decode("utf-8")), indent=2, ensure_ascii=False)
    else:
        raise RuntimeError(f"执行失败: {result.std_err.decode('utf-8')}")

# 调用示例
if __name__ == "__main__":
    DOMAIN_USER = "你的域用户名"
    USER_PASSWORD = "VerySecurePassword"
    TARGET_HOST = "192.168.0.101:5985"

    result = fetch_win32_product_winrm(TARGET_HOST, DOMAIN_USER, USER_PASSWORD)
    print(result)

3. 备选:修复Linux版PowerShell的WMI调用

如果一定要保留PowerShell脚本,问题通常出在Kerberos认证配置上,可按以下步骤修复:

# 在Debian上安装Kerberos客户端
sudo apt install krb5-user -y
# 获取域用户票据
kinit your_username@YOUR_DOMAIN.COM
# 执行PowerShell命令(使用Kerberos认证)
pwsh -Command '$cred = Get-Credential; Get-CimInstance Win32_Product -ComputerName 192.168.0.101 -Credential $cred -Authentication Kerberos'

内容的提问来源于stack exchange,提问作者Иван Гресь

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:12:03