0

ユーザーが AD グループのメンバーであるかどうかを確認する方法があります。自分の AD アカウントを資格情報として使用してみましたが、ユーザープリンシパルに関する情報 (電子メールなど) を取得しました。しかし、ユーザープリンシパルグループにアクセスすると、次のエラーメッセージが表示されます。

例外:
メッセージ: サーバーが動作していません。
ソース: System.DirectoryServices.AccountManagement
ターゲット サイト: System.DirectoryServices.AccountManagement.ResultSet GetGroupsMemberOf(System.DirectoryServices.AccountManagement.Principal)

STACKTRACE:
System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(プリンシパル p)
で Authorization.AuthorizeAD.IsMemberOfGroup(文字列ユーザー)
で PVM.Controllers.SecurityController.IsMemberOfGroup(文字列ユーザー)

InnerException: System.Runtime.InteropServices.COMException (0x8007203A): サーバーが動作していません。

System.DirectoryServices.PropertyValueCollection.PopulateList()
で System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
で System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
で System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDomainInfo() で
System.DirectoryServices.AccountManagement.ADStoreCtx.get_DnsForestName()
で System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf (プリンシパル p) で

コード:

public bool IsMemberOfGroup(string user) {
    using (var context = new PrincipalContext(ContextType.Domain, ContextName, ContextContainer, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer, "myUsername", "myPass")) {
        using (var userPrincipal = UserPrincipal.FindByIdentity(
                context,
                IdentityType.SamAccountName,
                user)) {
            //I can access userPrincipal.DisplayName etc
                var groupName = "TestGroup"
                //This is where I get the error
                return userPrincipal.IsMemberOf(context, IdentityType.SamAccountName, groupName);
            }
        }

        return false;
    }

パーミッションの問題ではないかと思いましたが、サーバーからldp.exeを使用すると、Active Directoryのクエリに問題はありませんでした。

すべてがローカルで正常に動作します。IIS AppPool ログインなどを変更しようとしましたが、結局、資格情報を PrincipalContext オブジェクトと共に送信することになりました。

ここで何が欠けているのか、誰にも分かりますか?

4

1 に答える 1

0

これは、UserPrincipal.IsMemberOf の代わりに PrincipalSearcher を使用することで解決され、次に独自の IsMemberOf() を実行しました。

private static bool IsMemberOf(PrincipalContext context, PrincipalSearcher searcher, string user,
        string groupToFind) {
        searcher.QueryFilter = new GroupPrincipal(context, groupToFind);

        var group = searcher.FindOne() as GroupPrincipal;
        if (group == null) {
            return false;
        }

        if (group.GetMembers()
            .Select(member => member as UserPrincipal)
            .Where(principal => !string.IsNullOrEmpty(principal?.SamAccountName))
            .Any(principal => principal.SamAccountName.Equals(user))) {
            return true;
        }

        return false;
    }
于 2016-03-14T09:02:21.237 に答える