【问题标题】:Get manager's employees from AD从 AD 获取经理的员工
【发布时间】:2018-07-30 21:31:56
【问题描述】:

我正在尝试获取给定 DN 的经理的员工列表。 假设登录用户是经理,

1) 使用 sAMAccountName(即域 ID)在 Active Directory 中搜索管理器并检索 DistinguishedName

2) 搜索活动目录中“manager”属性等于先前检索到的 distinctName 的所有用户对象

但是,我的目录条目集合始终为空。这是我所做的,假设给出了用户/经理的 DN。

private static List<DirectoryEntry> GetUserDEByManagerDN(string sDN)
{
    string adPath = ConfigurationManager.AppSettings["ADPath"].ToString();
    DirectoryEntry de = new DirectoryEntry(adPath + "/" + sDN);
    List<DirectoryEntry> lsUsers = new List<DirectoryEntry>();

    using (DirectorySearcher Search = new DirectorySearcher())
    {
        Search.SearchRoot = de;
        Search.Filter = "(&(manager=" + sDN + "))";
        //Search.Filter = "(&(manager=" + sDN + ")(extensionAttribute14=INV))";
        Search.SearchScope = SearchScope.Base;  // Also tried SearchScope.Subtree
        SearchResultCollection Results = Search.FindAll();

        if (null != Results)  // Results is not null but has zero length
        {
            foreach (SearchResult Result in Results)
            {
                DirectoryEntry deUser = Result.GetDirectoryEntry();

                if (null != deUser)
                    lsUsers.Add(deUser);
            }
        }
    }
    return lsUsers;
}

我还尝试使用以下方法转义 DN:

string sEscapedDN = sDN.Replace('\\', '\x5C').Replace(')', '\x29').Replace('(', '\x28').Replace('*', '\x2A');

没有运气。任何帮助表示赞赏。

【问题讨论】:

  • 我会尝试删除过滤器并确保传递给过滤器的值对应于至少一个结果的该字段。
  • 听起来您最初的de 可能过于具体。您是否将其设置为拥有所有用户的容器?搜索根必须是您的所有用户都可以在其中找到的东西。不要太宽以至于需要永远搜索,也不能太窄以至于错过了您要查找的内容。
  • 补充@itsme86 提到的内容:用户肯定不是他们自己的经理。我猜你需要去掉用户名,只使用new DirectoryEntry(adPath)
  • 完美!工作。我从 AD 路径中删除了用户的 DN,并将搜索范围从 Base 更改为 Subtree,并在我正在测试的经理 DN 下获得了所有 60 个用户。现在,如果有人从 cmets 中创建了答案,我会将其标记为答案。
  • @NoBullMan - 如果没有人回答,您可以自己写一个答案,引用评论员的归属。干杯:)

标签: c# active-directory distinguishedname


【解决方案1】:

按照 itsme86 的建议设置包含所有用户的容器以及 Camilo Terevinto 的从 AD 路径中删除经理的 DN 的具体建议,问题已得到解决。我还必须将搜索范围从基础更改为子树。

以下是对我有用的:

private static List<DirectoryEntry> GetUserDEByManagerDN(string sManagerDN)
{
    string adPath = ConfigurationManager.AppSettings["ADPath"].ToString();

    /* This was one of the issues  */
    //DirectoryEntry de = new DirectoryEntry(adPath + "/" + sManagerDN);
    DirectoryEntry de = new DirectoryEntry(adPath);

    List<DirectoryEntry> lsUsers = new List<DirectoryEntry>();

    using (DirectorySearcher Search = new DirectorySearcher())
    {
        Search.SearchRoot = de;

        /* I had to include extension attribute 14 to get rid of some unusual "users", like Fax, special accounts, etc. You might not need it
        //Search.Filter = "(manager=" + sDN + ")";
        Search.Filter = "(&(manager=" + sDN + ")(extensionAttribute14=INV))";

        //Search.SearchScope = SearchScope.Base;  
        Search.SearchScope = SearchScope.Subtree;
        SearchResultCollection Results = Search.FindAll();

        if (null != Results)
        {
            foreach (SearchResult Result in Results)
            {
                DirectoryEntry deUser = Result.GetDirectoryEntry();

                if (null != deUser)
                    lsUsers.Add(deUser);
            }
        }
    }
    return lsUsers;
}

【讨论】:

  • 谢谢,不知道我能做到!
  • 很高兴能帮到兄弟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多