2011-04-15 4 views
1

C#을 통해 현재 도메인 컨트롤러 이름을 얻으려고합니다. 이 코드는 로그온 세션 중에 실행되지 않습니다. 시스템 시작시 실행되므로 % logonserver % 변수를 사용할 수 없습니다. 시스템 시작시 그러한 변수가 없기 때문입니다. 여기에서 검색 나는 다음 코드가 작동 할 것이라고 생각했지만 현재 로그온 서버가 아니라 주 도메인 컨트롤러를 반환합니다. 나를 위해이 작동하지 않습니다현재 도메인 컨트롤러 이름 확인

(시작시 '로그온 서버가'가장 '인증 서버'로 언급 될 수 있음)

using (PrincipalContext context = new PrincipalContext(ContextType.Domain)) 
     { 
      string controller = context.ConnectedServer; 
      Console.WriteLine("Domain Controller: " + controller); 
     } 
(기계의 현재 DC를 반환하지 않습니다, 도메인의 PDC를 반환)

나는이 느린, 다음 WMI 쿼리가 긍정적 인 결과를 얻을 수 있음을 발견하지만, 한 :

ManagementObjectSearcher 수색자 = 새로운 ManagementObjectSearcher ("루트 \의 CIMV2" "Win32_NTDomain SELECT * FROM");

  foreach (ManagementObject queryObj in searcher.Get()) 
      { 
       if (queryObj["DomainControllerName"] != "") 
        Console.WriteLine("DomainControllerName: {0}", queryObj["DomainControllerName"]); 
      } 

누구나 더 좋은 방법을 알고 계십니까?

+2

뭔가. 하나의 도메인이 아니라 여러 개의 ** 도메인 컨트롤러 **가있을 수 있습니다. 도메인 컨트롤러가 할 수있는 세 가지 주요 기능 (이 시점에서 메모리에서 온 것임)이 있기 때문에 우리는 두 가지가 있습니다. 그렇다면 어떤 도메인 컨트롤러를 "현재"로 간주합니까? – Jim

+0

컴퓨터가 도메인에 로그온하지 않은 경우 "_... 컴퓨터 시작 중에 실행됩니다 ._ ..."라고 말하면 사용자 나 컴퓨터가 아직 도메인에 로그인하지 않았으며 사용자에게 적용되는 진실은 컴퓨터에 적용되지만 아직 컴퓨터 컨텍스트에 대한 _current_ 도메인 컨트롤러가 없습니다. 나는 틀릴 수도 있지만 이것이 사실이라고 믿습니다. –

+0

답장을 보내 주셔서 감사합니다. 내 환경에는 15 또는 16 개의 DC가 있습니다. 일부 실제 위치는 1이고 일부는 3입니다. –

답변

2

당신은 사용자와 암호를 포함해야 부여하지만,이 트릭을 할해야합니다 생각하는

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

    var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext); 
    var controller = domain.FindDomainController(); 
+0

와우 나는 지금까지 이것을 결코 알아 채지 못했다 ... 훌륭한 작품! 도메인 도메인 = Domain.GetCurrentDomain(); var controller = domain.FindDomainController(); Console.WriteLine (controller.ToString()); –