从活动目录检索用户名

本文关键字:用户 检索 活动 | 更新日期: 2023-09-27 18:11:58

我承认我对AD很陌生。我有一个下拉列表,我已将其与我们组织内的成员列表绑定。我的最终目标是找到他们经理的名字,但我从一小步开始。

我已经做了足够的搜索来得到正确的结果。我有一个问题得到正确的数据(通过使用断点等验证)的结果

private void cmbUserList_SelectedIndexChanged(object sender, EventArgs e)
{
    var userName = cmbUserList.SelectedValue.ToString();
    DirectorySearcher search = new DirectorySearcher();
    search.Filter = String.Format("(cn={0})", userName);
    search.PropertiesToLoad.Add("givenName");
    SearchResult result = search.FindOne();
    if (result != null)
    {
        // For now I'm trying to just retrieve their name
        lblManagerName.Text = result.GetDirectoryEntry().Name;
    }
}

编辑:我使用。net 4.0版本

有人可以指向我检索正确的名称,然后甚至可能是一个链接或资源拉经理的名字?

从活动目录检索用户名

我认为你的代码的问题是你正在使用"(cn={0})", userName。您需要传递像

这样的完全限定名
CN=Doe,John,OU=Users,OU=Headquarters,DC=company,DC=net

如果您只有登录ID,那么下面的代码应该可以工作

DirectorySearcher directorySearcher = new DirectorySearcher("LDAP://RootDSE");
directorySearcher.Filter = "sAMAccountName=" + acctName;
directorySearcher.PropertiesToLoad.Add("manager");
SearchResult searchResult = directorySearcher.FindOne();
if (searchResult != null)
DirectoryEntry user = searchResult.GetDirectoryEntry();

注意,acctName是Windows登录ID。如果您想使用AD并查看各种属性及其存储方式,请尝试使用dsquery和dsget命令行工具。下面的命令将根据登录id返回一条用户记录,并显示manager字段的内容:

dsquery user domainroot -samid "loginid" | dsget user -samid -mgr

辅助类和enum

public enum ActiveDirectoryObjectClass
{
    Computer,
    User,
    Domain,
    Group,
}
public static class ActiveDirectorySearcher
{
    public static string  GetCurrentDomainName()
    {
        string result;
        using (Domain domain = Domain.GetCurrentDomain())
        {
            result = domain.Name;
        }
        return result;
    }
    public static IEnumerable<T> Select<T>(
        ActiveDirectoryObjectClass activeDirectoryObjectClass,
        Func<DirectoryEntry, ActiveDirectoryObjectClass, bool> condition,
        Func<DirectoryEntry, T> selector
        )
    {
        List<T> list = new List<T>();
        using (Domain domain = Domain.GetCurrentDomain())
        using (DirectoryEntry root = domain.GetDirectoryEntry())
        {
            string filter = string.Format("(objectClass={0})", activeDirectoryObjectClass);
            using (DirectorySearcher searcher = new DirectorySearcher(filter))
            {
                searcher.SearchRoot = root;
                searcher.SearchScope = SearchScope.Subtree;
                using (SearchResultCollection result = searcher.FindAll())
                {
                    foreach (SearchResult item in result)
                    {
                        using (DirectoryEntry entry = item.GetDirectoryEntry())
                        {
                            if (condition(entry, activeDirectoryObjectClass))
                            {
                                list.Add(selector(entry));
                            }
                        }
                    }
                }
            }
        }
        return list;
    }
}

如何使用

    public IEnumerable<User> GetUsers()
    {
        return ActiveDirectorySearcher.Select(
            ActiveDirectoryObjectClass.User,
            (entry, adObjectClass) => string.Compare(entry.SchemaClassName, adObjectClass.ToString(), StringComparison.InvariantCultureIgnoreCase) == 0,
            _ => new User
                     {
                         Name = _.Name.Substring(3),
                         Domain = ActiveDirectorySearcher.GetCurrentDomainName(),
                     });
    }

注意:示例中的用户-自定义类具有属性Name, Domain等

查找名称和/或经理名称:

if (sResult != null)
{
    string userName = sResult.Properties["name"][0].ToString();
    string managerDN = sResult.Properties["manager"][0].ToString();
    DirectoryEntry man =  new DirectoryEntry("LDAP://server_name/"+managerDN);
    string managerName = man.Properties["name"][0].ToString();
}

server_name可以只是FQDN的域组件,即yourcompany.com,这样它将通过DNS自己找到目录服务器。

编辑:

我还推荐Sysinternals中的Active Directory资源管理器。它是探索和理解AD

结构的重要工具。