私はこれがまったくの初心者です
PrincipalContext
を使用してLDAPサーバーに接続しようとしています。私はこのサイトのすべての解決策を試しましたが、役に立ちませんでした。
私が試したこと:
PrincipalContext insPrincipalContext =
new PrincipalContext(ContextType.Domain);
PrincipalContext insPrincipalContext =
new PrincipalContext(ContextType.Domain, "ldap://localhost:389/dc=maxcrc,dc=com");
PrincipalContext insPrincipalContext =
new PrincipalContext(ContextType.Domain, "maxcrc.com");
すべて同じ結果になります:
LDAPサーバーは使用できません
ContextType.Machine
のみが基本的に機能します。
LDAPサーバーが正しくセットアップされているかどうか不明:
Softerra LDAP Browserを使用したテスト
最初から最後までのチュートリアルは大歓迎です...
私は同じ問題に直面しており、解決策を見つけました。
次のコードを使用して簡単に接続できます:
ADUser_Id = "domainName\\username"; //make sure user name has domain name.
Password = "xxxx";
var context = new PrincipalContext(ContextType.Domain,"server_address", ADUser_Id,Password);
/* server_address = "192.168.15.36"; //don't include ldap in url */
同様の問題がありました。オブジェクトの初期化でユーザー名とパスワードを渡す必要があることがわかりました。以下のようなステートメントを使用してみてください:
PrincipalContext insPrincipalContext =
new PrincipalContext(ContextType.Domain,
"ldap://localhost:389/dc=maxcrc,dc=com",
userName,
password);
また、ユーザー名にドメインが含まれていることを確認してください。
例えば、
userName = "mydomainname" + "\\" + "john_jacobs"
PrincipalContext
には、次のコンストラクタオーバーロードを使用します。
public PrincipalContext(
ContextType contextType,
string name,
string container
)
そして、サーバー名をLDAP文字列から分離します。
PrincipalContext insPrincipalContext =
new PrincipalContext(ContextType.Domain, "localhost:389", "dc=maxcrc,dc=com");
https://msdn.Microsoft.com/en-us/library/bb348316%28v=vs.110%29.aspx
そのエラーは、明示的に指定せずに「匿名」として接続しようとしたことが原因である可能性があります。デフォルトでは、すべての接続が交渉可能です。したがって、そのようなことを試す場合は、次のことを試すことができます。
LdapDirectoryIdentifier ldap = new LdapDirectoryIdentifier("My Hostname or IP Address",10389); //10389 might be your non default port
LdapConnection connection = new LdapConnection(ldap);
connection.AuthType = AuthType.Anonymous;
私の環境では、ドメインコントローラーのホスト名だけでプリンシパルコンテキストを作成し、ユーザーの資格情報を個別に検証する必要がありました。
string domainControllerName = "PDC";
string domainName = "MyDomain"; // leave out the .Local, this is just to use as the prefix for the username if the user left it off or didn't use the principal address notation
string username = "TestUser";
string password = "password";
using (var ldap = new PrincipalContext(ContextType.Domain, domainControllerName))
{
var usernameToValidate = username;
if (!usernameToValidate.Any(c => c == '@' || c == '\\'))
usernameToValidate = $"{domainName}\\{username}";
if (!ldap.ValidateCredentials(username, context.Password, ContextOptions.SimpleBind))
throw new UnauthorizedException();
}
この例では、ユーザー名のこれら3つのバリエーションすべてを検証できます。
- TestUser
- MyDomain\TestUser
- [email protected]
代わりにローカルマシンのアドレスを試すことをお勧めします。
ldap://127.0.0.1:389/dc=maxcrc,dc=com
それがうまくいかない場合は、Wiresharkを起動し、Softerra経由で接続しようとしているときにポート389でトラフィックをキャプチャします。
私がLDAPと.Net DirectoryServicesを操作しているとき、そのエラーは通常、パスの構文または命名規則が正しくないか、有効なディレクトリエンドポイントを指していないことを意味します。