ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

【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日志文件供排查。
返回列表