查询AD以查找用户的所有组 - 缺少一个组

时间:2010-12-17 11:50:01

标签: c# .net search active-directory

我使用以下代码使用DirectorySearcher查询AD以获取用户的所有AD组。

        List<string> Groups = new List<string>();

        //initialize the directory entry object 
        DirectoryEntry dirEntry = new DirectoryEntry(ldapPath);

        //directory searcher
        DirectorySearcher dirSearcher = new DirectorySearcher(dirEntry);

        //enter the filter
        dirSearcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", username);

        //get the member of properties for the search result
        dirSearcher.PropertiesToLoad.Add("memberOf");
        int propCount;
        SearchResult dirSearchResults = dirSearcher.FindOne();
        propCount = dirSearchResults.Properties["memberOf"].Count;
        string dn;
        int equalsIndex;
        int commaIndex;
        for (int i = 0; i <= propCount - 1; i++)
        {
            dn = dirSearchResults.Properties["memberOf"][i].ToString();

            equalsIndex = dn.IndexOf("=", 1);
            commaIndex = dn.IndexOf(",", 1);
            if (equalsIndex == -1)
            {
                return null;
            }
            if (!Groups.Contains(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1)))
            {
                Groups.Add(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
            }
        }

        return Groups;

但是当我在AD中检查用户的'memberof'选项卡时,我还有一个“Domain Users”组,我没有通过此代码。

有什么想法吗?为什么我没有在'memberof'集合中获得'域用户'?

2 个答案:

答案 0 :(得分:3)

群组可以是其他群组的成员。也许您的用户不是直接成员,而只是间接成员?

在检索AD上的组时,我也会为子组重复所有组。

请注意,您可能会获得无限的递归,因为群组可以(间接地)相互包含。我很难找到这个:-(现在我记得“全局”列表中的每个处理组只处理一次以避免这种情况。)

我写了一个CodeProject article和一些通用库,它们也包含AD类。 (请参阅下载的ZIP文件中“/Tools/DirectoryServices/”子文件夹中的类。

答案 1 :(得分:0)

这是旧的,但对于其他任何人进行搜索,缺少属性成员的原因&#34;域用户&#34;是因为那是AD对象的主要组。要查找用户的主要群组,您需要:

  1. 获取用户的primaryGroupID属性,该属性是域中组对象的唯一序列号
  2. 构建群组的objectSID(获取用户对象的objectSID并将最后一个数字组替换为primaryGroupID)
  3. 根据构建的SID获取组