Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Active Directory在C中找不到所有用户#_C#_Active Directory_Directoryservices - Fatal编程技术网

C# Active Directory在C中找不到所有用户#

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

我有一些查询Active Directory以验证用户存在的代码。我正在尝试验证一个大约1300个ID的长列表。我尝试了几种方法来验证用户帐户(LINQ to AD、DirectorySearcher(有或没有父目录条目)以及链接到WinNT://路径的目录条目)是否正确。每次它都会回来说几个用户不存在。如果我在代码中硬编码他们的用户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);
}
静态字符串[]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或更高版本,事情会简单得多-请参阅: