如何测试AD用户是否是本地组的成员

时间:2012-11-24 04:21:33

标签: c# active-directory active-directory-group

创建新AD组的IT部门审批流程非常繁琐,因此我一直在寻找使用本地组来控制访问权限的方法。

在Windows Server 2008 R2上,我创建了一个本地组,并添加了其他几个AD组以及一些AD用户帐户作为成员。

我需要编写一些C#代码来确定特定的AD用户是否属于特定的本地组,其中本地组包含AD组和AD用户的混合。在某些情况下,AD组可能包含嵌套的AD组。

更新

当域用户帐户直接是本地组的成员时,以下代码有效,但当本地组包含域用户所属的域组时,它不起作用。

public static void Test()
{
    // returns true, domain user account user623 is in domain group ...
    bool b1 = UserIsInDomainGroup("user623", "apc.app.cartopac.surfaceland");

    // returns true - user623 is directly in local.groupa
    bool b2 = UserIsInlocalGroup("user623", "local.groupa");

    // returns false, even though apc.app.cartopac.surfaceland is in local.groupb
    bool b3 = UserIsInlocalGroup("user623", "local.groupb");
}

public static bool UserIsInDomainGroup(string userName, string grpName)
{
    var domainContext = new PrincipalContext(ContextType.Domain, "contoso");
    var user = UserPrincipal.FindByIdentity(domainContext, userName);
    return user.IsMemberOf(domainContext, IdentityType.Name, grpName);
}

public static bool UserIsInlocalGroup(string userName, string localgrpName)
{
    var machineContext = new PrincipalContext(ContextType.Machine);
    var grpPrincipal = GroupPrincipal.FindByIdentity(machineContext, IdentityType.Name, localgrpName);
    var domainContext = new PrincipalContext(ContextType.Domain, "contoso");
    var user = UserPrincipal.FindByIdentity(domainContext, userName);
    return user.IsMemberOf(grpPrincipal);
}

1 个答案:

答案 0 :(得分:0)

您的示例工作正常,您将UserPrincipalName而不是sAMAccountName传递给方法,并且该contoso仅在样本中隐藏..

编辑:

试试this。它会检查用户是否是成员,即使是通过组嵌套:

bool b1 = IsInGroup("sAMAccountName", "LOCALGROUPNAME");


    static bool IsInGroup(string user, string group)
    {
      using (WindowsIdentity identity = new WindowsIdentity(user))
      {
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(group);
      }
    }