简介这是一套面向企业IT运维人员与设备管理者的电脑硬件信息采集与资产管理工具源码基于C#与.NET框架开发可一键获取CPU、内存、硬盘、显卡、主板等核心硬件的型号与规格参数并支持资产分类存储、增删改查及使用状态记录帮助解决企业硬件信息手工登记繁琐、资产台账更新滞后的问题。资源包共32个文件以18个cs源码文件为核心配合5个resx界面资源、csproj工程文件与sln解决方案另含README说明、LICENSE授权及图标等辅助文件整体约115KB结构紧凑便于二次开发与功能扩展。目前已有327人学习下载。通过阅读源码读者可掌握硬件信息采集的实现思路、桌面端资产管理模块的目录组织方式以及基于.NET的工程搭建与界面资源管理方法适合作为企业IT工具开发的学习参考或功能定制起点。1. 一键收集电脑硬件信息企业IT资产管理的真实起点很多企业IT运维的日常是这样的财务部报修一台电脑你问型号对方说“就那个黑色的”行政要盘点设备你打开Excel发现上次更新还是去年老板问“公司到底有多少台能跑Win11的机器”你只能回一句“我查查”。问题不在于人不负责而在于收集硬件信息这件事本身太琐碎——CPU型号、内存条数量、硬盘序列号、主板编号、网卡MAC、显示器尺寸每台机器手动抄一遍一百台就是一百遍。“一键收集电脑硬件信息”要解决的就是这个场景在员工电脑上跑一个脚本或小工具几秒钟内把关键硬件资产字段全部抓出来汇总成结构化数据直接进资产表。它适合中小企业IT、兼职运维、行政兼管设备的人也适合需要做设备台账、保修管理、淘汰评估的团队。核心诉求只有三个快、准、不打扰员工。2. 硬件信息到底该采哪些字段从资产台账反推采集清单2.1 资产管理的四个最小字段组做硬件信息收集最容易翻车的地方不是技术而是“采了一堆用不上的”。我见过有人把GPU核心频率、风扇转速全抓下来结果资产表里根本没人看。正确的做法是从资产台账反推你需要回答什么问题就采什么字段。企业设备资产管理通常要回答四类问题这台机器是谁的、什么配置、值多少钱、还能不能用。对应到硬件字段最小可用集合是四组第一组是身份标识计算机名、当前登录用户名、设备序列号SN、主板UUID。序列号是保修和唯一性判断的关键主板UUID在重装系统后通常不变适合做长期追踪。第二组是核心配置CPU型号、物理核心数、逻辑处理器数、内存总容量、内存插槽已用/总数、硬盘型号和容量、硬盘序列号。内存插槽信息特别有用——判断能不能加内存看已用和总数就够了。第三组是网络与外围有线网卡MAC、无线网卡MAC、IP地址、显示器型号和尺寸。MAC地址在资产系统里常被当作辅助唯一标识。第四组是系统环境操作系统版本、系统安装日期、BIOS版本和日期。BIOS日期能粗略判断主板批次系统安装日期对评估重装频率有帮助。提示字段不是越多越好。每多一个字段就多一份解释成本和隐私风险。先定台账模板再定采集清单。2.2 用PowerShell在本地跑通最小采集命令Windows环境下最稳妥的方式是PowerShell调用WMI/CIM。不需要装任何第三方软件系统自带员工也不会有安装权限的顾虑。下面是一段可以直接复制运行的最小采集脚本# 采集核心硬件信息并输出为对象 $asset [PSCustomObject]{ ComputerName $env:COMPUTERNAME UserName $env:USERNAME SerialNumber (Get-CimInstance Win32_BIOS).SerialNumber MotherboardUUID (Get-CimInstance Win32_ComputerSystemProduct).UUID CPU (Get-CimInstance Win32_Processor).Name PhysicalCores (Get-CimInstance Win32_Processor).NumberOfCores LogicalProcessors (Get-CimInstance Win32_Processor).NumberOfLogicalProcessors MemoryGB [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 1) MemorySlotsUsed (Get-CimInstance Win32_PhysicalMemory | Measure-Object).Count MemorySlotsTotal (Get-CimInstance Win32_PhysicalMemoryArray).MemoryDevices DiskModel (Get-CimInstance Win32_DiskDrive | Select-Object -First 1).Model DiskSerial (Get-CimInstance Win32_DiskDrive | Select-Object -First 1).SerialNumber DiskSizeGB [math]::Round((Get-CimInstance Win32_DiskDrive | Select-Object -First 1).Size / 1GB, 0) OSVersion (Get-CimInstance Win32_OperatingSystem).Caption InstallDate (Get-CimInstance Win32_OperatingSystem).InstallDate BIOSVersion (Get-CimInstance Win32_BIOS).SMBIOSBIOSVersion BIOSDate (Get-CimInstance Win32_BIOS).ReleaseDate } $asset | Format-List这段脚本的逻辑很直白用Get-CimInstance逐个查询WMI类把结果塞进一个自定义对象。Win32_BIOS提供序列号和BIOS信息Win32_ComputerSystemProduct提供UUIDWin32_Processor提供CPU细节Win32_PhysicalMemory统计内存条数量Win32_PhysicalMemoryArray给出插槽总数Win32_DiskDrive取第一块物理硬盘的信息。参数方面[math]::Round(..., 1)把字节转成GB并保留一位小数避免资产表里出现一长串数字。Select-Object -First 1只取第一块硬盘因为多数办公机只有一块如果要做磁盘阵列或多硬盘采集需要改成循环遍历。运行方式在目标机器上以管理员身份打开PowerShell直接粘贴执行。普通用户权限下部分字段可能为空尤其是序列号和UUID所以建议用管理员权限或通过域推送。2.3 把结果落成CSV并追加到共享台账单台机器跑完只是第一步资产管理的价值在于汇总。把上面的对象导出成CSV追加到共享目录的台账文件里# 导出为CSV并追加到共享台账 $csvPath \\server\share\IT资产台账.csv $asset | Export-Csv -Path $csvPath -NoTypeInformation -Append -Encoding UTF8-Append保证多次运行不会覆盖旧数据-NoTypeInformation去掉多余的type行-Encoding UTF8避免中文计算机名乱码。如果共享目录需要认证先net use挂载或者用有权限的域账户运行。常见做法是把这个脚本包成bat或快捷方式让员工双击运行或者通过组策略、远程管理工具批量推送。采集频率建议每季度一次或者在设备变更时手动触发。3. 批量采集的落地路径从单机脚本到全网资产表3.1 域环境用Invoke-Command远程批量采集如果公司有域环境一台台跑脚本太慢。用Invoke-Command可以一次性对多台机器远程采集# 从域中获取所有计算机远程批量采集 $computers Get-ADComputer -Filter * | Select-Object -ExpandProperty Name $results Invoke-Command -ComputerName $computers -ScriptBlock { [PSCustomObject]{ ComputerName $env:COMPUTERNAME SerialNumber (Get-CimInstance Win32_BIOS).SerialNumber CPU (Get-CimInstance Win32_Processor).Name MemoryGB [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 1) DiskModel (Get-CimInstance Win32_DiskDrive | Select-Object -First 1).Model OSVersion (Get-CimInstance Win32_OperatingSystem).Caption } } -ErrorAction SilentlyContinue $results | Export-Csv -Path \\server\share\批量资产.csv -NoTypeInformation -Encoding UTF8这里的关键参数是-ErrorAction SilentlyContinue因为总会有离线机器、防火墙拦截或权限不足的机器不加这个参数整个批量任务会中断。Get-ADComputer -Filter *拉取域内所有计算机实际使用时可以加-SearchBase限定OU避免把服务器也扫进来。远程采集的前提是目标机器开启了WinRM并且执行账户有远程管理权限。域环境通常默认满足工作组环境需要额外配置Enable-PSRemoting和信任关系。3.2 无域环境用共享目录计划任务兜底没有域的中小企业更常见。这时候远程批量走不通但可以用“共享目录计划任务”的方式做半自动采集第一步在文件服务器上建一个共享目录给“Domain Users”或“Everyone”写入权限。第二步把采集脚本放到共享目录写一个bat包装echo off powershell -ExecutionPolicy Bypass -File \\server\share\collect.ps1第三步通过每台机器上的计划任务每月1号开机后延迟5分钟执行这个bat。脚本内部把CSV写到共享目录文件名带上计算机名避免冲突$outFile \\server\share\assets\$env:COMPUTERNAME.csv $asset | Export-Csv -Path $outFile -NoTypeInformation -Encoding UTF8这种方式不需要域不需要远程权限缺点是依赖员工开机。实际落地时我一般会加一个“如果共享目录不可达就写到本地临时目录”的兜底逻辑下次开机再补传。3.3 采集频率与字段更新策略硬件信息不是每天变的但资产表需要保持可用。我的经验是分三层更新季度全量采集所有机器跑一遍完整脚本覆盖全部字段。月度增量采集只采序列号、内存、硬盘、系统版本这几个关键字段速度快对员工打扰小。事件触发采集新入职、换机、报修时手动跑一次确保台账及时更新。字段更新策略上序列号和UUID作为主键不覆盖其他字段以最新采集为准。如果发现同一序列号出现不同配置大概率是硬盘被换过或者内存加过这时候需要在台账里加备注而不是直接覆盖。4. 避坑与排查硬件信息采集最常见的五个翻车现场4.1 序列号采出来是“To be filled by O.E.M.”现象脚本跑完SerialNumber字段显示“To be filled by O.E.M.”或者“Default string”根本不是真实序列号。原因部分组装机、白牌机的主板BIOS没有写入序列号WMI读到的就是默认占位符。品牌机通常正常DIY机器翻车率很高。解决用主板UUID作为替代唯一标识或者结合MAC地址做组合键。如果必须要有序列号只能人工补录或者从机箱标签上抄。采集脚本里可以加一个判断遇到占位符就标记为“需人工确认”。4.2 普通用户权限下内存插槽数读不到现象用普通员工账户运行脚本MemorySlotsTotal为空或者内存条数量不对。原因Win32_PhysicalMemoryArray和部分Win32_PhysicalMemory字段需要管理员权限才能读取。普通用户权限下WMI会返回空值。解决要么用管理员权限运行要么通过组策略以系统权限推送。如果只能普通权限内存插槽信息就放弃只采总容量。总容量在普通权限下通常可读。4.3 远程采集时大量机器返回“拒绝访问”现象Invoke-Command批量执行后一半机器报“Access is denied”或“WinRM cannot complete the operation”。原因目标机器防火墙没放行WinRM或者执行账户不在目标机器的管理员组里。工作组环境下还涉及信任问题。解决域环境用组策略统一放行WinRM端口和配置监听器。工作组环境建议放弃远程采集改用共享目录计划任务的方式。排查时先用Test-WSMan -ComputerName 目标机确认WinRM是否可达。4.4 CSV中文乱码计算机名变成问号现象导出的CSV用Excel打开中文计算机名或用户名显示乱码。原因PowerShell默认导出编码可能是ASCII或UTF8无BOMExcel对无BOM的UTF8识别有问题。解决导出时加-Encoding UTF8如果还乱码改用Export-Csv后手动转成带BOM的UTF8或者直接用Out-File -Encoding UTF8写自定义格式。更省事的办法是让台账用GB2312编码但跨平台兼容性差。我一般统一用UTF8 with BOM。4.5 硬盘序列号采到的是乱码或空值现象DiskSerial字段出现一串看不懂的字符或者直接为空。原因部分NVMe硬盘或RAID控制器下的硬盘WMI返回的序列号格式不标准甚至需要厂商专用工具才能读。USB外接硬盘也会干扰Select-Object -First 1的结果。解决优先采系统盘所在物理磁盘的序列号用Win32_DiskDrive关联Win32_DiskPartition和Win32_LogicalDisk找到系统盘对应的物理盘。如果还是读不到用硬盘型号容量计算机名做组合标识。NVMe硬盘可以尝试Get-PhysicalDisk命令它比WMI更可靠。5. 让资产表自己说话用采集数据做设备淘汰判断采集本身不是目的让数据支撑决策才是。我习惯在资产表里加两列计算字段设备年龄和配置达标标记。设备年龄用当前日期减去BIOS日期或系统安装日期粗略估算使用年限。配置达标标记用内存和CPU判断能不能跑当前主力系统。# 在已有CSV基础上追加评估列 $assets Import-Csv \\server\share\IT资产台账.csv $today Get-Date $evaluated $assets | ForEach-Object { $biosDate [datetime]::Parse($_.BIOSDate) $ageYears [math]::Round(($today - $biosDate).TotalDays / 365, 1) $memGB [double]$_.MemoryGB [PSCustomObject]{ ComputerName $_.ComputerName SerialNumber $_.SerialNumber AgeYears $ageYears MemoryGB $memGB NeedUpgrade if ($memGB -lt 8 -or $ageYears -gt 5) { 是 } else { 否 } } } $evaluated | Export-Csv \\server\share\设备评估.csv -NoTypeInformation -Encoding UTF8这段逻辑里AgeYears超过5年或者内存小于8GB就标记为需要升级或淘汰。阈值可以根据公司实际情况调整比如设计部门门槛提到16GB行政岗位8GB就够。BIOSDate解析时要注意区域格式如果报错就加-Format参数指定。进阶用法是把评估结果和报修记录关联起来同一台机器半年内报修三次以上即使配置达标也建议列入淘汰清单。这个判断用Excel的COUNTIFS就能做不需要写代码。我自己的习惯是每季度跑完采集后把“NeedUpgrade是”的机器单独导一份给采购附上序列号和当前配置。这样采购不用猜直接按单子询价。踩过的坑是早期没加序列号结果采购买错内存条型号血泪经验就是资产表里序列号和内存插槽信息一个都不能少。希望帮到你。本文还有配套的精品资源点击获取