当前位置: 首页 > 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.zskr.cn/news/142083.html

相关文章:

  • 2025年石墨板按需定制服务厂商排行榜,口碑好的石墨板厂家新测评推荐 - myqiye
  • 精准度量测试价值:2025年,我们应该关注哪些核心质量与效能指标?
  • 当测试遇见大模型:探索LLM在测试用例生成、缺陷预测与报告分析中的实践
  • # 真术相成:政企校生态筑基石,技术转化赋实战,公益普及暖西南
  • 2025年12月展台设计搭建标杆厂家最新推荐:华宇兄弟展览,展会设计搭建、展览会设计搭建、糖酒会设计搭建、博览会设计搭建、展台搭建公司、专业铸就品质服务新高度 - 海棠依旧大
  • 从“十五五”规划看数字工厂、智能制造、工业互联网与工业大数据、智能工厂AI大模型应用解决方案
  • # 2025西南AI培训权威榜:真术相成TOP1,应届生转行党必看避坑指南
  • 实用指南:8.5在方法中抛出异常
  • 2025年浙江地区可靠的铁氟龙厂家推荐:口碑不错的铁氟龙公司有哪些? - myqiye
  • 6万预算钻戒推荐:2026婚戒价值坐标 - 博客万
  • 小白程序员逆袭神器!动态提示技术让大模型性能暴涨30%,代码量减少40%,2小时上手大模型优化黑科技
  • 震惊!微软开源神器Agent Lightning:一行代码不改,让AI Agent自我进化,小白也能轻松上手!
  • 2025耐火材料行业权威盘点:领军企业如何构筑高温防线 - 深度智识库
  • 马头市区—beta冲刺
  • 2025年12月半挂车,集装箱运输半挂车,低平板半挂车厂家推荐,轻量化技术与承载性能权威测评! - 品牌鉴赏师
  • 震惊!Manus让大模型“内存永不爆满“,上下文工程竟是这么回事?小白也能秒懂的AI Agent架构优化指南
  • 国产硬件架构突围:行业大模型训练与微调如何落地千行百业?
  • 低延迟高并发:anything-llm在高负载下的稳定性测试结果
  • Android系统增加自定义命令别名alias ll=ls -lhF
  • 智谱GLM-4.7深夜炸场!登顶开源编程模型王座,代码能力超越GPT-5,仅需 Claude 1/7的价格!
  • HR不懂业务也能做?真相可能颠覆你的认知
  • 大模型新纪元:AI已进化到“能做事“阶段,程序员如何抓住L3智能体风口?
  • Open-AutoGLM浏览器插件上线即爆火:它到底解决了什么行业痛点?
  • 【阿里云部署智普Open-AutoGLM全攻略】:手把手教你5步完成高性能AI模型部署
  • Java计算机毕设之基于SpringBoot的爱心公益网站公益项目管理、捐赠管理、志愿者服务、公益活动组织和公益资讯传播(完整前后端代码+说明文档+LW,调试定制等)
  • 快速排序
  • 为什么顶尖公司都在用Open-AutoGLM?4个核心应用场景揭示真相
  • 大模型(LLM)学习路线:从工具到算法的三层次完整指南
  • 真空包装袋十大品牌口碑榜,实力厂家深度解析,真空包装袋直销厂家选哪家技术领航者深度解析 - 品牌推荐师
  • 2025年年终类似Jira的工具推荐:聚焦中大型团队的5款高口碑工具横向评测与榜单 - 十大品牌推荐