本文我们介绍针对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. KubeSphere 镜像构建器(S2I)服务证书过期解决方案

    目前 KubeSphere 所有 3.x.x 版本,如果开启了 DevOps 模块并使用了镜像构建器功能(S2I)都会遇到证书过期问题. 解决方法 已开启 DevOps 模块 下载这个更新 S2I 服 ...

  2. Java中重写equals并重写hashcode方法的描述

    1.两个对象的hashCode()相同,equals()不一定为true (1)重写equals()的同时,重写hashCode() a.定义Person类,私有属性name,age:有参构造,set ...

  3. python+ffmpeg视频转码转格式

    本文转发来自:https://blog.csdn.net/KH_FC/article/details/115771126 废话 python目前自己也是在学习当中,对python也不是特别精通,写视频 ...

  4. AutoDarkMode:Win上自动切换深浅模式的工具

    AutoDarkMode是一款Windows上用于根据时间自动切换亮暗主题的工具. 打开后,即可设置根据时间(通常是白天亮晚上暗)自动切换主题(需要软件开机启动). 你也可以在切换颜色主题的同时设置两 ...

  5. costmap代价地图

    1 什么是costmap代价地图 在机器人进行路径规划时,我们需要明白规划算法是依靠什么在地图上来计算出来一条路径的.依靠的是gmapping扫描构建的一张环境全局地图,但是仅仅依靠一张原始的全局地图 ...

  6. 记录一个opencv的imread方法无法读取成功的问题,【设计到visual studio和静态库(lib)匹配的问题】

    一.为什么会遇到这个问题 公司需要对多图进行拼接,经过多番查找发现了OpenStitching这个库.可以实现多图拼接.在python段尝试了之后感觉效果不错,所以使用Visual Studio进行C ...

  7. Nuxt.js 应用中的 webpackConfigs 事件钩子

    title: Nuxt.js 应用中的 webpackConfigs 事件钩子 date: 2024/11/20 updated: 2024/11/20 author: cmdragon excerp ...

  8. ubuntu的apt源更新后只能装php8新版本,无法安装php7老版本了

    新电脑更新apt源以后,发现新装的都是php8.1,而且apt源update后,search也找不到php7了. 于是找到了这篇文章 然后按照他说的做 sudo apt-get update sudo ...

  9. 2个月搞定计算机二级C语言——真题(12)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题12 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> #define N 3 int ...

  10. Java 并发编程实战学习笔记——CountDownLatch的使用

    public class CountDownLatch extends Object 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 Co ...