ADSI Indirect Group Membership

2019-11-03 00:03发布

我试图创建一个接受Active Directory安全组的列表,并返回该用户是否为成员(直接或间接)一个布尔响应的方法。 我使用Adaxes(基本上延伸ADSI与自己的一些功能)。 它们具有一个对象(IAdmGroup)返回字节[]为一组所有成员(直接和间接)的阵列。 我想避免使用该方法,如果我可以,因为一些群体的下面有非常大的群体(10000个用户),我不想影响性能,如果我能帮助它。

这是我的问题的一个例子:组1具有2组作为成员。 用户1为2组的成员,如果我通过我的方法用户1和第1组,我应该得到“真”。 组1还具有第3组在它。 组3有10,000多名成员,我会恨到对那个组的所有成员10,000拉成一个集合,通过收集搜索,看看如果用户1是它。

我使用C#,.Net4.0和WCF。

这里是我到目前为止(我知道这是不是很多)

public Dictionary<string, bool> CheckGroupMembership(List<string> groups, string guid)
{

    var resp = new Dictionary<string, bool>();
    foreach (string group in groups)
    {
        var user = getIADsUser("Adaxes://<GUID=" + guid + ">"); //gets the IADsUser object
        var adGroup = GetGroup(group); //Gets IADsGroup

    }
}

Answer 1:

您可以使用System.DirectoryServices.AccountManagement和WindowsPrincipal

PrincipalContext context = new PrincipalContext(ContextType.Domain, "DomainName");
UserPrincipal user = UserPrincipal.FindByIdentity(context, guid);

WindowsPrincipal wpuser = new WindowsPrincipal(new WindowsIdentity(user.UserPrincipalName));
bool blIsInRole = wpuser.IsInRole("TheGroupName");
if (blIsInRole)
  Console.WriteLine("IsInRole : Belongs too");
else
  Console.WriteLine("IsInRole : Don't Belongs too");


Answer 2:

相反,让所有组的所有成员,你需要获得一组用户中的一员:

public Dictionary<string, bool> CheckGroupMembership(List<string> groups, string guid)
{
    // Get GUIDs of groups
    IADsUser user = getIADsUser("Adaxes://<GUID=" + guid + ">"); //gets the IADsUser object
    Object[] parentGroupGuidsArray = (Object[])user.GetEx("adm-MemberOfGuid");
    HashSet<Guid> parentGroupGuids = new HashSet<Guid>();
    foreach (Byte[] guidAsBytes in parentGroupGuidsArray)
    {
        parentGroupGuids.Add(new Guid(guidAsBytes));
    }

    // Add groups to result dictionary
    var resp = new Dictionary<string, bool>(groups.Count, StringComparer.OrdinalIgnoreCase);
    foreach (String group in groups)
    {
        IADsGroup adGroup = GetGroup(group); //Gets IADsGroup
        Guid groupGuid = new Guid((Byte[])adGroup.Get("objectGuid"));
        resp.Add(group, parentGroupGuids.Contains(groupGuid));
    }

    return resp;
}


文章来源: ADSI Indirect Group Membership