4

API System.DirectoryServices.AccountManagement を使用して AD-LDS インスタンスにバインドしています。AD-LDS インスタンスにローカルに存在するユーザーと単純なバインドを使用しています。AD-LDS をホストするサーバーでクライアントを実行すると機能しますが、リモート コンピューターでクライアントを実行すると機能しません。

これは、ユーザーのバインドと検索に使用するコードです。

var c = new PrincipalContext(ContextType.ApplicationDirectory, "fullhostname:50001", "CN=Users,DC=app,DC=local", ContextOptions.SimpleBind, "CN=joe,CN=Users,DC=app,DC=local", "abc");
var u = UserPrincipal.FindByIdentity(c, IdentityType.Name, "john");

これは、リモート コンピューターで実行したときにスローされる例外です。

System.DirectoryServices.AccountManagement.PrincipalServerDownException: The server is not operational.
---> System.Runtime.InteropServices.COMException: The server is not operational.
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectoryEntry.get_Options()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
   --- End of inner exception stack trace ---
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoApplicationDirectoryInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.get_ConnectedServer()
   at MyApplication.DiagnosticsController.TryAdLdsSettings(AdLdsData data) in C:\code\MyApplication\DiagnosticsController.cs:line 166

代わりに System.DirectoryServices API を使用すると、リモート コンピューターからも機能します。

var obj = new DirectoryEntry("LDAP://fullhostname:50001/CN=Users,DC=app,DC=local", "CN=joe,CN=Users,DC=app,DC=local",
                "abc", AuthenticationTypes.None);
obj.RefreshCache();

これは機能しますが、代わりに System.DirectoryServices.AccountManagement API を使用する必要があります。

誰が何が悪いのか知っていますか?

4

2 に答える 2

0

PrincipalContext代わりにandのUserIdentity使用法をDirectoryEntry直接使用するように書き直しました。必要な便利な機能の適切な再実装を見つけるのに数時間かかりましたUserIdentityが、その後はすべてうまくいきました。

そもそもなぜ問題が発生したのか、私にはかなりの謎です。私の唯一の推測は、私の特定の構成で特定のバージョンの AD LDS を使用すると、基盤となるライブラリのどこかにバグがあるということです。ですべてを直接書き直しDirectoryEntry、私が知っている方法とまったく同じようにすべてを取得して、問題を修正しました。

于 2016-03-07T16:23:28.327 に答える
0

いくつかのマイナーな変更を加えて、これをドメインで機能させることができました。これらのヒントが役立つことを願っています.

  1. PrincipalContext を作成するときの最後から 2 番目のパラメーター"CN=joe,CN=Users,DC=app,DC=local"は、LDAP パスではなく、完全修飾ユーザー名である必要があります。これは通常、COMPUTER-NAME\\joe(コンピュータの名前に関係なく) のようになります。または、私のようにドメインに参加している場合は、DOMAIN-NAME\\joe. (fullhostname がローカル ワークステーションでない場合は、ドメインにいる可能性があります。または、ローカルではなくホスト サーバーに対して認証を要求するために fullhostname\joe を指定する必要がある場合があります。ローカルの資格情報はおそらくホストでは機能しないためです)。サーバ)。

  2. これをドメインでテストするには、最初のパラメーターを から に変更する必要がありContextType.ApplicationDirectoryましたContextType.Domain。ドメインに参加していないように聞こえるので、おそらくContextType.ApplicationDirectory.

  3. はブロックされるのに十分な高さであるため:50001、マシンからの発信または「フルホスト名」マシンへの着信のいずれかで、リクエストをブロックしているファイアウォール ソフトウェアがないことを確認してください。もちろん、Active Directory サービスが 50001 で実際に利用可能であることを確認してください。他の認証プロトコルではありません。

于 2016-02-29T16:10:33.010 に答える