【IT】Rust实现win下系统信息采集工具的开发

发布时间:2026/10/30 11:54:57

【IT】Rust实现win下系统信息采集工具的开发 一、 项目目标编写一个 Windows 客户端程序双击运行后静默生成设备信息登记表.xlsx自动提取硬件信息并通过红色底纹提示使用者需要人工补充或排查自动识别失败的数据。技术栈Rust (2021 Edition) sysinfowmirust_xlsxwriter兼容性Win10 / Win11 (64位)二、 项目目录结构system_info_excel/ ├── Cargo.toml # 项目依赖配置文件 ├── src/ │ └── main.rs # 核心逻辑代码 └── target/ # (编译后自动生成包含 release 版本的 .exe)三、 依赖配置文件 (Cargo.toml)[package] name system_info_excel version 1.0.0 edition 2021 [dependencies] sysinfo 0.30 # 获取 CPU、内存、网络、操作系统 wmi 0.13 # 获取底层硬件信息如硬盘序列号、显卡、SN serde { version 1.0, features [derive] } # wmi 的反序列化依赖 rust_xlsxwriter 0.68 # 生成 Excel 表格四、 核心逻辑代码 (src/main.rs)// 隐藏控制台黑框双击直接运行#![windows_subsystem windows]userust_xlsxwriter::{Color,Format,FormatAlign,Workbook};useserde::Deserialize;usestd::fs;usesysinfo::{CpuExt,Networks,System,SystemExt};// WMI 数据结构定义 #[derive(Deserialize)]structWin32_ComputerSystem{Manufacturer:String,Model:String,}#[derive(Deserialize)]structWin32_BIOS{SerialNumber:OptionString,}#[derive(Deserialize)]structWin32_PhysicalMedia{SerialNumber:OptionString,}#[derive(Deserialize)]structWin32_DiskDrive{Size:Optionu64,}#[derive(Deserialize)]structWin32_VideoController{Name:String,}// 错误处理辅助函数 fnsave_error_to_file(msg:str){let_fs::write(System_Info_Error.log,msg);}// 核心主函数 fnmain(){letmutsysSystem::new_all();sys.refresh_all();letnetworksNetworks::new_with_refreshed_list();letwmi_conmatchWMIConnection::new(){Ok(con)con,Err(e){save_error_to_file(format!(WMI 连接失败: {:?},e));return;}};// 1. 获取品牌及型号letbrand_modelmatchwmi_con.query::VecWin32_ComputerSystem(){Ok(data)if!data.is_empty()format!({} {},data[0].Manufacturer,data[0].Model),_未知.to_string(),};// 2. 获取设备SN放最后一列letdevice_snmatchwmi_con.query::VecWin32_BIOS(){Ok(data)if!data.is_empty(){data[0].SerialNumber.clone().unwrap_or_else(||未知.to_string())}_未知.to_string(),};// 3. 获取 CPUletcpusys.cpus().first().map(|c|c.brand().trim().to_string()).unwrap_or_else(||未知.to_string());// 4. 获取内存 (GB)lettotal_ram_gb(sys.total_memory()asf64)/1024.0/1024.0;letramformat!({:.1} GB,total_ram_gb);// 5. 获取显卡 (多个显卡用 隔离)letgpumatchwmi_con.query::VecWin32_VideoController(){Ok(gpus)if!gpus.is_empty(){gpus.iter().map(|g|g.Name.clone()).collect::VecString().join( )}_未知.to_string(),};// 6. 获取硬盘容量 (多个用 隔离)letdisk_capmatchwmi_con.query::VecWin32_DiskDrive(){Ok(disks)if!disks.is_empty(){disks.iter().map(|d|{letsize_gbd.Size.unwrap_or(0)asf64/1_073_741_824.0;format!({:.1} GB,size_gb)}).collect::VecString().join( )}_未知.to_string(),};// 7. 获取硬盘序列号 (多个用 换行符 隔离)letdisk_serialmatchwmi_con.query::VecWin32_PhysicalMedia(){Ok(media)if!media.is_empty(){letserials:VecStringmedia.iter().filter_map(|m|m.SerialNumber.clone()).map(|s|s.replace(*,).trim().to_string()).filter(|s|!s.is_empty()).collect();ifserials.is_empty(){未知.to_string()}else{serials.join(\n)}}_未知.to_string(),};// 8. 获取 MAC 地址letmutmac_list:VecStringVec::new();for(name,data)innetworks{letmacdata.mac_address().to_string();ifmac00:00:00:00:00:00||name.to_lowercase().contains(loopback){continue;}letformatted_macmac.replace(:,-).to_uppercase();letlower_namename.to_lowercase();// 判断网卡类型加中文后缀letentryiflower_name.contains(wi-fi)||lower_name.contains(wlan)||lower_name.contains(wireless){format!({} 无线,formatted_mac)}elseiflower_name.contains(bluetooth)||lower_name.contains(蓝牙){format!({} 蓝牙,formatted_mac)}elseiflower_name.contains(tap)||lower_name.contains(virtual)||lower_name.contains(tunnel){continue;// 排除虚拟网卡}else{formatted_mac};mac_list.push(entry);}letmac_addrifmac_list.is_empty(){未知.to_string()}else{mac_list.join(\n)};// 9. 获取操作系统及版本letos_versionsys.long_os_version().unwrap_or_else(||未知.to_string());// 生成 Excel letmutworkbookWorkbook::new();// 普通表头格式letheader_formatFormat::new().set_bold().set_align(FormatAlign::Center);// 红色提醒格式用于人工填写列或者自动识别失败的值letred_alert_formatFormat::new().set_align(FormatAlign::Center).set_background_color(Color::RGB(0xFFC7CE))// 浅红色背景.set_font_color(Color::RGB(0x9C0006));// 深红色字体letworksheetworkbook.add_worksheet();// 完整表头20列letheaders[序号,设备编号,设备名称,部门,责任人,品牌及型号,CPU,内存,显卡,硬盘容量,硬盘序列号,MAC地址,操作系统及版本,操作系统安装时间,密级,用途,放置地点,使用情况,购机日期启用日期,设备SN];// 写入表头for(col,header)inheaders.iter().enumerate(){let_worksheet.write_with_format(0,colasu16,*header,header_format);}// 辅助函数判断如果数据是未知或空则标红提示fnwrite_with_red_if_fail(worksheet:rust_xlsxwriter::Worksheet,row:u32,col:u16,value:str,red_format:Format,){ifvalue.is_empty()||value未知{let_worksheet.write_with_format(row,col,value,red_format);}else{let_worksheet.write(row,col,value);}}// 填写数据行let_worksheet.write(1,0,1);// 序号默认填1// 自动填入列识别失败则套用红色格式write_with_red_if_fail(worksheet,1,5,brand_model,red_alert_format);// 品牌及型号write_with_red_if_fail(worksheet,1,6,cpu,red_alert_format);// CPUwrite_with_red_if_fail(worksheet,1,7,ram,red_alert_format);// 内存write_with_red_if_fail(worksheet,1,8,gpu,red_alert_format);// 显卡write_with_red_if_fail(worksheet,1,9,disk_cap,red_alert_format);// 硬盘容量write_with_red_if_fail(worksheet,1,10,disk_serial,red_alert_format);// 硬盘序列号write_with_red_if_fail(worksheet,1,11,mac_addr,red_alert_format);// MAC地址write_with_red_if_fail(worksheet,1,12,os_version,red_alert_format);// 操作系统及版本write_with_red_if_fail(worksheet,1,19,device_sn,red_alert_format);// 设备SN放最后// 默认填入固定值的字段let_worksheet.write(1,13,-);// 操作系统安装时间let_worksheet.write(1,14,互联网);// 密级let_worksheet.write(1,15,办公);// 用途let_worksheet.write(1,17,在用);// 使用情况// 必须人工填写的列保持空字符串并强制加红底提醒设备编号、设备名称、部门、责任人、放置地点、购机日期forcolin[1,2,3,4,16,18]{let_worksheet.write_with_format(1,col,,red_alert_format);}// 设置列宽优化阅读体验let_worksheet.set_column_width(0,6);// 序号let_worksheet.set_column_width(1,12);// 设备编号let_worksheet.set_column_width(2,15);// 设备名称let_worksheet.set_column_width(3,12);// 部门let_worksheet.set_column_width(4,12);// 责任人let_worksheet.set_column_width(5,25);// 品牌及型号let_worksheet.set_column_width(6,30);// CPUlet_worksheet.set_column_width(7,15);// 内存let_worksheet.set_column_width(8,35);// 显卡let_worksheet.set_column_width(9,25);// 硬盘容量let_worksheet.set_column_width(10,35);// 硬盘序列号let_worksheet.set_column_width(11,35);// MAC地址let_worksheet.set_column_width(12,30);// 操作系统及版本let_worksheet.set_column_width(13,20);// 操作系统安装时间let_worksheet.set_column_width(14,10);// 密级let_worksheet.set_column_width(15,15);// 用途let_worksheet.set_column_width(16,20);// 放置地点let_worksheet.set_column_width(17,15);// 使用情况let_worksheet.set_column_width(18,25);// 购机日期let_worksheet.set_column_width(19,25);// 设备SN// 保存文件ifletErr(e)workbook.save(设备信息登记表.xlsx){save_error_to_file(format!(保存 Excel 失败: {:?},e));}}五、 编译与使用说明环境准备确保电脑安装了 Rust 开发环境rustup并且安装了 Visual Studio 2022 的 C 桌面开发环境用于 MSVC 链接器。创建项目在终端运行cargo new system_info_excel并进入目录。替换文件将上面的代码分别填入Cargo.toml和src/main.rs。编译运行cargo build --release。分发在target/release/目录下找到system_info_excel.exe把这个文件发给使用 Win10/11 的同事。同事双击后同一个目录下会直接生成填好硬件信息的设备信息登记表.xlsx。如果运行中遇到 WMI 权限问题或提取失败会自动生成System_Info_Error.log日志文件供排查。
延伸阅读

