System.DirectoryServices.AccountManagement
私は現在、アセンブリ内のユーティリティを使用して、ドメインセキュリティグループに基づくASP.NETアプリケーションの読み取り専用の役割プロバイダーを実装することを目指しています。開発ドメインでは正常に機能するが、デプロイメント環境では失敗する次のコードがあります。
Using myContext As New PrincipalContext(ContextType.Domain, Nothing, "DC=My,DC=Controller", accountName, accountPassword)
Try
Dim p As UserPrincipal = UserPrincipal.FindByIdentity(myContext, IdentityType.SamAccountName, userName)
Dim groups = p.GetAuthorizationGroups()
For Each g In groups
Debug.WriteLine("Found security group: " & g.DisplayName & vbNewLine)
Next
Catch ex As Exception
Debug.WriteLine("Encountered an exception: " & vbNewLine & ex.ToString())
End Try
End Using
例外スタックトレースは次のように返されます。
System.DirectoryServices.AccountManagement.PrincipalOperationException:サーバーにそのようなオブジェクトはありません。 ---> System.DirectoryServices.DirectoryServicesCOMException(0x80072030):サーバーにそのようなオブジェクトはありません。 System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)で System.DirectoryServices.DirectoryEntry.Bind()で System.DirectoryServices.DirectoryEntry.get_SchemaEntry()で System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de)で System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntry ctxBase、ブール値ownCtxBase、文字列ユーザー名、文字列パスワード、ContextOptionsオプション) System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry entry)で System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()で ---内部例外スタックトレースの終わり--- System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()で System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()で System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()で System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()で System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContextコンテキスト、タイプprincipalType、Nullable`1アイデンティティタイプ、文字列identityValue、DateTime refDate) System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContextコンテキスト、タイプprincipalType、IdentityTypeidentityType、StringidentityValue)で System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context、IdentityType IdentityType、String IdentityValue)で
ここでの明らかな「落とし穴」は、オブジェクトが実際にサーバー上に存在することを確認することです。ただし、どのアカウントのSAMアカウント名を使用しても、通話から同じ結果が得られることは間違いありません。さらに、MicrosoftActiveDirectoryMembershipProvider
は同じSAMアカウント名に対して問題なく認証でき、DirectorySearcher
クラスでその情報を使用してオブジェクトを見つけることができます。開発ネットワークと展開で識別できる唯一の違いは、展開環境のDCがWindows Server 2003ボックスであるのに対し、ローカルではWindows Server2008DCを使用して開発していることです。何を見落としているのでしょうか?