Позвольте мне представить некоторый контекст, над которым я работаю:
- Моя среда — это удаленный компьютер, подключенный через VPN, и ожидается, что сценарий будет запущен на других удаленных компьютерах.
- Сервер LDAP доступен удаленно через VPN на 389 порт.
- Этот сценарий, хотя и работает на .NET, должен быть независимым от ОС и работает на .NET 10+.
Код: Выделить всё
ldapsearch -x -H ldap://:389 -D "myDomain\MYUSER" -w MyPassword -b "baseDN" -LLL "(sAMAccountName=MYUSER)"
Проблема заключается в том, что я пытаюсь реализовать те же параметры соединения для подключения к этой службе LDAP через System.DirectoryServices.Protocols. Я думаю, что тот же запрос не работает:
Код: Выделить всё
static LdapConnection OpenManualConnection(string ldapUri, NetworkCredential creds, string bindDn, string baseDn)
{
var uri = new Uri(ldapUri);
var port = 389;
var addresses = Dns.GetHostAddresses(uri.Host)
.Where(a => a.AddressFamily == AddressFamily.InterNetwork)
.ToArray();
var ldapId = new LdapDirectoryIdentifier(addresses[0].ToString(), port);
Console.WriteLine($"Using manual LDAP connection settings: {ldapUri}:{port}, base DN: {baseDn}");
var connection = new LdapConnection(ldapId, creds, AuthType.Basic)
{
SessionOptions =
{
ProtocolVersion = 3,
SendTimeout = TimeSpan.FromSeconds(60)
}
};
Console.WriteLine("Attempting LDAP bind with user: " + bindDn);
var bindTask = Task.Run(connection.Bind);
if (!bindTask.Wait(TimeSpan.FromSeconds(60)))
{
connection.Dispose();
throw new TimeoutException("LDAP bind timed out after 60 seconds. The server may be unreachable.");
}
try
{
bindTask.GetAwaiter().GetResult();
}
catch (LdapException ldapEx)
{
connection.Dispose();
// Mirror ldapsearch exit-code meanings for actionable messages
throw new LdapException(ldapEx.ErrorCode, $"LDAP bind failed (code {ldapEx.ErrorCode}): {ldapEx.Message}{hint}");
}
return connection;
}
При обнаружении ошибок на консоли появляется следующая ошибка:
ОШИБКА: запрос Active Directory не выполнен. Сервер LDAP недоступен.
Кроме того, я пробовал использовать другой AuthType, но тоже безуспешно.
Почему ldapsearch работает успешно, а System.DirectoryServices.Protocols не работает на той же машине? Существуют ли различия в механизмах аутентификации (простое связывание и согласование/NTLM/Kerberos) или обработке TLS/StartTLS, погоне за ссылками или таймаутах?
Какая конфигурация требуется в C# для соответствия поведению ldapsearch?
Буду признателен за любую информацию о различиях между клиентами ldapsearch и .NET LDAP.
Я вроде как потерялся, так как для меня это в новинку, и я немного изучил документацию, но безуспешно.
Заранее спасибо
Мобильная версия