C#怎么获取电脑的名称和工作组_C#如何读取网络属性【技巧】

星晨小哥_8881

星晨小哥_8881

2026-03-27

849人浏览

原创

Environment.MachineName 返回注册表中的计算机名,非网络解析名,容器/域/未重启等场景可能不准;Dns.GetHostName() 依赖DNS配置易抛SocketException,需try-catch降级;工作组名须P/Invoke NetWkstaGetInfo。

怎么用 Environment.MachineName 获取本机名(但别信它全对)

environment.machinename 是最常用也最容易写错的地方。它返回的是 windows 系统注册的计算机名,不是网络上实际广播或 dns 解析出的名字。比如你改过主机名但没重启,或者用了域环境,它可能还是旧值。

  • 它不走网络协议,纯读注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName
  • 在容器、WSL2 或某些虚拟化环境下可能返回宿主名而非容器内预期名
  • 如果程序以服务方式运行且使用 LocalSystem 账户,它仍返回物理机名,不是服务上下文名

示例:

string hostName = Environment.MachineName; // 比如 "DESKTOP-ABC123"

为什么 System.Net.Dns.GetHostName() 有时报 SocketException

这个函数本质是查本地 hosts 文件 + DNS 解析器配置,再反向查本机 IP 对应的主机名。一旦本地 DNS 配置异常、hosts 里有错误映射、或网卡没配好 DNS 后缀,就容易崩。

  • 常见错误信息:System.Net.Sockets.SocketException: No such host is known
  • 它依赖 GetHostAddresses() 先拿到本机 IPv4/IPv6 地址,再对每个地址调 GetHostEntry() 反查 —— 只要任一地址反查失败,整个就抛异常
  • 在无网络环境(比如禁用所有网卡)下也可能失败,哪怕机器名本身是存在的

稳妥做法是兜底:

string hostName;
try {
    hostName = System.Net.Dns.GetHostName();
} catch (System.Net.Sockets.SocketException) {
    hostName = Environment.MachineName; // 降级用静态名
}

工作组名不能靠 .NET BCL 直接读,得查 Netapi32.dll

C# 标准库根本没有公开 API 读工作组(Workgroup)或域(Domain)名称。所谓“工作组”,其实是 NetBIOS 层概念,藏在系统安全策略和网络适配器配置里,得调 Windows 原生 API。

  • System.Environment.UserDomainName 返回的是登录域(如果是域用户),不是工作组;本地账户下它等于 Environment.MachineName,毫无参考价值
  • 正确路径是 P/Invoke NetWkstaGetInfo,传入 level 100,取 wki100_langroup 字段
  • 必须引用 System.Runtime.InteropServices,且需管理员权限在某些锁死策略的系统上才返回真实值

简版调用示意(省略 struct 定义和 free):

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
[DllImport("Netapi32.dll", CharSet = CharSet.Unicode)]
static extern int NetWkstaGetInfo(string server, int level, out IntPtr bufptr);
<p>// level=100 → wki100_langroup 就是工作组名</p>

别把“获取网络属性”当成单点问题,它其实分三层

很多人搜“C# 读取网络属性”,以为有个统一接口能吐出所有信息,实际上得按用途拆开处理:

  • 身份层(你是谁):用 Environment.MachineName 或 Dns.GetHostName(),看你要静态标识还是网络可达名
  • 归属层(你在哪个组):工作组/域必须走 NetWkstaGetInfo,没有托管替代方案
  • 连接层(你能连到哪):网卡名、IP、DNS 后缀这些,得遍历 NetworkInterface.GetAllNetworkInterfaces(),再查 UnicastIPAddressInformation 和 IPInterfaceProperties.DnsSuffix

真正麻烦的不是代码长短,而是每一层的语义不一致:同一台机器,MachineName 是 A,Dns.GetHostName() 解出来是 B,工作组却是 C —— 它们本来就不保证一致。

得先想清楚你要这名字干啥:写日志?连另一台服务?生成唯一 ID?不同场景该选哪一层,比怎么写代码还关键。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

1132

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

3331

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

945

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

2655

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

352

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

429

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

631

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

329

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习