2009-08-05 6 views
43

Z tego, co widziałem, w dokumentacji MSDN i innych pytaniach tutaj dotyczących SO, istnieją cztery sposoby uzyskania nazwy lokalnego komputera.Różnica między SystemInformation.ComputerName, Environment.MachineName i Net.Dns.GetHostName

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

Czy istnieje różnica w metodach, które powrócą, czy też wszystkie będą zwracać dokładnie to samo przez cały czas?

Uwaga: raz pierwszy zobaczyłem listę w tym poście: How do I get the local machine Name?

Odpowiedz

39

Environment.MachineName i System.Windows.Forms.SystemInformation.ComputerName są identyczne i zwraca nazwę NetBIOS komputera. Ta nazwa jest ograniczona do 15 znaków i jest widoczna tylko w sieci LAN.

System.Net.Dns.GetHostName() zwraca nazwę hosta opartą na protokole TCP/IP komputera. Dodając sufiks domeny do nazwy hosta, możesz rozwiązać adres IP swojego komputera w sieciach LAN/w Internecie.

System.Environment.GetEnvironmentVariable("COMPUTERNAME") zwraca nazwę komputera ustawioną podczas instalacji. NetBIOS i nazwa hosta są początkowo ustawione na tę samą nazwę.

+2

Nie 'System.Environment.GetEnvironmentVariable ("COMPUTERNAME")' wrócić co zmienna środowiskowa COMPUTERNAME jest ustawiony, a nie NetBIOS? Zmienne środowiskowe można łatwo manipulować kodem, więc można ustawić coś innego niż to, co jest raportowane w NetBIOS. – StarPilot

13

Environment.MachineName: nazwa NetBIOS komputera lokalnego odczytu z rejestru

Dns.GetHostName: Pobiera nazwę hosta komputera, który odnosi się do nazwa domeny, która ma jeden lub więcej powiązanych adresów IP.

System.Windows.Forms.SystemInformation.ComputerName: jak Environment.MachineName, różnicę można nazwać zarówno od strony okien applications.Environment i jest używany tylko aplikacje Windows.

Environment.GetEnvironmentVariable metoda służy do pobierania zmiennej środowiskowej z bieżącego process.For więcej informacji, można spojrzeć na:
http://msdn.microsoft.com/en-us/library/system.environment.getenvironmentvariable.aspx

3

Istnieje kilka ważnych różnic między tymi metodami. Powiedz, że nazywasz swój komputer "GöransLilla 人物 987654321".
Environment.MachineName następnie zwróci GÖRANSLILLA 人物 98. To jest okrojone i wszystkie wielkie litery.
Dns.GetHostName zwróci GöransLilla? 987654321. Pełna długość i poprawna obudowa, ale chińskie znaki wielobajtowe zostały zamienione na "?". Szwedzkie "ö" jest jednak zachowane.
Jedyny sposób, w jaki wiem o uzyskaniu rzeczywistej nazwy określonej w systemie Windows, to 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()); 
+1

OK, podążyłem za odnośnikiem w pierwszym poście i dowiedziałem się, że System.Net.Dns.GetHostEntry ("localhost"). HostName właściwie zwraca również znaki chińskie.W tym sensie różni się od GetHostName i jest dobrą alternatywą dla pinvoke. –