基于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,提问作者Иван Гресь
相关产品推荐
相关产品推荐

