本文我们介绍针对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博客

.NET Bioss相关数据读写的更多相关文章

  1. 【详解】换一个角度看Socket的数据读写

    前言 以前对IO.NIO还算了解,也写过Netty的项目.但是对底层的数据传递不是很了解,一直存有这方面的疑惑.但是由于有其他事情就被打断了.前阵子因为想要了解volatile关键字的原理,学习了下J ...

  2. 5.3 RDD编程---数据读写

    一.文件数据读写 1.本地文件系统的数据读写 可以采用多种方式创建Pair RDD,其中一种主要方式是使用map()函数来实现 惰性机制,即使输入了错误的语句spark-shell也不会马上报错. ( ...

  3. TAG-9F10 发卡行相关数据(转)

    Tag-9F10  发卡行相关数据 9F10-发卡行应用数据 标签:9F10 字节1 –“ 07” 字节2 –DKI 长度:var10-25字节 字节3 – 密文版本号 格式:b 字节4 –“ 03” ...

  4. HBase 数据读写流程

    HBase 数据读写流程 2016-10-18 杜亦舒 读数据 HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中 假设现在想在用户表中获取 ro ...

  5. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  6. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第七篇:为ASP.NET MVC应用程序 ...

  7. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第八篇:为ASP.NET MVC应用程序 ...

  8. EntityFramework_MVC4中EF5 新手入门教程之五 ---5.通过 Entity Framework 读取相关数据

    在前面的教程中,您完成School数据模型.在本教程中,您会读取和显示相关的数据 — — 那就是,实体框架将加载到导航属性的数据. 下面的插图显示页面,您将完成的工作. 延迟. 预先,和显式加载的相关 ...

  9. VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写

    本文转自 http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写 200 ...

  10. [翻译][MVC 5 + EF 6] 7:加载相关数据

    原文:Reading Related Data with the Entity Framework in an ASP.NET MVC Application 1.延迟(Lazy)加载.预先(Eage ...

随机推荐

  1. MySQL数据的导出

    有时需要将MySQL数据库中的数据导出到外部存储文件中,MySQL数据库中的数据可以导出成sql文本文件.xml文件或者html文件.本节将介绍数据导出的常用方法. 11.4.1  使用SELECT- ...

  2. vue中绘制echarts折线图

    1.安装echartscnpm install echarts --save 2.vue代码 <template> <div> //下面的div给表一个容器 <div i ...

  3. Java 面向对象高级

    文章目录 1.静态 1.1 static修饰成员变量 1.2 static修饰成员变量的应用场景 1.3 static修饰成员方法 1.4 工具类 1.5 static的注意事项 1.6 static ...

  4. xtrabackup进行mysql数据库备份、还原

    xtrabackup简介 前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mys ...

  5. java之封装日期工具类DateUtils

    整合日期工具类DateUtils dateUtils日期工具类封装-各类格式方法 pom文件引入 <dependency> <groupId>cn.hutool</gro ...

  6. 现代IT基础设施管理(1):Terraform初识和小试牛刀

    基础设施包括各种云,像国内的阿里云.腾讯云和华为云,国外的AWS.微软Azure云和谷歌云,还有Kubernetes和OpenStack,都可以用Terraform进行资源管理.使用基础设施即代码(I ...

  7. C++之OpenCV入门到提高005:005 图像操作

    一.介绍 今天是这个系列<C++之 Opencv 入门到提高>得第五篇文章.这篇文章也不难,介绍如何图像的基本操作,比如:读取一张图片的像素值,如何修改一张图片中的像素值,如何读取一张图片 ...

  8. .NET斗鱼直播弹幕客户端(上)

    现在直播平台由于弹幕的存在,主播与观众可以更轻松地进行互动,非常受年轻群众的欢迎.斗鱼TV就是一款非常流行的直播平台,弹幕更是非常火爆.看到有不少主播接入弹幕语音播报器.弹幕点歌等模块,这都需要首先连 ...

  9. 【网关开发】Openresty使用cosocket API 发送http与tcp网络请求

    背景 为网关提供健康检查功能时需要对节点发送http或者tcp探活请求.Openresty 提供cosocket来处理非阻塞IO. 实现 跟工程结合在一起,这里简单拼接数据结构 local funct ...

  10. Python 潮流周刊#79:Python 的元数据困境(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...