.NET Bioss相关数据读写

news/2025/3/9 10:34:22/文章来源:https://www.cnblogs.com/kybs0/p/18613343

本文我们介绍针对Bios如何读取、写入数据,比如最常见的SN读取以及烧录

WMI查询

先看看WMI方式,可以用于查询和管理Windows系统的各种信息,包括读取BIOS信息

WMI-Win32_BIOS,可以查看Bios版本、制造商以及Bios Sn等:

 1             var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS");
 2             Console.WriteLine("Win32_BIOS 获取bios信息:");
 3             foreach (var baseObject in searcher.Get())
 4             {
 5                 Console.WriteLine("Manufacturer: " + baseObject["Manufacturer"]);
 6                 Console.WriteLine("Version: " + baseObject["Version"]);
 7                 Console.WriteLine("SMBIOS BIOS Version: " + baseObject["SMBIOSBIOSVersion"]);
 8                 Console.WriteLine("Name: " + baseObject["Name"]);
 9                 Console.WriteLine("Release Date: " + baseObject["ReleaseDate"]);
10                 Console.WriteLine("Serial Number: " + baseObject["SerialNumber"]);
11                 Console.WriteLine("Status: " + baseObject["Status"]);
12                 Console.WriteLine("Caption: " + baseObject["Caption"]);
13                 Console.WriteLine("Build Number: " + baseObject["BuildNumber"]);
14                 Console.WriteLine("Code Set: " + baseObject["CodeSet"]);
15                 Console.WriteLine("Current Language: " + baseObject["CurrentLanguage"]);
16                 Console.WriteLine("Description: " + baseObject["Description"]);
17                 Console.WriteLine("Embedded Controller Major Version: " + baseObject["EmbeddedControllerMajorVersion"]);
18                 Console.WriteLine("Embedded Controller Minor Version: " + baseObject["EmbeddedControllerMinorVersion"]);
19                 Console.WriteLine("Identification Code: " + baseObject["IdentificationCode"]);
20                 Console.WriteLine("Installable Languages: " + baseObject["InstallableLanguages"]);
21                 Console.WriteLine("Install Date: " + baseObject["InstallDate"]);
22                 Console.WriteLine("Language Edition: " + baseObject["LanguageEdition"]);
23                 Console.WriteLine("List Of Languages: " + baseObject["ListOfLanguages"]);
24                 Console.WriteLine("Other Target OS: " + baseObject["OtherTargetOS"]);
25                 Console.WriteLine("Primary BIOS: " + baseObject["PrimaryBIOS"]);
26                 Console.WriteLine("System BIOS Major Version: " + baseObject["SystemBiosMajorVersion"]);
27                 Console.WriteLine("System BIOS Minor Version: " + baseObject["SystemBiosMinorVersion"]);
28                 Console.WriteLine("Target Operating System: " + baseObject["TargetOperatingSystem"]);29             }
30             searcher.Dispose();

也可以直接使用PowerShell:Get-WmiObject -Class Win32_BIOS,以下是主要参数信息

  • SMBIOSBIOSVersion:BIOS版本号

  • Manufacturer:BIOS制造商

  • Name:BIOS名称

  • ReleaseDate:BIOS发布的日期

  • SerialNumber:系统序列号

  • Version:BIOS版本

这是个人电脑获取结果:

电脑-系统信息中的Bios版本信息,是以上面Bios制造商+Bios版本+发布日期拼接显示:

WMI-Win32_BaseBoard,可以获取主板SN以及主板制造商:

 1             var searcher1 = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
 2             Console.WriteLine("Win32_BaseBoard获取bios信息:");
 3             foreach (var baseObject in searcher1.Get())
 4             {
 5                 Console.WriteLine("Board Serial Number: " + baseObject["SerialNumber"]);
 6                 Console.WriteLine("Manufacturer: " + baseObject["Manufacturer"]);
 7                 Console.WriteLine("Product Name: " + baseObject["Product"]);
 8                 Console.WriteLine("Version: " + baseObject["Version"]);
 9             }
10             searcher1.Dispose();

也可以使用PowerShell查看,Get-WmiObject -Class Win32_BaseBoard

个人电脑获取结果:

