2009-02-03 19 views
23

Musi być łatwy sposób na zrobienie tego, nie mogę uwierzyć, że nie ma. Przeskanowałem przez sieć i znalazłem, na przykład, 20 różnych metod, aby znaleźć domenę bieżącego użytkownika, ale żadna, aby uzyskać domenę (lub grupę roboczą) obecnego komputera.Nazwa domeny komputera w .NET?

W niezarządzanego C++ ten jest pobierany przez:

WKSTA_INFO_100 *buf; 
NetWkstaGetInfo(NULL, 100, (LPBYTE*)buf); 
domain_name = pBuf->wki100_langroup; 

może ktoś mi pomóc, jeśli istnieje sposób, aby uzyskać tę samą informacje w zarządzanym C# natywnie?

EDIT1: Ludzie, przeczytaj pytanie. NIE szukam nazwy domeny użytkownika.

+0

Podpowiedź: .NET Core nie ma żadnych oczywistych sposób na to jeszcze. Skończyło się na P/wywołaniu NetWkstaGetInfo (które to pytanie łatwo było znaleźć). – Joshua

Odpowiedz

33

Aby uzyskać aktualny domenę systemu, na którym jest uruchomiony progam można użyć System.DirectoryServices.ActiveDirectory.Domain.

Domain domain = Domain.GetComputerDomain(); 
Console.WriteLine(domain.Name); 
+0

Och, miło! Dzięki, właśnie tego szukałem! – galets

+0

Jeśli urządzenie nie znajduje się w domenie, otrzymamy wyjątek. – Shrike

+0

@shrike - tak, naprawdę możesz chcieć sprawdzić, czy domena ma wartość zerową przed odwoływaniem się do właściwości na niej. Jednak rodzaj odpowiedzi jest zaśmiecony. – tvanfosson

4

System.Environment.UserDomainName

+0

Używam aplikacji .net przy użyciu IIS i to działało dla mnie. –

+4

To nie jest poprawne. Nazwa domeny użytkownika niekoniecznie jest taka sama, jak nazwa komputera. W moim miejscu pracy maszyny programistyczne znajdują się w poddomenie. –

+0

To również nie jest poprawne, jeśli komputer, na którym działa twoja strona, jest częścią farmy serwerów za odwrotnym proxy. –

2

Jeśli nie chcesz dodać do uzależnienia System.DirectoryServices można również wywołać NetGetJoinInformation API bezpośrednio.

+2

'NetGetJoinInformation' zwraca starszą nazwę NetBIOS domeny. –

7

Korzystanie GetCurrentDomain jest taka sama jak Environment.UserDomainName, która działa nieprawidłowo, jeśli program jest uruchomiony na komputerze domeny jako użytkownik inny niż domeny. Użyłem następującego kodu:

try 
{ 
    return System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name; 
} 
catch (Exception) 
{ 
    return Environment.UserDomainName; 
} 
10

Pracuję nad projektem, w którym użytkownicy mogą być wszędzie; użytkownicy niebędący domenami na maszynie domeny, użytkownicy na komputerze niebędącym domeną, niezwiązani bezpośrednio z domeną w sieci stron trzecich itp., więc w zależności od AD jest już nieużywany.

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties(). DomainName jest dużo bardziej niezawodny pod wszystkie te warunki.

http://blogs.msdn.com/b/trobbins/archive/2006/01/04/509347.aspx

https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.domainname(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2

Imports System.DirectoryServices 
Imports System.Net.NetworkInformation 

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Try 
      MsgBox("Domain: " & ActiveDirectory.Domain.GetComputerDomain.Name) 
     Catch ex As Exception 
      MsgBox(ex.GetType.ToString & ": " & ex.Message) 
     End Try 
    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     Try 
      MsgBox("Domain: " & IPGlobalProperties.GetIPGlobalProperties().DomainName) 
     Catch ex As Exception 
      MsgBox(ex.GetType.ToString & ": " & ex.Message) 
     End Try 
    End Sub 

End Class 
+0

Właśnie uratowałeś moją skórę. Dziękuję :-) +18 jeśli mogę. – InteXX

+1

IPGlobalProperties.GetIPGlobalProperties(). Nazwa domeny nie powiedzie się, jeśli maszyna została usunięta z domeny. Następnie zwróci starą wartość. – AnthonyVO

Powiązane problemy