2013-10-30 2 views
1

포리스트의 모든 도메인을 가져 오려고합니다.한 도메인에서 다른 도메인을 얻는 방법

내가 하나 개의 특정 도메인에 연결하고 다음과 같이 그하여 DirectoryEntry를 얻을 수 있습니다 :

그러나
DirectoryContext dc = 
    new DirectoryContext(DirectoryContextType.DirectoryServer, "xx.x.xxx.40", "w28\\administrator", "pwd"); 

Domain domain = Domain.GetDomain(dc); 
DirectoryEntry entry = domain.GetDirectoryEntry(); 
foreach (DirectoryEntry child in entry.Children) 
{ 
    Console.WriteLine(" - " + child.Name); 
} 

, 나는 숲 property에 통해 다른 도메인을 취득하려고합니다.

Forest forest = domain.Forest; 
Console.WriteLine("Count: " + forest.Domains.Count); //It crashes here 
DomainCollection domains = forest.Domains; 

내 응용 프로그램 충돌 및 예외 메시지는 다음과 같습니다 System.DirectoryServices.ActiveDirectory.ActiveDirectoryServerDownException : 지정한 도메인이 없거나 연결할 수 없습니다. System.DirectoryServices에서 System.DirectoryServices.ActiveDirectory.DirectoryContext.isCurrentForest() 에서 System.DirectoryServices.ActiveDirectory.Locator.GetDomainControllerInfo에서

(문자열 컴퓨터 이름, 문자열 도메인 명 문자열적인 siteName, INT64 플래그) System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.GetCachedDirectoryEntry (문자열 DIST에서 System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.GetNewDirectoryEntry에서 .ActiveDirectory.DirectoryContext.GetServerName() (문자열 DN) System.DirectoryServices.ActiveDirectory.Forest.GetDomains에서 System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.ExpandWellKnownDN에서 System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.ExpandWellKnownDN (WellKnownDN DN) (WellKnownDN DN)() 시스템에서 에서 inguishedName). DirectoryServices.ActiveDirectory.Forest.get_Domains()

도와주세요.

미리 감사드립니다.

답변

1

내 포리스트 (GetCurrentDomain() 및 포리스트를 쿼리하여)에서 비슷한 코드를 실행하고 잘 작동했습니다. 문제는 예외이며 호출 스택이 제시된 것과 같다고 생각합니다. 포리스트 루트 서버를 DC로 쿼리하여 포리스트에 대한 정보를 얻으려고 시도하지만 연락 할 수 없습니다. 토폴로지를 확인한 다음 서버의 상태를 확인해야한다고 생각합니다.

0

동일한 문제가 있습니다. 네트워크 보안 테스터이기 때문에 나는 도메인 밖에 있습니다.

나는이

class PInvoke { 
[DllImport("Netapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern int DsGetDcName 
     (
      [MarshalAs(UnmanagedType.LPTStr)] 
      string ComputerName, 
      [MarshalAs(UnmanagedType.LPTStr)] 
      string DomainName, 
      [In] int DomainGuid, 
      [MarshalAs(UnmanagedType.LPTStr)] 
      string SiteName, 
      [MarshalAs(UnmanagedType.U4)] 
      DSGETDCNAME_FLAGS flags, 
      out IntPtr pDOMAIN_CONTROLLER_INFO 
     ); 

    [StructLayout(LayoutKind.Sequential)] 
    public class GuidClass 
    { 
     public Guid TheGuid; 
    } 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 

    public struct DOMAIN_CONTROLLER_INFO 
    { 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string DomainControllerName; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string DomainControllerAddress; 
     public uint DomainControllerAddressType; 
     public Guid DomainGuid; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string DomainName; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string DnsForestName; 
     public uint Flags; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string DcSiteName; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string ClientSiteName; 
    } 



    [DllImport("Netapi32.dll", SetLastError = true)] 
    public static extern int NetApiBufferFree(IntPtr Buffer); 

    [Flags] 
    public enum DSGETDCNAME_FLAGS : uint 
    { 
     DS_FORCE_REDISCOVERY = 0x00000001, 
     DS_DIRECTORY_SERVICE_REQUIRED = 0x00000010, 
     DS_DIRECTORY_SERVICE_PREFERRED = 0x00000020, 
     DS_GC_SERVER_REQUIRED = 0x00000040, 
     DS_PDC_REQUIRED = 0x00000080, 
     DS_BACKGROUND_ONLY = 0x00000100, 
     DS_IP_REQUIRED = 0x00000200, 
     DS_KDC_REQUIRED = 0x00000400, 
     DS_TIMESERV_REQUIRED = 0x00000800, 
     DS_WRITABLE_REQUIRED = 0x00001000, 
     DS_GOOD_TIMESERV_PREFERRED = 0x00002000, 
     DS_AVOID_SELF = 0x00004000, 
     DS_ONLY_LDAP_NEEDED = 0x00008000, 
     DS_IS_FLAT_NAME = 0x00010000, 
     DS_IS_DNS_NAME = 0x00020000, 
     DS_RETURN_DNS_NAME = 0x40000000, 
     DS_RETURN_FLAT_NAME = 0x80000000 
    } 
} 

class domain 
{ 
    public static void DetectDc(string domain, string username, string password, out string dc, out string dcAddress, out string path) 
     { 
      PInvoke.DOMAIN_CONTROLLER_INFO domainInfo; 
      const int errorSuccess = 0; 
      var pDci = IntPtr.Zero; 

      try 
      { 
       var val = PInvoke.DsGetDcName(null, domain, 0, "", 0, out pDci); 
       //check return value for error 
       if (errorSuccess == val) 
       { 
        domainInfo = (PInvoke.DOMAIN_CONTROLLER_INFO)Marshal.PtrToStructure(pDci, typeof(PInvoke.DOMAIN_CONTROLLER_INFO)); 
       } 
       else 
       { 
        dc = ""; 
        dcAddress = ""; 
        path = ""; 
        namingContext = ""; 
        return; 
       } 
      } 
      finally 
      { 
       PInvoke.NetApiBufferFree(pDci); 
      } 

      dc = domainInfo.DomainControllerName; 
      dc = dc.Replace("\\\\", ""); 

      dcAddress = domainInfo.DomainControllerAddress; 
      dcAddress = dcAddress.Replace("\\\\", ""); 

      var ldap = new Ldap(domain, dcAddress, username, password); 

     } 
} 
를 해결하는 좋은 방법입니다 발견
관련 문제