1

新しい AD グループを作成するための IT 部門の承認プロセスは非常に面倒なので、ローカル グループを使用してアクセスを制御する方法を検討することになりました。

Windows Server 2008 R2 で、ローカル グループを作成し、いくつかの AD ユーザー アカウントと共に他のいくつかの AD グループをメンバーとして追加しました。

特定の AD ユーザーが特定のローカル グループに属しているかどうかを判断するには、C# コードを記述する必要があります。このローカル グループには、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);
}
4

1 に答える 1

0

sAMAccountNameではなくUserPrincipalNameをメソッドに渡しており、そのcontosoがサンプル内にあるだけでわかりにくいと仮定すると、サンプルは正常に機能します。

編集:

これを試してください。グループのネストを介しても、ユーザーがメンバーであるかどうかを確認します。

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);
      }
    }
于 2012-11-26T08:36:26.600 に答える