惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
人人都是产品经理
人人都是产品经理
H
Heimdal Security Blog
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
A
About on SuperTechFans
V2EX - 技术
V2EX - 技术
小众软件
小众软件
博客园 - Franky
博客园 - 司徒正美
P
Privacy International News Feed
爱范儿
爱范儿
U
Unit 42
博客园 - 叶小钗
The Hacker News
The Hacker News
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Simon Willison's Weblog
Simon Willison's Weblog
N
News and Events Feed by Topic
D
Docker
T
Threatpost
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Help Net Security
L
LINUX DO - 最新话题
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
A
Arctic Wolf
Spread Privacy
Spread Privacy

博客园 - wuty007

C# 范围运算符 C# 调用WGC 实现桌面屏幕的捕获 完善基于WPF开发的标尺控件(含实例代码) C# 依赖注入 Microsoft.Extensions.DependencyInjection 实现 控制反转(IOC) 记录 Windows系统开启hyper-v ,部分端口被保留,导致端口不能使用而报错的问题 WPF 调用 Win32的SetWindowDisplayAffinity 函数 实现捕获屏幕时,过滤指定的窗口 记录WPF 在清单列表设置了UIACESS为true,没有签名的报错“从服务器返回了一个参照” WPF 的ListBox 去除默认的Item项的 鼠标hover的背景颜色 WPF 调用 ChangeWindowMessageFilterEx 修改指定窗口 (UIPI) 消息筛选器的用户界面特权隔离 记录一下 WPF进程 SendMessage 发送窗口消息进行进程间通信,存在进程权限无法接受消息的问题 记录 使用PsExec启动System权限的WPF 程序 记录 命令行的 findstr 的使用 排查Windows 下的内存使用率过高,但是任务管理器看不到进程 Everything 支持 多实例 运行 指定应用 在 控制面板或者 设置的安装应用 置灰或隐藏卸载按钮 WPF 通过RawInput 获取 系统全局触摸事件 C# 定时任务 Quartz.NET 的使用 记录一下Windows系统下的命令行参数的字符个数限制 WPF 实现支持动态调整高度的文本显示控件
C# 获取Windows系统的设备名称
wuty007 · 2025-12-23 · via 博客园 - wuty007

一、遇到的问题

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中文网