【问题标题】:How to get groups a group is member of in ActiveDirectory using C#?如何使用 C# 在 Active Directory 中获取组成员?
【发布时间】:2009-05-27 12:52:31
【问题描述】:

正如标题所述,我需要一种方法来获取一个组在 ActiveDirectory 中所属的所有组。

要获取用户所属的所有组,我使用

public static DirectoryEntry[] GetGroupsUserIsMemberOf(DirectoryEntry directoryEntry)
{
    ArrayList        groupsUserIsMemberOf = new ArrayList();
    object           groups               = null;
    DirectoryEntry[] userGroupEntries     = null;

    if (directoryEntry != null && directoryEntry.SchemaClassName == "user") {
        groups = directoryEntry.Invoke("Groups", null);

        foreach (object group in (IEnumerable)groups) {
            groupsUserIsMemberOf.Add(new DirectoryEntry(group));
        }

        userGroupEntries = (DirectoryEntry[])groupsUserIsMemberOf.ToArray(typeof(DirectoryEntry));
    }

    return userGroupEntries;
}

但是在尝试的时候

public static DirectoryEntry[] GetGroupsGroupIsMemberOf(DirectoryEntry directoyEntry)
{
    ArrayList        groupsGroupIsMemberOf = new ArrayList();
    object           groups               = null;
    DirectoryEntry[] groupEntry       = null;

    if (directoyEntry != null && directoyEntry.SchemaClassName == "group") {
        groups = directoyEntry.Invoke("Groups", null); // throws exception (see below)

        foreach (object group in (IEnumerable)groups) {
            groupsGroupIsMemberOf.Add(new DirectoryEntry(group));
        }

        groupEntry = (DirectoryEntry[])groupsGroupIsMemberOf.ToArray(typeof(DirectoryEntry));
    }

    return groupEntry;
}

获取所有组,一个组是该行的成员

        groups = directoyEntry.Invoke("Groups", null); // throws exception (see below)

抛出异常:

"Unknown name. (exception HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))"

有人知道获取组所属所有组的高效方法吗?

【问题讨论】:

    标签: c# .net active-directory


    【解决方案1】:

    我想我自己就有了:

    要获取某个组所属的所有组,您可以使用

    directoryEntry.Properties["memberOf"][0]
    

    你会得到一个字符串对象,其中包含你的组所属的所有 ADObjects。

    将其拆分为单个 AD-Object 字符串,检查是否分组。

    【讨论】:

    • 是的,就是这样!
    【解决方案2】:

    此代码将为您获取当前登录用户的组列表,它比查询域控制器的信息更快,因为它来自缓存的安全标识符:

    WindowsIdentity currentIdent = WindowsIdentity.GetCurrent();
    IdentityReferenceCollection currentGroups = currentIdent.Groups;
    
    List<String> groups = new List<string>();
    foreach (IdentityReference indentity in currentGroups)
    {
       groups.Add(indentity.Translate(typeof(NTAccount)).ToString());
    }
    

    【讨论】:

    • 谢谢本,我会试一试的。问候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多