Como faço para descobrir qual computador é o controlador de domínio no Windows programaticamente?

102

Estou procurando uma maneira de determinar qual é o Nome / Endereço IP do controlador de domínio para um determinado domínio ao qual um computador cliente está conectado.

Em nossa empresa, temos várias pequenas redes que usamos para teste e a maioria delas tem seus próprios pequenos domínios. Por exemplo, um dos domínios é denominado "TESTLAB". Eu tenho uma estação de trabalho do Windows XP que é membro do domínio TESTLAB e estou tentando descobrir o nome do controlador de domínio para ver quais usuários foram definidos para o domínio. Em nosso laboratório, há uma mistura de Windows Server 2000 e Windows Server 2003 (e, na realidade, provavelmente, alguns servidores NT 4), então seria bom encontrar uma solução que funcionasse para ambos.

Olhando na Internet, parece que existem vários utilitários, como o Windows Power Shell ou nltest, mas todos eles exigem que você baixe e instale outros utilitários. Eu esperava encontrar uma maneira de encontrar o controlador de domínio sem precisar instalar nada adicional.

EDITAR Se eu quisesse escrever um programa para localizar o controlador de domínio ou os usuários no domínio atual, como faria isso?

Engenheiro Dorky
fonte
Como passei algum tempo escrevendo uma solução para isso, pensei em transformá-la em uma questão de programação e reabri-la.
tvanfosson

Respostas:

253

Com a linguagem de programação mais simples: lote DOS

echo %LOGONSERVER%
MZywitza
fonte
Provavelmente não é o que Dorky tinha em mente naquela época, mas ainda assim, provavelmente o que a maioria dos leitores do tópico estão procurando. eh ... era o que Dorky estava procurando. Hah!
andersoyvind
3
Isso não funcionará se você estiver procurando um DC em outro domínio ao qual a máquina não pertence.
Brett Veenstra
@DorkyEngineer, que tal marcar esta como sua resposta selecionada?
ErikE
20

Em cmd no Windows, digite o seguinte comando:

nltest /dclist:{domainname}

Ele lista todos os controladores de domínio em um domínio específico

Lado Morela
fonte
3
e nltest /dclist:lista todos os controladores em qualquer domínio ao qual meu laptop está conectado (Windows 7)
GMasucci
12

Em C # /. NET 3.5, você pode escrever um pequeno programa para fazer:

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

Isso listará todos os usuários no domínio atual:

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
fonte
7

Na linha de comando, consulte a variável logonserver env.

C:> SET L

LOGONSERVER = '\' \ DCNAME

Sri
fonte
6

Execute gpresultem um prompt de comando do Windows. Você obterá uma abundância de informações sobre o domínio atual, usuário atual, grupos de segurança de usuário e computador, nomes de política de grupo, nome distinto do Active Directory e assim por diante.

ErikE
fonte
Tive que usar o argumento "/ R" para obter o relatório.
Josiah
Você deve tentar gpresult /Z!!
ErikE
Qual é a vantagem de / Z? Para fins de determinação da CD em uso, eles parecem ser comparáveis.
Josias
1
As pessoas podem gostar de ser direcionadas para a opção devido à riqueza de informações disponíveis. Mas você está certo, apenas para o DC em uso, outras opções são mais sucintas.
ErikE
2

no Powershell: $ env: logonserver

Wim
fonte
0

Para recuperar a informação quando DomainControllerexiste em um Domínio ao qual sua máquina não pertence, você precisa de algo mais.

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

  var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext);
  var controller = domain.FindDomainController();
Brett Veenstra
fonte