5

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を使用して開発していることです。何を見落としているのでしょうか?

4

3 に答える 3

4

何らかの理由で、問題はドメイン コントローラーへのパスにありました。パスを記述してもDC=box123,DC=dom機能しませんでしたが、パスを使用すると機能しましbox123.domた。理由は言えません。ローカル ドメインで再現できる動作ではありませんが、問題は解決しました。

編集:
さらに調査すると、構造DC=box123,DC=domを縮小してDC=dom正しく機能させることもできました。アドレス指定のダイナミクスは理解できませんが、DirectorySearcher オブジェクトを使用してサンプル ユーザーへのパスを表示することで問題を特定できました。これにより、ユーザーへのパスが次のようになることがわかりました。LDAP://box123.dom/CN=username/CN=Users/DC=dom

于 2011-11-11T15:34:35.313 に答える
2

これは比較的古い質問であることは承知していますが、私たちの解決策が将来誰かを助けるかもしれないと思いました. お客様のライブ環境で同じ問題が発生しました。最初はテスト環境で問題を再現できませんでしたが、https でサイトにアクセスした場合にのみ発生することがわかりました。多くの試行錯誤と Microsoft へのサポート コールを通じて、プリンシパル コンテキストを作成するためのコールをいじり始めました。当初、オブジェクトのインスタンス化は次のようにコーディングされていました。

using (var pc = new PrincipalContext(ContextType.Domain, <serverUri>, <ldapDomain>, <username>, <userpass>))

完全なコンストラクターは、1 つの追加パラメーターを取ることができます

using (var pc = new PrincipalContext(ContextType.Domain, <serverUri>, <ldapDomain>, ContextOptions.Negotiate, <username>, <userpass>))

が指定されると (このContextOption場合は である必要がありましたNegotiate)、 への呼び出しはUserPrincipal.FindByIdentity期待どおりに機能しました。

于 2014-10-21T15:36:04.443 に答える
1

ここで dcPath の値を表示しないのは、このように PrincipalContext を構築する方法です。

Using myContext As New PrincipalContext ContextType.Domain, "dom.fr:389", "dc=dom,dc=fr", "jpb", "root.123");

その後、例外はuserName、コントローラーで有効な samAccountName ではないという事実によって説明できます。

于 2011-11-11T07:44:48.033 に答える