2009-08-25 137 views
8

C#中最簡單和最有效的方法是檢查Windows用戶帳戶名是否存在?這是在域環境中。如何檢查Windows用戶帳戶名稱是否存在於域中?

  • 輸入:在[域]用戶名/ [用戶]格式(例如 「myCompany中\鮑勃」)
  • 輸出:如果用戶名存在則爲真,否則爲false。

我發現this article但例子也有相關認證和操縱用戶帳戶和他們假定您已經有一個用戶專有名稱,而我開始與用戶帳戶名。

我敢肯定,我可以用AD來解決這個問題,但在我這樣做之前,我想知道是否有一個簡單的高級API可以滿足我的需求。

* UPDATE *

可能有許多方法可以做到這一點,拉斯發佈一個可以工作,但我無法弄清楚如何調整它在我的環境中工作。我沒有找到一個不同的方法,使用WinNT提供該做的工作對我來說:

public static bool UserInDomain(string username, string domain) 
    { 
     string path = String.Format("WinNT://{0}/{1},user", domain, username); 

     try 
     { 
      DirectoryEntry.Exists(path); 
      return true; 
     } 
     catch (Exception) 
     { 
      // For WinNT provider DirectoryEntry.Exists throws an exception 
      // instead of returning false so we need to trap it. 
      return false; 
     } 
    } 

附: 對於那些不熟悉上面使用的API的人:您需要添加對System.DirectoryServices的引用以使用它。

我發現的鏈接幫助我:How Can I Get User Information Using ADSI 這些示例使用ADSI,但也可以應用到.NET DirectoryServices。他們還演示了可能有用的用戶對象的其他屬性。

+0

愛新版本中,超快正是我所需要的。謝謝! – 2011-02-24 16:23:51

回答

4

文章中的System.DirectoryServices命名空間正是您所需要的,並且是爲此目的而設計的。如果我沒有記錯,這是Active Directory Server Interfaces COM接口

周圍的包裝

編輯:

類似下面應該這樣做(這大概可以做一些檢查和處理)。它將使用當前安全上下文的域來查找域控制器,但可以輕鬆修改該域以傳入命名服務器。

public bool UserInDomain(string username, string domain) 
{ 
    string LDAPString = string.Empty; 
    string[] domainComponents = domain.Split('.'); 
    StringBuilder builder = new StringBuilder(); 

    for (int i = 0; i < domainComponents.Length; i++) 
    { 
     builder.AppendFormat(",dc={0}", domainComponents[i]); 
    } 
    if (builder.Length > 0) 
     LDAPString = builder.ToString(1, builder.Length - 1); 

    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPString); 

    DirectorySearcher searcher = new DirectorySearcher(entry); 

    searcher.Filter = "sAMAccountName=" + username; 

    SearchResult result = searcher.FindOne(); 

    return result != null; 
} 

並用以下

Console.WriteLine(UserInDomain("username","MyDomain.com").ToString()); 
+0

這些是用於訪問Active Directory信息(如ADO.NET for SQL數據)的通用API。 AD編程的挑戰在於理解模式並構建正確的查詢來獲取所需的信息(並且存儲在AD中的信息很多)。 – DSO 2009-08-25 19:12:24

+0

@DSO - 你有域名和用戶名,所以你應該可以使用DirectorySearcher對象來查找用戶名是否存在於該域中,方法是實例化DirectorySearcher對象並傳入綁定到表示域對象的節點的DirectoryEntry對象 – 2009-08-25 20:16:24

+0

你的例子沒有爲我工作,我得到一個「服務器返回一個推薦」的錯誤,我認爲這意味着容器不存在。我認爲你原則上是正確的,首先綁定到正確的容器,然後搜索對象,所以我讓你爲此付出了努力。然而,我不認爲你構建查詢綁定到域的方法將適用於所有環境。我找到了一個更簡單的解決方案(更新後)。 – DSO 2009-08-28 18:01:47

2

測試發現一個簡單的方法,如果你在一個足夠高的框架版本要做到這一點:

using System.DirectoryServices.AccountManagement; 

bool UserExists(string userName, string domain) { 
    using (var pc = new PrincipalContext(ContextType.Domain, domain)) 
    using (var p = Principal.FindByIdentity(pc, IdentityType.SamAccountName, userName)) { 
     return p != null; 
    } 
} 
相關問題