更多相关文章

2026/10/29 16:41:48

支付宝乘车码坐上海地铁-开票流程

1、支付宝打开【出行】定位到【上海】; 2、选择【地铁】-上海公共交通乘车码-右侧的【查看】; 3、右下角选择【乘车码服务】复制卡号; 4、打开支付宝小程序【上海地铁Metro大都会】-【电子发票】-【公共交通乘车码】; 5、选择地铁…

2026/10/29 14:58:31

蓝桥杯国赛真题解析:状态压缩动态规划解决矩阵计数问题

1. 项目概述:从一道国赛真题看状态压缩动态规划的精髓 最近在复盘历年蓝桥杯国赛的真题,2019年那道的“矩阵计数”题让我印象尤为深刻。这不仅仅是一道编程题,更像是一个窗口,让我们能窥见“状态压缩动态规划”(State …

2026/10/29 17:16:52

定制CPU上运行Doom:从交叉编译到性能验证的完整指南

“万物皆可 Doom”这句话在极客圈流传了很多年。过去几年它被反复验证:计算器、打印机、智能冰箱、键盘、法律文档、Windows 记事本,甚至生物细胞里都跑过《毁灭战士》。这次要看的,是这一类玩法里更贴近底层的一个方向:开发者在名…

2026/10/30 11:53:47

NModbus4实战拆解:Modbus RTU/TCP主从站调试工具与避坑

简介:NModbus Tools 是一套基于 NModbus4 的 Modbus 通讯辅助工具集,面向工业自动化开发者、PLC 调试人员及正在学习 Modbus 协议的读者,可用于串口与网络通信测试、请求响应报文解析、虚拟从站模拟和常见故障诊断,帮助理解设备间…

2026/10/30 11:53:47

Tecplot CFD后处理教程:云图切片流线与宏脚本批量出图

简介:《Tecplot教程合集》面向工程仿真、流体力学与科学数据可视化领域的学习者,从入门操作到脚本自动化均有覆盖,适合希望系统掌握Tecplot二维/三维绘图、后处理分析与布局定制的初级到中级用户。压缩包共收录143个文件,约119.87…

2026/10/30 11:53:47

AI工具链如何提升设计团队3倍效率

1. 设计团队效率革命:如何用一套AI工具整合三个岗位的工作流 去年接手新项目时,我发现团队里三个设计执行岗每天80%的时间都耗在重复劳动上——平面设计忙着处理基础排版,视觉设计师困在素材搜集,而创意设计师则在反复修改提案。这…

2026/10/30 11:53:47

Spring Boot实战DDD:用ArchUnit enforce分层与上下文边界

简介:本资源是一份面向软件架构师、后端开发工程师及技术团队的领域驱动设计(DDD)入门与实践指南,聚焦业务建模与技术实现的深度对齐,解决复杂业务系统中模型失真、沟通断层与架构腐化等典型问题。内容源自InfoQ中文站…

2026/10/30 11:53:47

经销商惹的祸,总部的企业负面舆情公关该怎么切割

一条门店短视频能在数小时内完成百万级曝光,而总部往往在热搜挂上后才第一次看到它。监测覆盖3000个以上平台的系统发出告警时,评论区已经有人把矛头从“这家店”转向“这个品牌”。问题出在:绝大多数总部把经销商舆情当成“别人的事”&#…

2026/10/30 11:48:46

SK-VQA:知识增强的多模态大模型训练与应用

1. SK-VQA项目概述:当多模态大模型遇上知识增强训练 在知识驱动的视觉问答(KB-VQA)领域,现有模型常面临"知识盲区"困境——当问题涉及训练数据之外的领域知识时,性能会断崖式下跌。这正是我们团队开发SK-VQA…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