2013-10-30 24 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); 
} 

然而,當我嘗試通過森林properity拿到其他領域。

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

我的應用崩潰並且在下面示出的異常消息: System.DirectoryServices.ActiveDirectory.ActiveDirectoryServerDownException: 指定的域不存在或無法聯繫。

在 System.DirectoryServices.ActiveDirectory.Locator.GetDomainControllerInfo(字符串 COMPUTERNAME,字符串域名,字符串SITENAME,Int64的標誌)在 System.DirectoryServices.ActiveDirectory.DirectoryContext.isCurrentForest() 在 的System.DirectoryServices .ActiveDirectory.DirectoryContext.GetServerName() 在 System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.GetNewDirectoryEntry(字符串 DN)在 System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.GetCachedDirectoryEntry(字符串 DIST inguishedName)在 System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.ExpandWellKnownDN(WellKnownDN DN)在 System.DirectoryServices.ActiveDirectory.DirectoryEntryManager.ExpandWellKnownDN(WellKnownDN DN)在System.DirectoryServices.ActiveDirectory.Forest.GetDomains() 在系統。 DirectoryServices.ActiveDirectory.Forest.get_Domains()

請幫幫我。

在此先感謝。

回答

1

我在我的森林中運行類似的代碼(通過GetCurrentDomain()並查詢它的Forest),它們運行良好。我認爲問題就像異常和調用堆棧一樣 - 它試圖通過查詢作爲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); 

     } 
}