
简介HardInfo是一份基于C#实现的硬件信息获取工具源码包面向希望了解电脑配置、学习系统级开发的开发者与IT运维人员。它通过Win32 API、CPUID指令与WMI接口遍历硬件设备采集CPU型号、内存容量、硬盘与显卡型号、主板信息等数据并支持分类整理、界面展示与报告导出可用于系统优化、故障排查及兼容性评估。压缩包共27个文件约93KB以cs源码、resx与resources资源文件、exe可执行程序、pdb调试符号、csproj工程文件及sln解决方案为主另含settings、manifest等配置项结构完整可直接编译运行。目前已有223人学习下载。借助完整源码读者可掌握硬件探测的调用方式与信息整理流程理解Win32 API与WMI的配合使用并在此基础上扩展性能监控、温度检测等功能提升C#编程与系统工具开发能力。1. 拿到一台陌生机器怎么在十分钟内把硬件底细摸清楚机房新到一批二手服务器或者同事甩给你一台笔记本让你排查驱动问题第一件事往往不是装系统而是先搞清楚这台机器到底是什么配置。CPU 是几代、内存插了几条、硬盘是 NVMe 还是 SATA、网卡什么型号、屏幕分辨率多少这些信息散落在系统各处一条条敲命令既慢又容易漏。HardInfo 就是解决这个问题的它是一个轻量级的硬件信息采集工具跑起来之后把 CPU、内存、存储、网络、传感器等模块的信息汇总成一份可读报告支持图形界面和命令行两种模式。标题里的 HardInfo.zip 通常指的是它的便携包或源码压缩包解压即用不需要复杂安装。适合谁用做运维巡检的、装系统前想确认硬件的、给客户做设备台账的以及需要批量采集设备信息做资产管理的从业者。这一章先把「它到底能拿到什么」讲清楚后面再落到具体操作。2. HardInfo 能抓到哪些硬件字段从 CPU 到网络状态的采集边界2.1 核心采集模块与对应系统接口HardInfo 本身不直接读硬件寄存器它做的事情是聚合操作系统已经暴露出来的接口。在 Linux 下主要读/proc、/sys、/etc/os-release以及调用lspci、lsusb、dmidecode等外部命令在 Windows 下则通过 WMI 和注册表拿数据。理解这一点很关键因为它决定了你能拿到什么、拿不到什么。模块典型字段数据来源是否需要 root/管理员处理器型号、核心数、线程数、主频、缓存/proc/cpuinfo、WMI否内存总量、已用、单条容量与频率/proc/meminfo、dmidecode单条详情需要存储磁盘型号、容量、分区、SMART 状态/sys/block、smartctlSMART 需要网络网卡型号、MAC 地址、IP、连接状态/sys/class/net、ip 命令否显示分辨率、显卡型号、驱动版本/sys/class/drm、lspci否系统系统类型、版本、内核、主机名os-release、uname否这张表基本覆盖了热搜词里提到的「硬件型号、mac 地址、系统类型、系统版本、分辨率、网络状态」这几类需求。注意 MAC 地址和分辨率这两项前者在虚拟化环境里可能是随机生成的后者在无头服务器上根本不存在采集脚本要做空值兜底。2.2 命令行模式的最小可用命令图形界面适合单台排查但做批量采集必须用命令行。HardInfo 的命令行模式可以把报告直接输出成文本或 HTML下面是最小可用的一组操作。# 解压便携包假设拿到的是 HardInfo.zip unzip HardInfo.zip -d hardinfo cd hardinfo # 赋予执行权限 chmod x hardinfo # 生成纯文本报告输出到当前目录 ./hardinfo -r -f txt -o report.txt # 生成 HTML 报告方便直接发给客户 ./hardinfo -r -f html -o report.html参数说明-r表示生成完整报告-f指定输出格式支持 txt、html-o指定输出文件名。如果只想采集特定模块可以加-m参数指定模块名比如-m cpu,memory,network这样报告体积小、采集速度快适合定时任务。逻辑上这条命令走的是「枚举模块 → 调用对应接口 → 格式化输出」的流程。第一次跑建议不加-m先看看完整报告里有哪些字段再决定裁剪哪些。如果输出为空或者报权限错误大概率是某个模块需要提权用sudo重跑一次对比结果就能定位。2.3 把采集结果整理成资产台账单次采集出来的报告是给人看的但资产管理需要的是结构化数据。常见做法是把 HardInfo 的输出再解析一遍提取关键字段写进 CSV 或数据库。下面这段 Python 演示从文本报告里抽 CPU 型号、内存总量和 MAC 地址。import re def parse_hardinfo_report(path): with open(path, r, encodingutf-8) as f: content f.read() result {} # 提取 CPU 型号 cpu re.search(rProcessor\s*:\s*(.), content) result[cpu] cpu.group(1).strip() if cpu else unknown # 提取内存总量 mem re.search(rTotal Memory\s*:\s*(\d), content) result[memory_mb] int(mem.group(1)) if mem else 0 # 提取第一个网卡的 MAC 地址 mac re.search(rMAC Address\s*:\s*([0-9A-Fa-f:]{17}), content) result[mac] mac.group(1) if mac else unknown return result if __name__ __main__: info parse_hardinfo_report(report.txt) print(info)这段代码的关键在于正则的容错字段名在不同版本里可能有细微差异所以匹配模式要宽松一些拿不到就返回 unknown而不是直接抛异常。实际做批量采集时建议把每台机器的报告按主机名命名解析后统一写入一张表字段包括主机名、CPU、内存、MAC、系统版本、采集时间。这样后续做硬件变更对比就有基线了。3. 在 Linux 和 Windows 上分别跑通采集环境准备与权限处理3.1 Linux 下的依赖补齐与最小验证HardInfo 在 Linux 下依赖几个外部命令才能拿到完整信息缺了它们报告里对应模块会是空的。先确认这些命令是否存在。# 检查关键依赖 for cmd in lspci lsusb dmidecode smartctl; do if command -v $cmd /dev/null 21; then echo $cmd: OK else echo $cmd: MISSING fi done如果显示 MISSING按发行版装对应的包。Debian/Ubuntu 系用apt install pciutils usbutils dmidecode smartmontoolsRHEL/CentOS 系用yum install pciutils usbutils dmidecode smartmontools。装完之后重新跑一次采集对比报告里「PCI Devices」「USB Devices」「Storage」这几个模块是否从空白变成了有内容。权限方面普通用户能拿到 CPU、内存、网络的基本信息但 dmidecode 读内存条详情、smartctl 读硬盘健康状态都需要 root。我的习惯是采集脚本统一用 sudo 跑避免出现「同一台机器两次采集结果不一致」这种玄学问题。3.2 Windows 下的运行方式与 WMI 查询Windows 下 HardInfo 的便携版解压后直接双击 exe 就能跑图形界面命令行模式用hardinfo.exe -r -f html -o report.html。但 Windows 上更常见的做法是直接用 PowerShell 调 WMI因为不依赖额外工具适合写进域环境的登录脚本。# 采集核心硬件信息并输出为对象 $info [PSCustomObject]{ CPU (Get-CimInstance Win32_Processor).Name MemoryGB [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 2) MAC (Get-CimInstance Win32_NetworkAdapter | Where-Object { $_.MACAddress }).MACAddress -join ; OS (Get-CimInstance Win32_OperatingSystem).Caption Resolution (Get-CimInstance Win32_VideoController).CurrentHorizontalResolution } $info | Export-Csv -Path report.csv -NoTypeInformation -Encoding UTF8这段脚本覆盖了热搜词里提到的系统类型、系统版本、分辨率、MAC 地址。注意Win32_NetworkAdapter会返回多个网卡包括虚拟网卡所以用-join ;全部保留后续再按需过滤。分辨率在远程桌面会话里拿到的是客户端分辨率不是物理显示器分辨率这一点做资产台账时要特别标注。3.3 采集频率与触发时机的选择硬件信息不是高频变化的数据没必要每分钟采一次。常见做法是三种触发时机系统首次部署时采一次作为基线每月定时任务采一次做巡检硬件报修或变更后手动采一次做对比。定时任务用 cron 或计划任务都行关键是报告文件按「主机名_日期」命名方便回溯。# 每月 1 号凌晨 2 点采集一次写入指定目录 0 2 1 * * /opt/hardinfo/hardinfo -r -f txt -o /var/log/hardinfo/$(hostname)_$(date \%Y\%m\%d).txt这里有个细节cron 环境下的 PATH 和登录 shell 不一样脚本里最好用绝对路径否则会出现「手动跑没问题、定时跑就空白」的经典翻车场景。4. 采集脚本翻车现场五个高频坑与排查路径4.1 现象报告里内存只有总量没有单条容量和频率原因dmidecode 需要 root 权限普通用户执行时该模块静默跳过不报错但字段为空。解决采集命令前加 sudo或者给采集脚本配置免密 sudo 权限。验证方法是分别用普通用户和 root 各跑一次diff 两份报告就能看到差异。4.2 现象MAC 地址每次采集都不一样原因采集到了虚拟网卡或容器网卡的 MAC这类网卡的地址是动态生成的。另外有些无线网卡开启了 MAC 随机化功能。解决过滤掉虚拟网卡只保留物理网卡。Linux 下可以判断/sys/class/net/接口/device是否存在存在才是物理设备。Windows 下过滤名称里带 Virtual、VMware、Hyper-V 的适配器。4.3 现象分辨率字段为空或显示 0x0原因无头服务器没有接显示器或者采集时处于远程会话中系统没有报告物理分辨率。解决这类字段做空值处理不要写进资产台账的必填项。如果确实需要显示器信息得在接显示器的状态下采集或者从显示器的 EDID 信息里读。4.4 现象报告生成成功但内容截断存储模块只有前两块盘原因某些版本的 HardInfo 对磁盘数量有默认上限或者 smartctl 查询超时导致后续磁盘被跳过。解决检查是否有超时日志把采集超时时间调大或者拆成多次采集每次用-m只采一个模块最后合并报告。4.5 现象同一台机器两次采集的 CPU 主频不一样原因CPU 主频是动态变化的采集到的是瞬时值不是标称频率。解决资产台账里记录 CPU 型号和核心数就够了主频字段要么不记要么记标称频率从型号推断不要记瞬时值否则每次对比都显示「变更」纯属给自己找麻烦。5. 把采集结果用起来从单机报告到批量资产对比的一个实用技巧采集本身不难难的是让数据持续有用。我自己的习惯是维护一份「基线报告」每次新采集的报告跟基线做 diff只关注变化的字段。下面这个脚本演示怎么对比两份报告输出差异项。def diff_reports(old_path, new_path): old parse_hardinfo_report(old_path) new parse_hardinfo_report(new_path) changes [] for key in old: if old[key] ! new.get(key): changes.append(f{key}: {old[key]} - {new.get(key)}) if changes: print(检测到硬件变更) for c in changes: print( c) else: print(无变更) if __name__ __main__: diff_reports(baseline.txt, report.txt)这个思路的价值在于硬件变更往往意味着有人动了机器可能是加了内存、换了硬盘、插了外接网卡。定期跑 diff比人工翻报告快得多。参数上基线文件要选一台机器状态最稳定时的报告不要拿刚装完系统、驱动还没装全的报告当基线否则第一次 diff 会全是噪音。再进阶一点可以把多台机器的报告汇总成一张总表按 CPU 型号或内存容量分组快速看出哪些机器配置偏低需要升级。这一步用 pandas 几行就能搞定核心是把解析函数返回的字典转成 DataFrame然后 groupby 聚合。最后说个我踩过的坑早期做采集时没固定报告格式不同版本 HardInfo 输出的字段名不一样导致解析脚本频繁改。后来统一锁定一个版本把二进制和脚本一起打包分发才彻底解决。硬件采集这件事工具版本的一致性比功能多寡重要得多。希望帮到你。本文还有配套的精品资源点击获取