首页 > 其他分享 >.NET Bioss相关数据读写

.NET Bioss相关数据读写

时间:2024-12-28 20:54:35浏览次数:5  
标签:baseObject string Bioss 读写 BIOS WriteLine var Console NET

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

标签:baseObject,string,Bioss,读写,BIOS,WriteLine,var,Console,NET
From: https://www.cnblogs.com/kybs0/p/18613343

相关文章

  • MySQL_network
    MySQLRDBMS术语数据库:数据库是一些关联表的集合数据表:表是数据的矩阵列:一列包含了相同类型的数据行:一行一组相关的数据冗余:存储两倍数据主键:主键是唯一的,可以用主键来查询数据外键:外键用于关联两个表复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引......
  • PHP_network
    PHPPHP基础教程语法PHP脚本以<?php开头,以?>结尾php语句以;结尾,php代码块的关闭标签也会自动标名;php支持的三种注释//单行注释单行注释/*多行注释*/php中,所有用户定义的函数、类和关键词都对大小写不敏感;但所有变量都对大小写敏感变量变量规则:以$符......
  • NetBackup备份恢复工作流程workflow
    在早期的NetBackupTroubleshootingguide中,详细描述了备份和恢复的步骤以及各个进程之间的调用关系,但是7.7以后的文档把这部分内容给取消了。在loggingreference里面保留了类似内容,但是讲得不如老版本的TroubleshootingGuide清楚。备份流程从客户端或者MasterServerGUI......
  • ASP.NET MVC,Angularjs和Vue.js呈现文件图片
    周未了,又来博客园写随笔,分享程序方法,技巧,经验,把平常时常用的开发框架,语言,脚本集中总结。前段时写了些上传文件,如图片,二进制存储,后来又把上传的二进制经管理实现转存为原文件,图片缩略图等。今天把转换为文件,在网页呈现出来。决定使用ASP.NETMVC,Angularjs,vue,代码可直接写在页面......
  • net 命令按功能分类和层级结构制作的思维导图表格化版本。这个表格有助于清晰地展示 n
    net命令按功能分类和层级结构制作的思维导图表格化版本。这个表格有助于清晰地展示net命令的各种功能,并且按不同的任务和管理类型进行了分层。net 命令功能分类与层级结构表格类别命令子命令/参数功能描述示例命令用户管理netuser/add添加一个用户账户。ne......
  • keepass实现google自输入_SSH_TELNET_RDP联动
    涉及到的是使用开源密码管理工具KeePass结合特定插件实现自动化密码填充的功能,特别是在谷歌浏览器中的应用。KeePass是一款强大的密码管理软件,它允许用户安全地存储各种账号的用户名和密码,并通过加密保护这些敏感信息。1.keepass安装及配置1.1程序下载地址下载、安......
  • Spire.PDF for .NET 10.12.4
    Spire.PDFfor.NETisaprofessionalPDFAPIappliedtocreating,writing,editing,handlingandreadingPDFfileswithoutanyexternaldependencieswithin.NET(C#,VB.NET,ASP.NET,.NETCore,.NET5.0,.NET6.0,.NET7.0,MonoAndroidandXamarin.iOS)ap......
  • C# .net窗体实战4:多文档MDI程序
    题目:这个题目要主要的就是各种控件在实现相同功能的时候不要重复的写,将一样的代码放入到一个函数中去,这样直接调用函数使用起来就会很方便。还有就是补充了一下图像打开的方式。对于多文档来说,还有一个需要注意的就是子窗体的控件如何与父窗体的控件融合在一起。界面:父......
  • [Java SE] 核心源码精讲:java.net.URLConnection
    概述:URLConnectionURLConnection是一个抽象类,表示指向URL【指定资源】的活动连接URLConnection可以检查服务器发送的首部,并相应地做出响应。它可以设置客户端请求中使用的首部字段。URLConnection可以用POST、PUT和其他HTTP请求方法向服务器发回数据;URLConnection类是J......
  • Kubernetes快速部署(v1.31.4)
    文章目录1、初始化2、安装kubeadm3、单节点初始化4、集群网络环境搭建5、安装和配置calicoctl6、集群工作节点添加7、补充1、初始化将系统升级到最新,可以使用阿里源镜像站,本教程使用CentOS7系统(考虑大量用户使用的版本)yum-yupdate关闭selinux和防火墙system......