Каким образом можно исправить ошибку "Сервер LDAP недоступен" при попытке подключения к LDAP на Windows Server 2022?

Здравствуйте!

Я столкнулся с проблемой подключения к серверу Active Directory (LDAP) на Windows Server 2022. При попытке соединиться с использованием PowerShell возникает ошибка: 

> "Сервер LDAP недоступен."

Я проверил, что порты 389 (для обычного LDAP) и 636 (для LDAPS) открыты, а также убедился, что сервер доступен и функционирует корректно.

Вот какие шаги я уже предпринял:

1. Использовал команду Test-NetConnection для проверки доступности портов 389 и 636 — оба порта доступны.
2. Пробовал подключиться через PowerShell, используя различные типы аутентификации:
   - Negotiate
   - Basic
3. Соединялся как Administrator с корректными учетными данными: 

```powershell
$ldapConnection = New-Object DirectoryServices.Protocols.LdapConnection("LDAP://localhost:389")
$ldapConnection.AuthType = [System.DirectoryServices.Protocols.AuthType]::Negotiate
$credential = New-Object System.Net.NetworkCredential("Administrator", "Password", "domain.local")
$ldapConnection.Bind($credential)
```

4. Проверил разрешения учетной записи Administrator с помощью dsacls. Все необходимые разрешения присутствуют.
5. Пытался подключаться к localhost по портам 389 и 636, но снова возникает ошибка: "Сервер LDAP недоступен".

Может быть, дело в настройках безопасности, аутентификации или каких-то других аспектах? Если у кого-то есть опыт решения подобных проблем, буду признателен за советы и рекомендации.
  • 11 апреля 2025 г. 12:05
Ответы на вопрос 2
Здравствуйте!

Ошибка "Сервер LDAP недоступен" может возникать по разным причинам, и вы уже сделали много полезных шагов для её устранения. Давайте рассмотрим дополнительные действия, которые могут помочь выявить и исправить проблему.

### 1. Проверка сетевой конфигурации
- **DNS**: Убедитесь, что DNS правильно настроен. Попробуйте выполнить команду `nslookup` на имя LDAP-сервера. Это должно вернуть корректный IP-адрес сервера.
  
- **Ping**: Убедитесь, что сервер доступен с помощью команды `ping <hostname>` или `ping <IP_address>`.

### 2. Проверка сервисов
- **LDAP-сервис**: Убедитесь, что службы Active Directory работают. Проверьте службы, такие как «Active Directory Domain Services», и убедитесь, что они запущены.

### 3. Проверка настроек брандмауэра
Если у вас есть сторонний брандмауэр, попробуйте временно отключить его и протестировать соединение, чтобы исключить эту причину.

### 4. Проверка SSL-сертификата (для LDAPS)
Если вы пытаетесь подключиться по LDAPS (порт 636):
- Убедитесь, что на сервере установлен корректный SSL-сертификат.
- Используйте команду `Get-ChildItem -Path Cert:\LocalMachine\My` для проверки установленных сертификатов.
- Проверьте, что сертификат доверен для вашего клиента и использует правильное имя хоста.

### 5. Использование другого клиентского приложения
Попробуйте использовать другой клиент LDAP, например, `ldapsearch` или `LDP.exe`, чтобы осуществить подключение и посмотреть, будет ли ошибка сохраняться.

### 6. Проверка логов событий
Проверьте журналы событий на сервере в разделе «Журналы Windows» -> «Система» и «Приложение». Ищите ошибки или предупреждения, которые могут дать подсказку о причинах проблемы.

### 7. Проверка настроек аутентификации
Иногда такие ошибки могут вызываться несовпадением настроек аутентификации:
- Убедитесь, что ваш сервер настроен на разрешение использования аутентификации Negotiate и Basic. 

### 8. Убедитесь, что у вас есть доступ из Powershell
В некоторых случаях использование PowerShell требует дополнительных прав. Попробуйте запустить PowerShell от администратора и повторите подключение.

### Пример кода для подключения
Убедитесь, что вы используете правильный формат при создании `LdapConnection`. Попробуйте следующий пример:

```powershell
$ldapServer = "localhost"
$port = 389  # Или 636 для LDAPS

$ldapConnection = New-Object DirectoryServices.Protocols.LdapConnection($ldapServer, $port)
$ldapConnection.AuthType = [System.DirectoryServices.Protocols.AuthType]::Negotiate
$credential = New-Object System.Net.NetworkCredential("Administrator", "Password", "domain.local")

try {
    $ldapConnection.Bind($credential)
    Write-Host "Успешно подключено к LDAP."
} catch {
    Write-Host "Ошибка при подключении: $_"
}
```

### Заключение
Если все вышеперечисленные шаги не помогли, возможно, стоит проверить аппаратные и программные компоненты сервера на наличие неисправностей. Надеюсь, что один из этих методов поможет вам решить проблему. Если же нет, предоставьте, пожалуйста, дополнительные сведения о конфигурации и любых сообщениях об ошибках, чтобы можно было глубже проанализировать ситуацию.
Конечная цель упражнения какая? Если для поиска объектов в AD/ADLDS, то обычно для этого берут System.DirectoryServices.DirectorySearcher и/или System.DirectoryServices.DirectoryEntry либо командлеты PS-модуля ActiveDirectory (почему их не используете?). 
Вот нашел в своих старых записях:
$ldapIdentifier = New-Object -TypeName System.DirectoryServices.Protocols.LdapDirectoryIdentifier(ServerFQDN,Port)
$ldapConnection = New-Object System.DirectoryServices.Protocols.LdapConnection($ldapIdentifier)
$ldapConnection.AuthType = [System.DirectoryServices.Protocols.AuthType]::Negotiate  <<< тут можно поиграться с типами (Basic, Anonymous и т.д.)
$credential = New-Object System.Net.NetworkCredential("Admin Distinguished Name","Password")
$ldapConnection.Bind($credential)
Похожие вопросы