如何为用户检索A / D用户信息

时间:2014-01-15 23:37:07

标签: c# active-directory

我正在尝试重现应用程序“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用户的信息?

编辑添加:

我以为我找到了答案,但后来发现它并不是我想要的。

2 个答案:

答案 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();