另外,使用命令行工具,wmic bios get name, serialnumber, version也可以获取BIOS的基本信息

Ami读写

获取Bios信息也可以使用AmiWin工具,同时此工具也可以用于数据写入。通过该工具可以轻松地自定义系统UUID、调整DMI信息,从而满足各种特定的系统需求比如指定BIOS位置的数据。其技术实现主要依赖于对BIOS固件的底层访问和修改

AMI全称American Megatrends Inc.,以BIOS/UEFI固件解决方案闻名。

读取指定位置数据:

 1     private static string ReadBiosData(string command)
 2     {
 3         var amiExePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AmiBios", "AMIDEWINx64.EXE");
 4         var startInfo = new ProcessStartInfo
 5         {
 6             FileName = $"\"{amiExePath}\"",
 7             Arguments = command,
 8             Verb = "runas",
 9             UseShellExecute = false,
10             RedirectStandardError = true,
11             RedirectStandardInput = true,
12             RedirectStandardOutput = true,
13             CreateNoWindow = true,
14             WindowStyle = ProcessWindowStyle.Hidden
15         };
16         using var process = Process.Start(startInfo);
17         if (process == null) return "";
18         process.WaitForExit();
19         string output = process.StandardOutput.ReadToEnd();
20 
21         if (string.IsNullOrWhiteSpace(output)) return "读取输出结果为空";
22         string[] inputs = output.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
23         string targetOutput = inputs.FirstOrDefault(p => p.Contains(command));
24         if (targetOutput == null) return $"输出数据:{output}未找到指定Key[{command}]的目标输出";
25         string value = ExtractMiddleContent(targetOutput, "\"", "\"");
26         return value;
27     }
28     private static string ExtractMiddleContent(string source, string begin, string end)
29     {
30         var rg = new Regex("(?<=(" + begin + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline);
31         return rg.Match(source).Value;
32     }

指定位置写入数据:

 1     private static string WriteBiosData(string command, string data)
 2     {
 3         var amiExePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AmiBios", "AMIDEWINx64.EXE");
 4         var args = $"{command} \"{data}\"";
 5         var startInfo = new ProcessStartInfo
 6         {
 7             FileName = $"\"{amiExePath}\"",
 8             Arguments = args,
 9             Verb = "runas",
10             UseShellExecute = false,
11             RedirectStandardError = true,
12             RedirectStandardInput = true,
13             RedirectStandardOutput = true,
14             CreateNoWindow = true,
15             WindowStyle = ProcessWindowStyle.Hidden
16         };
17         using var process = Process.Start(startInfo);
18         if (process == null) return "";
19         process.WaitForExit();
20         string output = process.StandardOutput.ReadToEnd();
21         if (string.IsNullOrWhiteSpace(output)) return "写入输出结果为空";
22         string[] inputs = output.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
23         string targetOutput = inputs.FirstOrDefault(p => p.Contains(command));
24         if (targetOutput == null) return $"输出数据:{output}未找到指定指令[{command}]的目标输出";
25         return "成功";
26     }

下面使用AMI,对/BS位置测试读写:

 1     private void AmiReadButton_OnClick(object sender, RoutedEventArgs e)
 2     {
 3         var boardSn = ReadBiosData("/BS");
 4         Console.WriteLine($"读取/BS:{boardSn}");
 5 
 6         var result = WriteBiosData("/BS", "TEST");
 7         Console.WriteLine($"写入/BS:{result}");
 8         var boardSnNew = ReadBiosData("/BS");
 9         Console.WriteLine($"读取/BS:{boardSnNew}");
10     }

上方Demo见仓库:https://github.com/kybs00/BiosDataDemo

值得说明的是, Bios数据写入是一个高风险操作,在操作要避免断电,不然可能因为错误的BIOS文件导致一堆的启动问题

 

参考文章:

AMIDEWINx64 v5.27:BIOS修改与DMI编辑的利器-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860535.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

家居强电电路模拟程序总结

一、前言:这两次的PTA作业第一次是以前两次家居强电电路模拟程序为基础所扩展的,在上一次作业的基础上增加了一个新的互斥开关,互斥开关的电路符号为H,其12引脚之间电阻为5欧,13引脚之间电阻为10欧,还增加了一个新的受控窗帘,受控窗帘的电路符号为S,窗帘电阻为15欧,其…

