.Netのディレクトリサービスを使用して簡単なLDAPクエリを実行しようとしています。
DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com");
directoryEntry.AuthenticationType = AuthenticationTypes.Secure;
DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry);
directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username);
var result = directorySearcher.FindOne();
var resultDirectoryEntry = result.GetDirectoryEntry();
return resultDirectoryEntry.Properties["msRTCSIP-PrimaryUserAddress"].Value.ToString();
そして、私は次の例外を受け取っています:
System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000)
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
at System.DirectoryServices.DirectorySearcher.FindOne()
コンソールアプリのスニペットとして、これは機能します。ただし、WCFサービスの一部として(同じ資格情報で実行)実行すると、上記の例外がスローされます。
助言がありますか?
ありがとう
これは許可の問題です。
コンソールアプリを実行すると、そのアプリは資格情報で実行されます。 「あなた」として。
WCFサービスはどこで実行されますか? IISで?最も可能性が高いのは、Active Directoryのクエリを許可されていない別のアカウントで実行されることです。
WCFのなりすまし機能を動作させて、独自の資格情報が渡されるようにするか、DirectoryEntryの作成時にユーザー名/パスワードを指定することができます。
DirectoryEntry directoryEntry =
new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com",
userName, password);
OK、だから結局は資格情報ではないかもしれません(私が見るケースの80%以上で通常そうです)。
コードを少し変更するのはどうですか?
DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry);
directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username);
directorySearcher.PropertiesToLoad.Add("msRTCSIP-PrimaryUserAddress");
var result = directorySearcher.FindOne();
if(result != null)
{
if(result.Properties["msRTCSIP-PrimaryUserAddress"] != null)
{
var resultValue = result.Properties["msRTCSIP-PrimaryUserAddress"][0];
}
}
私の考えは次のとおりです:DirectorySearcher
にすぐに興味のある属性を教えてはどうですか?その後、検索結果から完全なDirectoryEntry
を取得するために追加の手順を実行する必要はありません(高速である必要があります)。ディレクトリサーチャーにそのプロパティを見つけるように指示したため、検索結果-したがって、null(値が設定されていない)でない限り、簡単に取得できるはずです。
マーク
私は何度も何度も同じことをしましたが、何も助けにならないようでした。
パスをldap://
からLDAP://
に変更すると、うまくいきました。
Ektronのコンテキストでは、この問題はWindowsに「IIS6メタベース互換性」機能をインストールすることで解決されます。
IIS6メタベースの互換性については、「Windowsの機能」または「ロールサービス」を確認し、不足している場合は追加します。
私は同じエラーがありました-私の場合、違いを生んだのはパス引数の余分なスラッシュでした。
悪い:
DirectoryEntry directoryEntry =
new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com/",
userName, password);
良い:
DirectoryEntry directoryEntry =
new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com",
userName, password);
私にもこのエラーがありました。私にとっては、名前にスラッシュが含まれるOUでした: "File/Folder Access Groups"。
これは フォーラムスレッド が正しい方向を示してくれました。最後に、使用前に各パス値で.Replace("/","\\/")
を呼び出すことで問題が解決しました。
IISホストされたサイトで、アプリプールをリサイクルしてみてください。問題を修正しました。ありがとうございます。
私が住んでいる会社の本番システムでその問題が発生しました... LDAPバインドを作成したWebページが、IPの変更後に機能しなくなりました。
解決策... ...基本認証をインストールして、ここに示されているトラブルシューティングを実行します。 https://support.Microsoft.com/en-us/kb/329986
そしてその後、物事は機能し始めました。テストしているページで基本認証を再度無効にした後でも、他のすべてのページはWindows認証で再び機能し始めました。
よろしく、アカシオ
ちょうど、私は同じエラーがあり、正しい資格情報を使用していましたが、私のLDAP URLは間違っていました:(
まったく同じエラーメッセージとコードが表示されました
このエラーは、物理マシンのメモリが不足している場合に発生する可能性があります。私の場合、IISでADにアクセスしようとしてサイトをホストしていましたが、サーバーのメモリが不足していました。
私の同様の問題に一日費やしましたが、これらの答えはすべて役に立ちませんでした。
私の場合は、IIS設定でWindows認証を有効にしていませんでした...
DirectoryEntry.Patchで記号「LDAP //:」の後に何もない場合、同じエラーが発生します。 directorySearcher.FindOne()の前に、directoryEntry.Pathを確認する必要があります。ドメインを明示的に指定しない限り、「LDAP://」にする必要はありません。
private void GetUser(string userName, string domainName)
{
DirectoryEntry dirEntry = new DirectoryEntry();
if (domainName.Length > 0)
{
dirEntry.Path = "LDAP://" + domainName;
}
DirectorySearcher dirSearcher = new DirectorySearcher(dirEntry);
dirSearcher.SearchScope = SearchScope.Subtree;
dirSearcher.Filter = string.Format("(&(objectClass=user)(|(cn={0})(sn={0}*)(givenName={0})(sAMAccountName={0}*)))", userName);
var searchResults = dirSearcher.FindAll();
//var searchResults = dirSearcher.FindOne();
if (searchResults.Count == 0)
{
MessageBox.Show("User not found");
}
else
{
foreach (SearchResult sr in searchResults)
{
var de = sr.GetDirectoryEntry();
string user = de.Properties["SAMAccountName"][0].ToString();
MessageBox.Show(user);
}
}
}