当前位置: 首页 > news >正文

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

 

 

 

http://www.jsqmd.com/news/129515/

相关文章:

  • # 成都设计推广公司终极指南:品牌 / 文旅 / 空间 / 快消 / 地产需求,一家全搞定
  • 【智谱清言Open-AutoGLM插件深度解析】:揭秘AI自动化生成核心技术与落地实践
  • 从手工到全自动化:一个中型项目测试流水线在2025年的演进之路
  • 跳出品牌迷思:钻戒买什么品牌的比较好?2025理性决策指南 - 博客万
  • 2025工业与商用场景变压器深度评测:SCB18干式变压器、SZ11有载(智能)调压变压器、矿场专用电力变压器、1250KVA油浸式变压器 - 优质品牌商家
  • # 成都企业找设计推广不用愁!这家30年老牌机构,全场景需求一站式搞定
  • 农村污水站点信息化运维管理平台方案
  • 2025年口碑好的陕西路灯工厂排行榜单 - 朴素的承诺
  • 2025年商用清洁设备核心性能深度评测报告:疏通机厂家、管道疏通机、超高压清洗机、防爆吸尘器、防爆吸尘器厂家、驾驶式扫地机 - 优质品牌商家
  • 从“十五五”规划看数字工厂、智能制造、工业互联网与工业大数据、智能工厂AI大模型应用解决方案
  • 基于机器学习的艾滋病分析预测系统毕业论文开题报告参考模板
  • 倒反天罡!Gemini Flash表现超越Pro,“帕累托前沿已经反转了”
  • # 2025西南地区文创+商业融合型品牌设计公司排行榜
  • 马头市区—beta冲刺
  • 2025年商用全自动咖啡机品质与信赖之选:揭秘核心技术、稳定出品与可靠服务 - 品牌2026
  • 元宇宙、VR/AR应用测试挑战
  • 线性与Softmax回归的实现与应用:深度学习框架下的线性回归模型快速构建与训练
  • ACON黑科技开源!让AI Agent“瘦身“成功,成本降54%+,小模型性能暴涨46%!小白也能玩转大模型上下文压缩
  • 2025年浙江地区可靠的铁氟龙厂家推荐:口碑不错的铁氟龙公司有哪些? - myqiye
  • AI智能体开发“开挂“指南:LangChain框架全流程解析,让编程小白秒变大神
  • 实用指南:8.5在方法中抛出异常
  • [特殊字符]大模型开发新革命!MCP Agent Graph:可视化拖拽,小白也能构建复杂AI系统
  • 2025耐火材料行业权威盘点:领军企业如何构筑高温防线 - 深度智识库
  • 2025年12月半挂车,集装箱运输半挂车,低平板半挂车厂家推荐,轻量化技术与承载性能权威测评! - 品牌鉴赏师
  • Java毕设项目:基于SpringBoot的爱心公益网站(源码+文档,讲解、调试运行,定制等)
  • 【AI神器】NotebookLM升级Gemini 3后绝绝子!小白程序员也能轻松搞定知识库,20美元拿下!
  • 震惊!Manus让大模型“内存永不爆满“,上下文工程竟是这么回事?小白也能秒懂的AI Agent架构优化指南
  • Java计算机毕设之基于Spring Boot的大学生勤工俭学系统的设计与实现基于SpringBoot的勤工俭学系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 24L01话筒与蓝牙共存方案:射频频段冲突规避说明
  • 南京婚纱摄影排名推荐:婚纱照定格幸福浪漫时光 - charlieruizvin