2011-01-12 19 views
4

在使用GetDomain之前,有沒有什麼方法可以查明ActiveDirectory中是否有一個域可用?我有一個應用程序,用戶應該可以自行添加域,如果他們輸入了無效域,則應該有錯誤。現在它通過捕獲下面的異常來處理,但是進入無效域的用戶幾乎不是一個特殊的事情,並且異常也可能需要很長時間才能拋出,特別是如果輸入了IP地址(看起來像) 。有更好的解決方案嗎?ActiveDirectory:如何查找域是否可用?

public Domain RegisterUserDirectory(string domainId) { 
    DirectoryContext context = new DirectoryContext(DirectoryContextType.Domain, domainId); 

    System.DirectoryServices.ActiveDirectory.Domain domain; 
    try { 
    domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(context); 
    } 
    catch (ActiveDirectoryNotFoundException adne) { 
    // handle 
    } 
    catch (Exception e) { 
    Log.Warning("Failed to contact domain {0}: {1}", domainId, e.Message); 
    throw; 
    } 

    ... 
    ... 
} 
+0

我認爲這是**最好的方式來做到這一點...... – 2011-01-12 08:07:26

回答

3

不幸的是我認爲沒有其他的方法。想想你如何驗證一個IP地址是否可達。你所能做的就是嘗試連接或發送ping請求。在此之後,您只需等待有人會回答,並且由於連接速度較慢,超時時間很長,您必須一直等待。

爲了獲得更好的用戶體驗,您只需將此作業放入另一個踏板(或後臺工作人員),以便您的GUI仍能夠響應,並向用戶顯示一些進度或選取框欄。然後,您還可以添加用戶通過簡單地中止此線程來取消連接試用的可能性。

所以這不會讓它更快,但給用戶更好的響應,所以它感覺最後更快。

5

我能想到的唯一的其他選擇是使用森林來枚舉域。即

var myDomain = Domain.GetCurrentDomain(); //or .GetComputerDomain(); 
var forestDomains = myDomain.Forest.Domains; 

這是假設你想在同一個目錄林中的域。然後您需要測試您的用戶對此集合進行domainId測試,可能會針對每個域名.Name屬性進行測試。

+0

這就是我想要做的,我需要做一個foreach的集合,看看它是否有域?或者有什麼find方法? – 2013-11-25 12:58:43

1

我們需要更多的信息給你一個很好的答案。 Active Directory確實存儲了有關所有受信任域的信息。因此,僅通過查看全局編錄並且沒有真正綁定到域控制器就可以找出所有受信任的域信息。

但是,您需要知道,即使域信息存在於Active Directory中,也並不意味着您可以綁定到它。您可能沒有權限進行綁定,或者您的環境中的防火牆設置可能會阻止您訪問某些域。

我在這裏假設以下事情。

  1. 運行軟件的計算機已加入域。
  2. 您作爲域用戶運行軟件時登錄
  3. 你只有一個單一的森林,但森林裏包括了很多領域的
  4. 你在林中有一個全局編錄(很多時候,你有)
  5. 您輸入DNS域名,但不是NetBIOS域名

您可以使用下面的代碼來檢查域是否在當前林存在。如果是,則繼續調用Domain.GetDomain(context)來獲取您的Domain對象。如果由於某些原因,你不能綁定它,你仍然需要等待超時發生。

private bool DomainExist(string domain) 
{ 
    HashSet<string> domains = new HashSet<string>(); 
    foreach (Domain d in Forest.GetCurrentForest().Domains) 
    { 
     domains.Add(d.Name.ToLower()); 
    } 

    return domains.Contains(domain.ToLower()); 
} 
3

這就是我這樣做,而不使用森林。一些只讀服務器在使用Forest類時存在問題,所以如果我使用常規的DomainExists方法得到異常,我會嘗試使用這一方法。

public static bool DomainExistsNoForests(string domain, string server) 
{ 
    try { 
    DirectoryContext directoryContext = new DirectoryContext(DirectoryContextType.DirectoryServer, server); 
    Domain d = Domain.GetDomain(directoryContext); 
    if (d.Name.Trim().Equals(domain.Trim(), StringComparison.CurrentCultureIgnoreCase)) return true; 
    return false; 
    } 
    catch (Exception e) { 
    return false; 
    } 
} 

這遠遠超過您發佈的方式。此代碼不會嘗試解析域,但您確實需要知道您使用的目錄服務器。

我也有一些代碼在那裏檢查空參數,但我修剪了這個答覆。

Charles。

相關問題