1

C# で Active Directory サーバーにバインドしようとしていますが、オンサイトでテスト環境では再現できない問題があるようです。

例外が発生しています

System.Runtime.InteropServices.COMException (0x8007203A): The server is not operational.
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.RefreshCache()
   at System.DirectoryServices.DirectoryEntry.FillCache(String propertyName)
   at System.DirectoryServices.DirectoryEntry.get_NativeGuid()  

コードは次のようになります

// domainStr = "LDAP://domainname/rootDSE
using (var de = new DirectoryEntry(domainStr, Username, Password))
{
    var guid = de.NativeGuid;
}

domainStr = "LDAP://domainController/rootDSE"ただし、代わりに(または完全修飾された)ドメインコントローラーに接続しようとすると、問題なくdomainStr = "LDAP://domainController.DomainName"動作します。

私は試した

var d = Domain.GetDomain(new DirectoryContext(
            DirectoryContextType.Domain,
            domainStr,
            Username,
            Password));

しかし、それを行うとまったく同じ例外が発生します。

何か間違ったことをしているのだろうか、別の LDAP URL の方がうまくいくのか、それとも私が抱えている一般的な問題なのか (Google 検索でその問題が発生しても、私にとって有効な解決策が見つかりませんでした) )

また、ソフトウェアが実行されているサーバーが Active Directory になく、接続先の AD のリストがあることを指摘する価値があるかもしれません (したがって、接続しようとするときのユーザー名とパスワード)

4

1 に答える 1

2

これは、DNS サーバーにドメインの A レコードがないためです。DNS サーバーは、ドメイン名を渡すときに解決する IP アドレスを認識していません。デフォルトでは、MS Windows の組み込み DNS サーバーがこの A レコードを追加するため、通常、この問題は発生しません。ただし、大企業では、MS Windows の組み込み DNS サーバーを使用していないことが非常に多くあります。多くの場合、ユーザーはドメイン名に A レコードを追加することを気にしません。

可能であれば、A レコードを DNS サーバーに追加するよう顧客に依頼できます。または、お客様に c:\windows\system32\drivers\etc\hosts ファイルを修正するよう依頼してください。次に、そこに A レコードを追加します。ドメインコントローラーのいずれかを指すようにするだけです。ただし、異なるサイトのユーザーはすべてドメイン名を同じ IP アドレスに解決するため、このアプローチは拡張できません。一部のリモート サイト ユーザーには、速度の問題が発生する場合があります。

スケーラビリティの問題も解決したい場合は、ユーザー名のパスワードを に渡す代わりに、ユーザーになりすますことを検討できますDirectoryEntry。ドメイン ユーザーになりすますと、このようなサーバーレス バインディングを使用できますLDAP://RootDSE

于 2011-03-22T02:24:16.953 に答える