Python 正则表达式进阶用法:字符集与字符范围详解

Python 正则表达式进阶用法:字符集与字符范围详解 正则表达式是文本处理和数据清洗中不可或缺的工具。在前面的学习中,我们已经了解了基本的正则表达式匹配,如匹配单个字符、字符串开始和结束的位置等。今天,我们将进入正则表达式的一个进阶主题:字符集(Character Set)和…

如何免费使用 Termius Pro 版?Termius 工具下载与破解教程

今天想和大家聊聊 Termius 工具,Termius的下载与Termius破解教程,一款跨平台的 SSH/SFTP 终端工具。它不仅功能强大,还特别适合需要频繁上传文件夹和进行远程管理的小伙伴。无论你是程序员、运维工程师,还是需要远程管理服务器的爱好者,这款工具都能成为你的得力助手!今天…

Python 正则表达式进阶用法:边界匹配

Python 正则表达式进阶用法:边界匹配 正则表达式是一种强大的工具,用于处理文本中的模式匹配。它广泛应用于文本查找、替换、数据清洗等任务。在学习了正则表达式的基础知识后,掌握更高级的用法将使得正则表达式的应用更加灵活。边界匹配(Boundary Matching)是正则表达式中…

java-BLOG3

一:前言知识点总结题目集7控制设备:引入了开关、分档调速器、连续调速器和互斥开关四种控制设备,重点在于理解这些设备的工作原理及其在电路中的作用。 受控设备:包括灯(白炽灯、日光灯)和风扇(吊扇、落地扇),以及新增的受控窗帘。主要考察学生对不同设备工作状态的理…

学习笔记 - 汉明码

汉明码属于一种具备纠错功能的线性分组码。 在数据传输时,受外界干扰影响,单个比特可能产生差错。汉明码借助添加的冗余监督位,依照特定规则精准判断出错比特位,进而完成纠正,确保信息恢复如初,宛如给数据披上一层“防护甲”,使其即便处于复杂环境,也能维持精准可靠,在…

学习笔记 - 摩斯电码

摩斯电码由美国人塞缪尔莫尔斯等人发明,仅用“”(点)与“-”(划)两种符号,按不同排列组合来代表英文字母、数字和标点。起初应用于有线电报,后应用到无线电通信,曾长期担任关键角色。如今,虽因通信技术革新而不再主流,但在业余无线电爱好者群体中依旧流行,紧急救援时…

2024第一届Solar杯应急响应挑战赛WP

对于一个只学了2个月的小白来说这种比赛难度还是太高了,还要沉淀一下QAQ 内存取证-1 题目描述 题目文件:SERVER-2008-20241220-162057 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1} 先imageinfo然后netscan F:\CTF软件合集\Misc杂项\隐写工具\取证类\volatility\Volatili…

App信息收集

引子:上一章主要介绍了信息收集中的Web信息收集,包括要收集什么信息、该怎样去做等内容。而本章则简单介绍一下当目标为App时该如何进行信息收集。由于本篇章为信息收集篇,因此很多内容笔者并没有深究(ps:其实是深究不明白),或许等一轮学完后再回头看时会明白很多吧。免…

基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)PSO优化过程: PSO优化前后,模型训练对比: 数据预测对比: 误差回归对比: 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)LR = g1(1); NN1 = floor(g1…

软件工程我依然爱你

用一个词总结软工实践课程——Never forget!!!😚😚😚 前言现在是2024年12月27号下午4点,是我考完软件工程课程的四小时,也是我软工实践结束的第27天。我竟莫名对软件工程有点不舍,特别是我们倾注大量心血的项目——福小研,我愿称之为我心里最好的项目之一,或许它…

2024省选联测1

2024省选联测1题目来源: 2024省选联测1 \(T1\) HZTG5808. interval \(40pts\)原题: QOJ 1173. Knowledge Is..考虑按照左端点升序排序后反悔贪心。分别维护已经匹配的区间对和未被匹配的区间,若当前区间 \(a\) 可以和前面剩余的未被匹配的区间匹配则直接匹配;否则尝试找到一…