这个问题已经有了答案:
How to get all the AD groups for a particular user?
10个答案
我回来用我的活动目录工具…
我试图在用户的“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[]。
如何才能看到所有组?

最佳答案

如果您使用的是.net 3.5或更高版本,则应该查看System.DirectoryServices.AccountManagement(s.ds.am)命名空间。请阅读以下内容:
Managing Directory Security Principals in the .NET Framework 3.5
MSDN docs on System.DirectoryServices.AccountManagement
基本上,您可以定义一个域上下文并在广告中轻松找到用户和/或组:

// 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使得在广告中与用户和组一起玩变得非常容易!

09-07 00:28