ユーザーが 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 オブジェクトと共に送信することになりました。
ここで何が欠けているのか、誰にも分かりますか?