1. 项目背景与核心价值
去年给某制造业客户做内网安全审计时,发现他们IT部门连最基本的资产台账都理不清楚。运维主管挠着头说:"每次盘点到一半就乱了,Excel表格传着传着就出现十几个版本..."这种场景在中小企业实在太常见了。于是花了两个周末,用Python写了这个终端资产采集工具,现在连行政小妹都能一键生成标准化的设备清单。
这个系统的核心价值在于:
- 单机模式下:双击运行即生成包含硬件配置、软件清单、网络信息的标准报告
- 局域网模式:自动发现存活主机,批量采集数据并生成统一台账
- 完全绿色免安装,生成的Excel报告自带数据校验和版本控制
2. 系统架构设计思路
2.1 技术选型决策
选择Python+PyQt的方案主要基于:
- 跨平台需求:客户环境存在Win7-Win11混合情况
- 依赖最小化:用pyinstaller打包后仅12MB
- 开发效率:资产采集涉及多模块协作,Python生态完善
关键库说明:
python复制import wmi # Windows硬件信息采集
import psutil # 跨平台系统监控
import nmap # 局域网扫描
import openpyxl # Excel报告生成
2.2 数据采集模块设计
采用分层采集策略:
- 基础层:CPU/内存/磁盘等硬件信息(通过WMI)
- 系统层:OS版本/补丁/用户(调用系统API)
- 应用层:安装软件列表(解析注册表/包管理器)
- 网络层:IP/MAC/开放端口(混合使用psutil和原生socket)
特别注意:注册表读取需要处理32/64位软件路径差异(后面会详细说明)
3. 核心功能实现细节
3.1 硬件信息采集优化
Windows平台最全能的还是WMI,但直接查询Win32_Processor等类可能耗时3-5秒。通过预编译WQL语句提升效率:
python复制def get_cpu_info():
c = wmi.WMI()
# 预编译查询语句
cpu = c.query("SELECT Name,NumberOfCores FROM Win32_Processor")[0]
return {
'model': cpu.Name.split('@')[0].strip(),
'cores': cpu.NumberOfCores
}
实测对比:
| 查询方式 | 耗时(ms) |
|---|---|
| 原生WMI调用 | 3200 |
| 预编译WQL | 800 |
3.2 局域网扫描策略
采用nmap的ARP扫描+端口指纹识别组合方案:
python复制def scan_local_network():
nm = nmap.PortScanner()
# -sn参数禁用端口扫描,仅主机发现
nm.scan(hosts='192.168.1.0/24', arguments='-sn')
return nm.all_hosts()
优化点:
- 先通过ARP扫描快速建立存活主机列表
- 对在线主机二次扫描获取详细资产信息
- 设置超时避免卡死(实测500ms超时最佳)
4. 典型问题解决方案
4.1 杀毒软件误报处理
Pyinstaller打包的程序常被误判为病毒。通过以下措施解决:
- 添加数字签名(成本约200元/年)
- 在代码中嵌入厂商白名单声明
- 编译时使用--onefile --windowed参数
4.2 多版本Python环境冲突
客户机可能装有Anaconda等环境,解决方案:
bash复制# 打包时指定最低Python版本
pyinstaller --python-version 3.6 --onefile collector.py
5. 实战应用案例
某物流公司部署后实现:
- 资产盘点时间从3人周 → 0.5人天
- 发现23台未登记设备(包括前任IT私接的矿机...)
- 自动识别出8台未打补丁的Win7终端
报告模板包含以下sheet:
- 硬件汇总(含SN码)
- 软件白名单比对
- 网络拓扑图
- 安全风险项
6. 进阶开发建议
对于需要持续监控的场景,可以:
- 添加计划任务定期运行(注意避开业务高峰)
- 集成到SaltStack/Ansible等运维工具链
- 增加API接口对接CMDB系统
代码中预留的扩展点:
python复制# plugins/__init__.py
def load_plugins():
# 支持自定义采集模块
pass
这个项目给我的最大启示是:好的工具不在于技术多先进,而在于真正解决一线人员的痛点。现在客户IT部门最年轻的实习生都能独立完成季度资产盘点了,这才是最有成就感的。
