SystemInformation.ComputerName,Environment.MachineName和Net.Dns.GetHostName之间的区别

epo*_*ter 55 .net windows hostname

从我所看到的,在MSDN文档和SO上的其他问题中,有四种方法可以获得本地机器名称.

Environment.MachineName;
System.Net.Dns.GetHostName();
System.Windows.Forms.SystemInformation.ComputerName;
System.Environment.GetEnvironmentVariable("COMPUTERNAME");
Run Code Online (Sandbox Code Playgroud)

他们的方法会返回什么不同,或者他们是否会一直返回完全相同的东西?

注意:我第一次看到这篇文章中的列表: 如何获取本地计算机名称?

Eve*_*zon 51

Environment.MachineName并且System.Windows.Forms.SystemInformation.ComputerName是相同的并返回计算机的NetBIOS名称.此名称限制为15个字符,仅在LAN上可见.

System.Net.Dns.GetHostName()返回计算机的基于TCP/IP的主机名.通过向主机名添加域后缀,您可以在LAN/Internet上解析计算机的IP地址.

System.Environment.GetEnvironmentVariable("COMPUTERNAME")返回安装期间设置的计算机名称.NetBIOS和主机名最初设置为相同的名称.

  • @StarPilot,是的,“Environment.MachineName”实际上返回“COMPUTERNAME”环境变量(并且是只读的)。 (4认同)
  • 不是`System.Environment.GetEnvironmentVariable("COMPUTERNAME")`返回环境变量COMPUTERNAME设置的内容,而不是NetBIOS?环境变量可以很容易地从代码中操作,因此它可以设置为与NetBIOS中报告的不同. (3认同)

Myr*_*yra 14

Environment.MachineName :从注册表中读取的本地计算机的NetBIOS名称

Dns.GetHostName :获取计算机的主机名,该计算机引用具有一个或多个关联IP地址的域名.

System.Windows.Forms.SystemInformation.ComputerName :与Environment.MachineName相同,区别在于您可以从网页和Windows应用程序中调用它.环境仅用于Windows应用程序.

Environment.GetEnvironmentVariablemethod用于从当前进程中检索环境变量.有关更多信息,请查看:http:
//msdn.microsoft.com/en-us/library/system.environment.getenvironmentvariable.aspx


Gör*_*ran 11

这些方法之间存在一些重要的差异.假设您将计算机命名为" GöransLilla?? 987654321 ".然后
Environment.MachineName将返回GÖRANSLILLA?? 98.这是截断的,都是大写的.
Dns.GetHostName将返回GöransLilla?? 987654321.全长且正确的外壳,但中文多字节字符已替换为"?".瑞典'ö'虽然保留了下来.

我知道获取Windows中指定的实际名称的唯一方法是使用pinvoke.

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool GetComputerNameEx(COMPUTER_NAME_FORMAT NameType, System.Text.StringBuilder lpBuffer, ref uint lpnSize);

System.Text.StringBuilder nameBuilder = new System.Text.StringBuilder(260);
uint size = 260;
bool success = GetComputerNameEx(COMPUTER_NAME_FORMAT.ComputerNameDnsHostname, nameBuilder, ref size);
Console.WriteLine(nameBuilder.ToString());
Run Code Online (Sandbox Code Playgroud)

  • 好的,我按照第一篇文章中的链接发现了System.Net.Dns.GetHostEntry("localhost").HostName实际上也正确地返回了中文字符.所以它在这个意义上与GetHostName不同,并且是pinvoke的一个很好的替代品. (6认同)