1

我使用下面的代码从 Active Directory 获取用户的安全组列表,但是我从 Active Directory 获取用户的所有组,你能帮我从 Active Directory 获取用户的安全组列表吗?

public List<string> getSecurityGroup(string userName,SearchInfo searchInfo, Error errorInfo)
        {
            List<string> groups =new List<string>() ;
            try
            {
                string ldapPath = @"LDAP://" + searchInfo.HostName + @"/" + searchInfo.SearchDN;
                DirectoryEntry obEntry = new DirectoryEntry(ldapPath);

                DirectorySearcher srch = new DirectorySearcher(obEntry,
                    "(sAMAccountName=" + userName + ")");
                SearchResult res = srch.FindOne();
                if (null != res)
                {
                    DirectoryEntry obUser = new DirectoryEntry(res.Path);
                    // Invoke Groups method.
                    object obGroups = obUser.Invoke("Groups");
                    foreach (object ob in (IEnumerable)obGroups)
                    {
                        // Create object for each group.
                        DirectoryEntry obGpEntry = new DirectoryEntry(ob);
                        groups.Add(obGpEntry.Name);
                    }
                 }
            }
            catch (System.Runtime.InteropServices.ExternalException comException)
            {
                errorInfo.ErrorCode = comException.ErrorCode;
                errorInfo.ErrorMessage = comException.Message;
            }
            catch (Exception exception)
            {
                errorInfo.ErrorCode = -1;
                errorInfo.ErrorMessage = exception.Message;
            }
            return groups;

        }
4

2 回答 2

1

一种方法是查看 groupType 属性,例如,您可以使用以下命令搜索安全组:

(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))

顺便说一句,获取给定用户所属的所有组(直接或间接)的另一种方法是使用搜索过滤器:

(member:1.2.840.113556.1.4.1941:=<user-distinguished-name>)

您可以将其与 groupType 过滤器结合使用。有关详细信息,请参阅有关搜索过滤器语法的 MSDN 文章

更新

你能告诉我我必须修改代码的哪一部分吗?

上面是一个过滤器,作为参数传递给DirectorySearcher方法。例如,以下内容应直接或间接创建sAMAccountName每个安全组成员的列表:userrName

List<string> groups = new List<string>();
using (var root = new DirectoryEntry(ldapPath))
{
    using(var srch = new DirectorySearcher(root, 
                   "(sAMAccountName=" + userName + ")"))
    {
        SearchResult res = srch.FindOne();
        if (res != null)
        {
            string dn = (string) res.Properties["distinguishedName"][0];
            string filter = String.Format(CultureInfo.InvariantCulture,
                "(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)(member:1.2.840.113556.1.4.1941:={0}))",
                dn);
            using (var groupSearch = new DirectorySearcher(root, filter, new[] { "sAMAccountName" }))
            {
                groupSearch.PageSize = 1000;
                using (var resultCollection = groupSearch.FindAll())
                {
                    foreach (SearchResult result in resultCollection)
                    {
                        groups.Add((string) result.Properties["sAMAccountName"][0]);
                    }
                }
            }
        }
    }
}
于 2012-09-21T12:22:33.627 回答
0

首先:这看起来很像 C#,而不是 java。你为什么发布标签Java?

其次:在AD中,安全组应该属于OU“安全组”。因此,请检查每个组的可分辨名称。如果它包含“ OU=Security Groups”,它应该是一个安全组。

或者,您可以获取组记录并检查sAMAccountType属性。安全组的值应为 0x10000000(十进制为 268435456)。

编辑:在 C# 中不完全流利我不能保证完全正确,但也许可以尝试这样的事情:

foreach (object ob in (IEnumerable)obGroups)
{
    // Create object for each group.
    DirectoryEntry obGpEntry = new DirectoryEntry(ob);
    if (obGpEntry.Path.ToLower().contains("ou=security groups")) {
        groups.Add(obGpEntry.Name);
    }
}
于 2012-09-21T08:40:19.990 回答