Active directory 间接组成员资格

Active directory 间接组成员资格,active-directory,adsi,active-directory-group,Active Directory,Adsi,Active Directory Group,我正在尝试创建一个方法,该方法接受Active Directory安全组列表,并返回一个布尔响应,以确定用户是否是成员(直接或间接)。我使用的是Adax(它基本上扩展了ADSI自身的一些功能)。它们有一个对象(IAdmGroup),该对象为组的所有成员(直接和间接)返回字节[]数组。如果可以的话,我想避免使用这种方法,因为有些组下有非常大的组(10000多个用户),如果我可以帮助的话,我不想影响性能 下面是我的问题的一个例子: 组1将组2作为成员。用户1是组2的成员。如果我通过了我的方法User

我正在尝试创建一个方法,该方法接受Active Directory安全组列表,并返回一个布尔响应,以确定用户是否是成员(直接或间接)。我使用的是Adax(它基本上扩展了ADSI自身的一些功能)。它们有一个对象(IAdmGroup),该对象为组的所有成员(直接和间接)返回字节[]数组。如果可以的话,我想避免使用这种方法,因为有些组下有非常大的组(10000多个用户),如果我可以帮助的话,我不想影响性能

下面是我的问题的一个例子: 组1将组2作为成员。用户1是组2的成员。如果我通过了我的方法User 1和Group 1,我应该得到“true”。第一组也有第三组。第3组有10000名成员,我不想将该组的所有10000多名成员都拉到一个集合中,并在集合中搜索以查看用户1是否在其中

我正在使用C#、.Net4.0和WCF

这是我到目前为止所拥有的(我知道不多)

公共字典CheckGroupMembership(列表组、字符串guid)
{
var resp=新字典();
foreach(组中的字符串组)
{
var user=getIADsUser(“Adaxes://”);//获取IADsUser对象
var adGroup=GetGroup(group);//获取IADsGroup
}
}
您可以使用和
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");

您需要获取用户所属的组,而不是获取所有组的所有成员:

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;
}
公共字典CheckGroupMembership(列表组、字符串guid)
{
//获取组的guid
IADsUser=getIADsUser(“Adaxes://”);//获取IADsUser对象
Object[]parentGroupGuidsArray=(Object[])user.GetEx(“adm MemberOfGuid”);
HashSet parentGroupGuids=新HashSet();
foreach(parentGroupGuidsArray中的字节[]guidAsBytes)
{
添加(新Guid(guidAsBytes));
}
//将组添加到结果字典
var resp=新字典(groups.Count、StringComparer.OrdinalIgnoreCase);
foreach(组中的字符串组)
{
IADsGroup adGroup=GetGroup(group);//获取IADsGroup
Guid groupGuid=新Guid((字节[])adGroup.Get(“objectGuid”);
分别添加(组,parentGroupGuids.Contains(groupGuid));
}
返回响应;
}
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;
}