我正在尝试重现应用程序“Active Directory用户和计算机”的某些功能,并且找不到使用帐户名称或“samaccountname”检索给定用户的A / D信息的简便方法”
目前,我使用域用户和密码创建DirectoryEntry,然后使用该条目实例化DirectorySearcher以执行FindAll()。然后,我将运行生成的SearchResultCollection的SearchResults,解析UserPrincipals及其各种属性,以组合OU中的所有A / D用户。这需要太长时间。
DirectoryEntry entry = new DirectoryEntry(
LDAPString, domainuserid, password, AuthenticationTypes.Secure);
DirectorySearcher srch = new DirectorySearcher(entry);
SearchResultCollection results = srch.FindAll();
foreach (SearchResult sr in results)
{
DirectoryEntry de = sr.GetDirectoryEntry();
if (de.Name.IndexOf("CN=") > -1)
{
foreach (string propKey in sr.Properties.PropertyNames)
{
user = new ADUser();
UserPrincipal up = GetServiceUser(sr.Properties["samaccountname"][0].ToString());
user.AccountName = up.SamAccountName;
user.Name = up.Name;
foreach (string propKey in sr.Properties.PropertyNames)
{
switch (propKey.Trim().ToLower())
{
case "givenname":
user.SurName = sr.Properties[propKey][0].ToString();
break;
ETC...
}
}
}
}
}
我已经完成了计时,这个过程的这一部分似乎比它应该花费更多的时间。在我看来,我可能会检索A / D用户的所有SamAccountNames,将它们显示在列表中,并且只有在被选中时才能检索该用户的所有相关数据。我没有遇到根据需要一次一个地进行这种检索的方法,而且似乎会更有效率。是否有一种以编程方式仅通过使用SamAccountName来获取A / D用户的信息?
编辑添加:
我以为我找到了答案,但后来发现它并不是我想要的。
答案 0 :(得分:1)
您需要使用srch.Filter
来优化LDAP查询:
DirectorySearcher srch = new DirectorySearcher(entry); // You already have this line
srch.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))", samAccountName);
现在您实际上只能使用srch.FindOne()
而不是srch.FindAll()
,因为samaccountname是唯一的。
答案 1 :(得分:1)
一旦我编写了一个小的AD工具,我使用FindOne
通过SamAccountName检索和修改详细数据。我不确切地知道它与你的解决方案相比有多高效(它确实是前一段时间),但它在那时运作得很好(也有很多项目):
// get the user entry
var s = new DirectorySearcher(entry);
s.Filter = "(samaccountname=" + username + ")";
SearchResult user = s.FindOne();
// read / do some changes
var d = user.GetDirectoryEntry();
d.Properties[...]
d.Invoke(...);
d.CommitChanges();