Jak programowo dowiedzieć się, który komputer jest kontrolerem domeny w systemie Windows?

102

Szukam sposobu, aby ustalić, jaka jest nazwa / adres IP kontrolera domeny dla danej domeny, do której jest podłączony komputer kliencki.

W naszej firmie mamy wiele małych, małych sieci, których używamy do testowania, a większość z nich ma swoje własne małe domeny. Na przykład jedna z domen nosi nazwę „TESTLAB”. Mam stację roboczą z systemem Windows XP, która jest członkiem domeny TESTLAB i próbuję znaleźć nazwę kontrolera domeny, aby móc sprawdzić, jakich użytkowników zdefiniowano dla domeny. W naszym laboratorium znajduje się mieszanka Windows Server 2000 i Windows Server 2003 (aw rzeczywistości prawdopodobnie kilka serwerów NT 4), więc byłoby miło znaleźć rozwiązanie, które będzie działać dla obu.

Patrząc w Internecie, wygląda na to, że istnieją różne narzędzia, takie jak Windows Power Shell lub nltest, ale wszystkie wymagają pobrania i zainstalowania innych narzędzi. Liczyłem na znalezienie sposobu na znalezienie kontrolera domeny bez konieczności instalowania niczego dodatkowego.

EDYCJA Gdybym chciał napisać program do wyszukiwania kontrolera domeny lub użytkowników w bieżącej domenie, jak bym to zrobił?

Inżynier Dorky
źródło
Ponieważ poświęciłem trochę czasu na pisanie rozwiązania tego problemu, pomyślałem, że przerobię to na pytanie programistyczne i ponownie otworzę.
tvanfosson

Odpowiedzi:

253

Z najprostszym językiem programowania: wsadowy DOS

echo %LOGONSERVER%
MZywitza
źródło
Prawdopodobnie nie to, co wtedy miał na myśli Dorky, ale nadal prawdopodobnie to, czego szuka większość czytelników wątku. eh ... właśnie tego szukał Dorky. Hah!
andersoyvind
3
To nie zadziała, jeśli szukasz kontrolera domeny w innej domenie, do której nie należy maszyna.
Brett Veenstra
@DorkyEngineer co powiesz na oznaczenie tego jako wybranej odpowiedzi?
ErikE,
20

W cmd w systemie Windows wpisz następujące polecenie:

nltest /dclist:{domainname}

Zawiera listę wszystkich kontrolerów domeny w określonej domenie

Lado Morela
źródło
3
i nltest /dclist:wyświetla listę wszystkich kontrolerów w dowolnej domenie, do której jest podłączony mój laptop (Windows 7)
GMasucci
12

W C # / .NET 3.5 możesz napisać mały program do wykonania:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
    string controller = context.ConnectedServer;
    Console.WriteLine( "Domain Controller:" + controller );
} 

Spowoduje to wyświetlenie wszystkich użytkowników w bieżącej domenie:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
    using (UserPrincipal searchPrincipal = new UserPrincipal(context))
    {
       using (PrincipalSearcher searcher = new PrincipalSearcher(searchPrincipal))
       {
           foreach (UserPrincipal principal in searcher.FindAll())
           {
               Console.WriteLine( principal.SamAccountName);
           }
       }
    }
}
tvanfosson
źródło
7

Z wiersza poleceń zapytaj zmienną env logonserver.

C:> ZESTAW L

LOGONSERVER = '\' \ DCNAME

Sri
źródło
6

Uruchom gpresultw wierszu polecenia systemu Windows. Otrzymasz mnóstwo informacji o bieżącej domenie, bieżącym użytkowniku, grupach zabezpieczeń użytkowników i komputerów, nazwach zasad grupy, nazwie wyróżniającej Active Directory i tak dalej.

ErikE
źródło
Musiałem użyć argumentu „/ R”, aby uzyskać raport.
Josiah
Powinieneś spróbować gpresult /Z!!
ErikE,
Jaka jest zaleta / Z? W celu określenia używanego DC wydają się one być porównywalne.
Josiah,
1
Ludzie mogą chcieć zostać skierowani do tej opcji ze względu na bogactwo dostępnych informacji. Ale masz rację, ponieważ JUST DC w użyciu, inne opcje są bardziej zwięzłe.
ErikE
2

w Powershell: $ env: logonserver

Wim
źródło
0

Aby odzyskać informacje, gdy DomainControlleristnieje w domenie, do której nie należy Twój komputer, potrzebujesz czegoś więcej.

  DirectoryContext domainContext =  new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword");

  var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext);
  var controller = domain.FindDomainController();
Brett Veenstra
źródło