8

特定のユーザーがローカル管理者グループのメンバーであるかどうかを確認する必要があるプロセスがあります。

それをチェックするコードは次のようになります。

using (PrincipalContext context = new PrincipalContext(ContextType.Machine, null))
{
    UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, sUserName);
    if (user != null)
    {
         SecurityIdentifier adminsGroupSID = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
         GroupPrincipal group = GroupPrincipal.FindByIdentity(context, IdentityType.Sid, adminsGroupSID.Value);
         if (group != null)
         {
             if (user.IsMemberOf(group))
                 return 0;
         }
    }
}

グループに削除されたアカウント (ドメイン アカウントなど) がある場合、PrincipalOperationException が発生し、「グループ メンバーシップの列挙中にエラー (1332) が発生しました。メンバーの SID を解決できませんでした。」というメッセージが表示されます。

これを克服する方法はありますか: a) 孤立した SID をグループから手動で削除する b) 無視しない?

ありがとう

4

5 に答える 5

0

エラーを回避する 1 つの方法は、別の方法を使用することです。ユーザーがグループのメンバーであるかどうかを確認する代わりに、最初にすべてのグループを取得し、ターゲット グループのリストを確認します。1つの欠点:遅いです....

var groups = UserPrincipal.Current.GetAuthorizationGroups();
var found = groups.FirstOrDefault(principal => principal.Name == "Administrators");
var isMemberOfAdminGroup = found != null;

助けてくれてありがとう:)

于 2014-05-14T13:58:15.820 に答える
-1

考えられる解決策は 3 つあります (すべてテストされておらず、すべての種類のドメイン グループに最後の自分自身を使用しています
)
。 SID のリストです。
3) ユーザーの GetAuthorizationGroups() を使用します (これは非直接グループも使用します。Service-Account は最終的に「Windows Authorization Group」および「PreWindows 2000 Compatible....」のメンバーである必要があります)、グループ リストを使用します。管理者グループを検索します。

于 2012-10-24T14:53:45.657 に答える