创建新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);
}
答案 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);
}
}