C# 获取Windows系统的设备名称

一、遇到的问题

1、最近在开发互动传屏的时候,窗口会显示本机的设备名称。这个名称对应的是Windows系统 设置界面的设备名称。

image

 

2、但是,我们使用 C# 的 “Environment.MachineName” 获取对应的名称的时候,显示的却是大写的。如下图所示。这个明显跟需求文档说的不符。所以被测试登记了一个Bug

image

 

二、排查问题

在微软的文档计算机名称 - Win32 apps | Microsoft Learn中,可以看出,获取计算名称有好几种方式

计算机名称

DNS 名称由句点分隔的一个或多个组件组成(例如,msdn.microsoft.com)。 每个组件最多可以有 63 个字节。 每个名称最多可以包含 255 个字节。 DNS 名称在 UTF-8 字符集或 Unicode 中表示。 名称不区分大小写。 有关详细信息,请参阅 DnsValidateName

计算机由其完全限定的 DNS 名称唯一标识,该名称由其 DNS 主机名及其分配到的 DNS 域的名称组成。 若要检索计算机的完全限定 DNS 名称、DNS 主机名或 DNS 域名,请调用 GetComputerNameEx 函数。 若要设置计算机的 DNS 主机名或 DNS 域名,请调用 SetComputerNameEx 函数。 在用户重启计算机之前,名称更改不会生效。

NetBIOS 名称由最多 15 字节的 OEM 字符组成,包括字母、数字、连字符和句点。 某些字符特定于字符集。 NetBIOS 名称通常在 OEM 字符集中表示。 OEM 字符集取决于区域设置。 某些 OEM 字符集将某些字符表示为两个字节。 根据约定,NetBIOS 名称以大写形式表示,其中从小写到大写的转换算法依赖于 OEM 字符集。

SetComputerNameEx 和 GetComputerNameEx 函数还可以设置和检索计算机的 NetBIOS 名称。 按照约定,NetBIOS 名称和 DNS 主机名是相互依赖的。 修改 DNS 名称时,还会更新 NetBIOS 名称。 NetBIOS 名称是 DNS 主机名的 OEM 表示形式,最多MAX_COMPUTERNAME_LENGTH个字符。 如果设置的 DNS 主机名超过 MAX_COMPUTERNAME_LENGTH 个字符,NetBIOS 名称将设置为 DNS 主机名的截断版本。 否则,整个 DNS 主机名将转换为 OEM NetBIOS 名称。 警告:如果修改 NetBIOS 名称,使其不是 DNS 名称的截断映射,则会中断使用依赖于此约定的 DnsHostnameToComputerName 等函数的应用程序。

 

其中,C# 通过 “Environment.MachineName” 的方式获取到的PC 的设备名称,是通过 NetBIOS 获取的, OEM 字符集取决于区域设置。 某些 OEM 字符集将某些字符表示为两个字节。 根据约定,NetBIOS 名称以大写形式表示,其中从小写到大写的转换算法依赖于 OEM 字符集。所以我们获取回来的设备名称就是全部大写的了。

 

三、解决问题:

1、参考了Stack overflow的一篇文章: .net - Difference between SystemInformation.ComputerName, Environment.MachineName, and Net.Dns.GetHostName - Stack Overflow

2、区分了 Environment.MachineName、Dns.GetHostName()、Environment.GetEnvironmentVariable("COMPUTERNAME")

   private void MainWindow_Loaded(object sender, RoutedEventArgs e)
   {
       Console.WriteLine($" Environment.MachineName:{Environment.MachineName}");
       Console.WriteLine($" System.Net.Dns.GetHostName():{System.Net.Dns.GetHostName()}");
       //Console.WriteLine($" System.Windows.Forms.SystemInformation.ComputerName:{SystemInformation.ComputerName}");
       Console.WriteLine($"System.Environment.GetEnvironmentVariableCOMPUTERNAME:{System.Environment.GetEnvironmentVariable("COMPUTERNAME")}");
   }

3、运行的结果如下:

image

 从运行的结果可以看出:Dns.GetHostName() 的方法,可以准确的获取PC的设备名称。

 

参考资料:

.net - SystemInformation.ComputerName、Environment.MachineName 和 Net.Dns.GetHostName - 堆栈溢出的区别

计算机名称 - Win32 apps | Microsoft Learn

.net - 为什么 System.Environment.MachineName 值大写?_Stack Overflow中文网

 

 

 

posted @ 2025-12-23 15:53  wuty007  阅读(6)  评论(0)    收藏  举报