我有一些代码可以查询Active Directory以验证用户是否存在。我正在尝试验证大约1300个ID的长列表。我已经尝试了几种方法来验证用户帐户(LINQ to AD,DirectorySearcher(有和没有父DirectoryEntry)以及链接到WinNT://路径的DirectoryEntry)。每次它会回来并说几个用户不存在。如果我在代码中对其用户ID进行硬编码并单独执行,则会验证是否存在。如果我尝试在foreach循环中执行此操作,我会得到几个漏报。
这是我现在正在使用的代码..
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);
}
我得到假阴性的任何建议或理由?
答案 0 :(得分:4)
一些事情:
首先,尝试在LDAP过滤器中使用“anr =”(模糊名称解析) - 它会搜索多个与名称相关的属性并使搜索更容易。 UserID可能不是实际“通用名称”(CN = user1)
其次,使用objectCategory而不是objectClass - 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