C# Active Directory在C中找不到所有用户#
我有一些查询Active Directory以验证用户存在的代码。我正在尝试验证一个大约1300个ID的长列表。我尝试了几种方法来验证用户帐户(LINQ to AD、DirectorySearcher(有或没有父目录条目)以及链接到WinNT://路径的目录条目)是否正确。每次它都会回来说几个用户不存在。如果我在代码中硬编码他们的用户ID并单独执行,它将验证其存在性。如果我尝试在foreach循环中执行此操作,我会得到几个错误的否定 这是我现在正在使用的代码C# Active Directory在C中找不到所有用户#,c#,active-directory,directoryservices,C#,Active Directory,Directoryservices,我有一些查询Active Directory以验证用户存在的代码。我正在尝试验证一个大约1300个ID的长列表。我尝试了几种方法来验证用户帐户(LINQ to AD、DirectorySearcher(有或没有父目录条目)以及链接到WinNT://路径的目录条目)是否正确。每次它都会回来说几个用户不存在。如果我在代码中硬编码他们的用户ID并单独执行,它将验证其存在性。如果我尝试在foreach循环中执行此操作,我会得到几个错误的否定 这是我现在正在使用的代码 static string[] us
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);
}
静态字符串[]userIDs=新字符串[]“user1”、“user2”、“user3”、“user4”、“user5”、“user6”、“user7”、“user8”…“user1300”};
List NONEXISTINGUERS=新列表();
List ExistingUsers=新列表();
foreach(userid中的字符串s)
{
DirectorySearcher search=新建DirectorySearcher();
search.Filter=String.Format(“(SAMAccountName={0})”,s);
search.PropertiesToLoad.Add(“cn”);
DirectorySearcher ds=newdirectorysearcher(de,(&(objectClass=user)(cn=“+s+”),新字符串[]{“Name”},SearchScope.Subtree);
SearchResultCollection resultCollection=ds.FindAll();
SearchResult=search.FindOne();
如果(结果!=null)
现有用户。添加个;
其他的
不存在的用户。添加;
}
有什么建议或理由让我得到这些错误的否定吗?两件事:
- 首先,尝试在LDAP筛选器中使用“anr=”(不明确的名称解析)-它搜索多个与名称相关的属性,使搜索更容易。用户ID可能不是实际“通用名”(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);
}
静态字符串[]userIDs=新字符串[]“user1”、“user2”、“user3”、“user4”、“user5”、“user6”、“user7”、“user8”…“user1300”};
DirectoryEntry searchRoot=new DirectoryEntry(“LDAP://cn=Users,dc=YourComp,dc=com”);
List NONEXISTINGUERS=新列表();
List ExistingUsers=新列表();
foreach(userid中的字符串s)
{
DirectorySearcher search=新的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)
现有用户。添加个;
其他的
不存在的用户。添加;
}
这在您的场景中有效吗
此外,如果您使用的是.NET 3.5或更高版本,事情会简单得多-请参阅: