正在获取Active Directory中组成员身份(memberOf)的列表

本文关键字:memberOf 列表 身份 组成员 获取 Active Directory | 更新日期: 2023-09-27 18:26:10

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

我正在尝试在用户的"member of"属性中列出组。以下是我使用的功能:

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[].

如何查看所有组?

正在获取Active Directory中组成员身份(memberOf)的列表

问题出在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.";
}

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

如果您使用的是.NET 3.5及更高版本,则应该检查System.DirectoryServices.AccountManagement(S.DS-AM)命名空间。点击此处阅读:

  • 在.NET Framework 3.5中管理目录安全主体
  • System.DirectoryServices.AccountManagement上的MSDN文档

基本上,您可以定义域上下文,并在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中与用户和组一起玩变得非常容易!