2009-12-01 72 views
3

我有一些查詢Active Directory以驗證用戶存在的代碼。我試圖驗證一個長約1300個ID的清單。我已經嘗試了幾種方法來驗證用戶帳戶(LINQ到AD,DirectorySearcher(有沒有父DirectoryEntry)以及一個連接到WinNT://路徑的DirectoryEntry)。每次它會回來並說幾個用戶不存在。如果我在代碼中對其userid進行硬編碼並單獨執行,它會驗證是否存在。如果我嘗試在foreach循環中執行此操作,我會得到一些錯誤的否定結果。Active Directory未找到C#中的所有用戶

下面是我使用的是現在的代碼..

static string[] userIDs = new string[] "user1","user2","user3","user4","user5","user6","user7","user8"...,"user1300"}; 

List<string> nonExistingUsers = new List<string>(); 
List<string> ExistingUsers = new List<string>(); 
foreach (string s in userIDs) 
{ 
DirectorySearcher search = new DirectorySearcher(); 
search.Filter = String.Format("(SAMAccountName={0})", s); 
search.PropertiesToLoad.Add("cn"); 
DirectorySearcher ds = new DirectorySearcher(de, "(&(objectClass=user)(cn=" + s + "))", new string[] { "Name" }, SearchScope.Subtree); 
SearchResultCollection resultCollection = ds.FindAll(); 
SearchResult result = search.FindOne(); 
if (result != null) 
    ExistingUsers.Add(s); 
else 
    nonExistingUsers.Add(s); 
} 

任何建議或爲什麼我收到了假陰性原因是什麼?

回答

4

幾件事情:

  • 首先嚐試在LDAP過濾器使用「ANR =」(不明確名稱解析) - 它會搜索數名相關的屬性,使搜索更容易。該用戶名可能不是真正的「通用名稱」的一部分(CN = USER1)

  • 其次,使用objectCategory,而不是對象類 - 的objectCategory是單值和索引,從而在搜索

  • 一個公平的有點快
  • 第三:爲什麼你先在下一行調用.FindAll()然後是.FindOne()?看起來真的沒有必要......

  • WinNT://真的只是爲了向後兼容,如果你需要處理本地計算機帳戶 - 儘量避免它,它也暴露了很多比LDAP

這裏的屬性少是我的代碼,我會寫:

static string[] userIDs = new string[] "user1","user2","user3","user4","user5","user6","user7","user8"...,"user1300"}; 

DirectoryEntry searchRoot = new DirectoryEntry("LDAP://cn=Users,dc=YourComp,dc=com"); 

List<string> nonExistingUsers = new List<string>(); 
List<string> ExistingUsers = new List<string>(); 

foreach (string s in userIDs) 
{ 
    DirectorySearcher search = new DirectorySearcher(searchRoot); 

    search.SearchScope = SearchScope.Subtree; 
    search.Filter = string.Format("(&(objectCategory=person)(anr={0}))", s); 

    SearchResultCollection resultCollection = ds.FindAll(); 

    if(resultCollection != null && resultCollection.Count > 0) 
     ExistingUsers.Add(s); 
    else 
     nonExistingUsers.Add(s); 
} 

是否在方案的工作?

另外,如果你使用.NET 3.5或更高版本,事情變得簡單得多了 - 看到:

Managing Directory Security Principals in the .NET Framework 3.5

相關問題