Разница между SystemInformation.ComputerName, Environment.MachineName и Net.Dns.GetHostName

Из того, что я видел, в документации MSDN и в других вопросах здесь, в SO, есть четыре способа получить имя локальной машины.

Environment.MachineName;
System.Net.Dns.GetHostName();
System.Windows.Forms.SystemInformation.ComputerName;
System.Environment.GetEnvironmentVariable("COMPUTERNAME");

Есть ли разница в том, что они вернут методам, или все они будут возвращать то же самое все время?

Примечание: Я впервые увидел список в этом посте: Как получить имя локальной машины?

Ответ 1

Environment.MachineName и System.Windows.Forms.SystemInformation.ComputerName идентичны и возвращают имя компьютера NetBIOS. Это имя ограничено 15 символами и отображается только в локальной сети.

System.Net.Dns.GetHostName() возвращает имя компьютера на основе TCP/IP. Добавив суффикс домена к имени хоста, вы можете разрешить IP-адрес своего компьютера через локальные сети/в Интернете.

System.Environment.GetEnvironmentVariable("COMPUTERNAME") возвращает имя компьютера, установленное во время установки. Первоначально NetBIOS и имя хоста установлены с тем же именем.

Ответ 2

Environment.MachineName: имя NetBIOS локального компьютера, считанное из реестра

Dns.GetHostName: получает имя компьютера, которое относится к доменному имени, имеющему один или несколько связанных IP-адресов.

System.Windows.Forms.SystemInformation.ComputerName: то же самое, что и Environment.MachineName, разница заключается в том, что вы можете вызывать это как из веб-страниц, так и из окон. В среде используются только приложения Windows.

Environment.GetEnvironmentVariable метод используется для извлечения переменной среды из текущего процесса. Для получения дополнительной информации вы можете посмотреть:

http://msdn.microsoft.com/en-us/library/system.environment.getenvironmentvariable.aspx

Ответ 3

Существуют некоторые важные различия между этими методами. Скажите, что вы называете свой компьютер "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());