【问题标题】:Getting a list of groups membership (memberOf) in Active Directory [duplicate]在 Active Directory 中获取组成员身份列表 (memberOf) [重复]
【发布时间】:2012-02-28 10:18:32
【问题描述】:

我带着我的 Active Directory 工具回来了...

我正在尝试在用户的“成员”属性中列出组。 下面是我使用的函数:

public static DataTable ListGroupsByUser(string selectedOu)
{
    DataTable groupListByUser = new DataTable();
    String dom = "OU=" + selectedOu + ",OU=XXX,DC=XXX,DCXXX,DC=XXX,DC=XXX";
    DirectoryEntry directoryObject = new DirectoryEntry("LDAP://" + dom);

    DataColumn column;
    DataRow row;

    column = new DataColumn();
    column.ColumnName = "ID";
    groupListByUser.Columns.Add(column);

    column = new DataColumn();
    column.ColumnName = "User";
    groupListByUser.Columns.Add(column);

    column = new DataColumn();
    column.ColumnName = "Groups";
    groupListByUser.Columns.Add(column);
    int i = 1;

    foreach (DirectoryEntry child in directoryObject.Children)
    {                
        row = groupListByUser.NewRow();
        groupListByUser.Rows.Add(row);
        row["ID"] = i++;

        if (child.Properties["memberOf"].Value != null)
        {                    
            row["User"] = child.Properties["sAMAccountName"].Value.ToString();
            row["Groups"] = child.Properties["memberOf"].Value.ToString();
        }
        else
        {
            row["Groups"] = "blabla";
        }
    }
    return groupListByUser;
}

它为仅属于一个组的用户返回正确的组。只要有多个组,它就会返回 System.Object[]。

如何查看所有组?

【问题讨论】:

    标签: c# active-directory


    【解决方案1】:

    问题是你的Properties["memberOf"].Value.ToString()

    我做了一些调查,这段代码对我有用:

    var memberGroups = child.Properties["memberOf"].Value;
    
    if (memberGroups.GetType() == typeof(string))
    {
        row["Groups"] = (String)memberGroups;
    }
    else if (memberGroups.GetType().IsArray)
    {
        var memberGroupsEnumerable = memberGroups as IEnumerable;
    
        if (memberGroupsEnumerable != null)
        {
            var asStringEnumerable = memberGroupsEnumerable.OfType<object>().Select(obj => obj.ToString());
            row["Groups"] = String.Join(", ", asStringEnumerable);
        }
    }
    else
    {
        row["Groups"] = "No group found.";
    }
    

    它不是很可爱,但它确实有效,并为进一步改进提供了空间。 ;-)

    【讨论】:

    • 感谢 Oliver,我尝试了您的解决方案,但似乎有点棘手。我真的不明白我在做什么: var groups = objArray.Cast().Select(elem => elem.Values.ToString());它返回给我一个错误:值不能为空。参数名称:来源
    • @HenryMeyer:我重新编写了我的代码,但我认为从长远来看,marc_s 方法确实更好,因为您不必为这些字符串和对象数组而烦恼。它们是特定类型的类,使得访问所有这些东西变得非常容易。
    【解决方案2】:

    如果您使用的是 .NET 3.5 及更高版本,则应查看 System.DirectoryServices.AccountManagement (S.DS.AM) 命名空间。在此处阅读所有相关信息:

    基本上,您可以定义域上下文并在 AD 中轻松找到用户和/或组:

    // set up domain context
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
    
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");
    
    if(user != null)
    {
       var groups = user.GetGroups();
       // or there's also:
       //var authGroups = userByEmail.GetAuthorizationGroups()
    }
    

    GetGroups()GetAuthorizationGroups() 的调用也将返回嵌套组成员资格 - 因此您无需再寻找那些嵌套成员资格!

    新的 S.DS.AM 让在 AD 中与用户和组一起玩变得非常容易!

    【讨论】:

    • 感谢 Marc,我设法处理了用户和组,我不能做的是遍历用户的成员列表。我是否值得用 accountManagement 命名空间而不是 directoryServices 重建工具?
    • @Oliver:谢谢大家。尽管有你的建议,我还是找到了一个解决方案,如下: 'code' if (child.Properties["memberOf"].Value != null) { foreach (Object memberof in child.Properties["memberOf"]) { //row[ "用户"] = child.Properties["sAMAccountName"].Value.ToString(); row["Member Of"] += memberof.ToString() + " /// "; } } else { row["Member Of"] = "No Group Defined"; }
    • GetGroups()GetAuthorizationGroups() 的区别?
    • 如果您不想获取所有(嵌套)组,而只想要名称怎么办?
    • 回答我自己的问题:在 Principal 上调用 GetUnderlyingObject 并通过 Properties 数组获取“memberOf”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多