IBCOURSES / СПРАВОЧНИК ИБ

LDAP 49 / invalidCredentials: отказ Bind и диагностические данные AD

К ответу ↓

LDAP resultCode 49 означает invalidCredentials — отказ проверки учётных данных. В AD дополнительный диагностический текст может направить проверку; data — необязательная отладочная часть, а не универсальная схема или доказательство правильного имени.

Например
Материалов с пояснениями: 94 · Записей реестров: 11 678

Уточнить поиск

Коды и ошибки

Найдено: 195
Инструкция по проверке

LDAP 49 / invalidCredentials: отказ Bind и диагностические данные AD

LDAP resultCode 49 означает invalidCredentials — отказ проверки учётных данных. В AD дополнительный диагностический текст может направить проверку; data — необязательная отладочная часть, а не универсальная схема или доказательство правильного имени.

1. Установите операцию, источник и учётную запись Bind

Сначала сохраните полный исходный ответ и клиентский журнал за узкий UTC-интервал. Зафиксируйте сервер/DC, домен, версию библиотеки, адрес подключения и тот же идентификатор соединения. Выясните, отказал служебный Bind приложения или вход конечного пользователя: это могут быть разные учётные записи и этапы. LDAP BindResponse и Windows Security 4625 имеют собственные схемы. Номер 49 относится к LDAP, а не к порту, событию или HTTP. Сохраняйте код и исходное сообщение: перевод или сокращение строки может скрыть важные детали.

2. Отделите 49 от расширенной ошибки и debug-хвоста

RFC 4511 называет 49 invalidCredentials; диагноз по одной цифре шире, чем «пользователь существует, неверен пароль». Сервер может заменить код, чтобы не раскрывать сведения, а diagnosticMessage вообще оставить пустым. MS-ADTS отдельно описывает восемь начальных hex-знаков errorMessage. Всё после них служит отладке и может отсутствовать. Поэтому data 52e, DSID и суффикс версии сохраняют как исходный текст конкретного источника. Парсер не должен требовать этих токенов, переносить их на OpenLDAP или выводить первопричину без дополнительных свидетельств.

3. Прочитайте примеры и локальную выборку

В первом учебном объекте resultCode равен 49, а строка содержит отдельные префикс 80090308 и debug data 52e. Это авторская проекция декодированного сообщения для объяснения, а не стандартный JSON каталога. Сохраните два объекта как отдельные строки ldap-bind-demo.jsonl; перед собственным экспортом согласуйте его ключи со схемой клиента. Код читает только этот файл, отбирает BindResponse 49 и печатает найденные части. Второй объект тоже проходит отбор, но выдаёт null для обеих диагностических частей. Null не превращается в успешный вход или «неверный пароль».

4. Условно сопоставьте hex со словарём Win32

Если происхождение конкретного диагностического data подтверждено как Win32, переводите его с основанием 16: 52e даёт 1326, а 775 — 1909. Таблица ниже — официальный словарь WinError.h, а не нормативная схема поля data и не обещание возврата всех кодов конкретным DC. Она задаёт направление ручной проверки. Не превращайте 52e в утверждение о правильном имени: ERROR_LOGON_FAILURE охватывает имя или пароль. Не переносите эти значения в NTSTATUS Status/SubStatus 4625; совпадение слов не делает пространства кодов одинаковыми.

Hex Win32 Десятичный Имя Значение для проверки
0x525 1317 ERROR_NO_SUCH_USER Указанная учётная запись не существует.
0x52e 1326 ERROR_LOGON_FAILURE Неверное имя пользователя или пароль; не доказательство существующего имени.
0x530 1328 ERROR_INVALID_LOGON_HOURS Вход ограничен по времени.
0x531 1329 ERROR_INVALID_WORKSTATION Вход на данный компьютер не разрешён.
0x532 1330 ERROR_PASSWORD_EXPIRED Истёк срок действия пароля.
0x533 1331 ERROR_ACCOUNT_DISABLED Учётная запись отключена.
0x701 1793 ERROR_ACCOUNT_EXPIRED Истёк срок действия учётной записи.
0x773 1907 ERROR_PASSWORD_MUST_CHANGE Перед входом требуется изменить пароль.
0x775 1909 ERROR_ACCOUNT_LOCKED_OUT Учётная запись заблокирована.

5. Проверьте имя, состояние и фактический механизм

Попросите владельца каталога сверить объект и форму имени на момент попытки, назначение учётной записи Bind, применимую политику и состояние учётной записи. MS-ADTS различает разрешение DN/UPN и других форм; для отсутствующего или неоднозначного сопоставления допускает invalidCredentials/ERROR_INVALID_PARAMETER. Не ставьте знак равенства между формами имени для AD DS и AD LDS. Simple и SASL также различаются: GSSAPI использует Kerberos, а GSS-SPNEGO может применять Kerberos или NTLM. Один LDAP 49 не доказывает наличие отдельной ошибки Kerberos 4771.

6. Проверьте цепочку до очередной попытки

Не проверяйте гипотезу серией новых bind: повторения могут участвовать в действующем пороге блокировки, в том числе когда старые сведения использует служба. Сначала найдите источник повторений, временное окно и существующие подтверждения состояния. При data 775, если его интерпретация подтверждена, запросите 4740 и историю той же учётной записи. Сопоставляйте сервер, область/SID при доступности, время и реальный механизм; один messageID глобальной связью не является. Разблокировка, сброс пароля и изменение политики — отдельные административные действия, эта инструкция их не выполняет.

7. Разделите TLS, аутентификацию и доступ к данным

Сохраните фактический защитный режим и сообщения TLS/клиентской библиотеки. Ошибка до получения LDAP BindResponse не становится LDAP 49 по догадке. Simple bind требует защиты TLS; не отключайте проверку сертификата, signing или channel binding ради проверки учётных данных. Наличие TCP 636 само по себе не доказывает успешную проверку TLS. Успешный Bind не гарантирует полномочия на дальнейший Search; 49 и insufficientAccessRights 50 нельзя подменять друг другом. Следующим свидетельством будет результат нужной операции приложения в согласованной сессии.

8. Если диагностических данных или события нет

Разделите отсутствие BindResponse, обрезанный клиентский текст, пустой diagnosticMessage и отсутствие записи в доступном журнале. Проверьте исходную копию, ротацию, роль источника и права чтения; не включайте дополнительное журналирование в рамках этого маршрута. Для Microsoft-поля data без подтверждённого контекста запишите «debug-семантика не установлена». Итог должен содержать факт отказа конкретной операции, проверенные гипотезы и недостающие свидетельства. Наличие LDAP 49 не устанавливает злоумышленника, успешность других входов или блокировку всей учётной записи.

Поля и область применения

Исходное полеСмысл и ограничения
messageIDИдентификатор LDAP-сообщения внутри того же соединения; не глобальный requestID.
protocolOp / BindResponseУстановить операцию: ошибка Bind и отказ доступа к объекту в Search — разные этапы.
resultCode49 decimal = invalidCredentials по LDAP; это не Win32 и не NTSTATUS.
matchedDNПоле LDAPResult. Пустое значение не доказывает существование или отсутствие учётной записи Bind.
diagnosticMessageНеобязательная текстовая диагностика; сервер может опустить её или скрыть подробности.
первые 8 hex-знаков AD errorMessageДокументированная часть расширенной ошибки MS-ADTS; сохраняется отдельно от 49.
data <hex>, DSID, v...Информационный debug-хвост конкретной реализации; наличие, положение и семантика не являются общим LDAP-контрактом.
сервер / соединение / UTC / bind roleВнешний контекст приложения, не стандартные поля LDAPResult; нужен для сопоставления без пароля.

Примеры записей

Данные в примерах условные. Состав полей зависит от версии и настроек источника.

Учебная проекция декодированного BindResponse:49 и debug data 52e

Расшифровка бинарной записи. Синтетическая авторская JSON-проекция документированных LDAP-полей, не wire-format ASN.1/BER и не нативный JSON AD/библиотеки. Значения вымышлены; форма debug-хвоста учебная и не обещается на любом DC. Пароля и BindRequest нет.

{
  "messageID": 7,
  "protocolOp": "bindResponse",
  "resultCode": 49,
  "matchedDN": "",
  "diagnosticMessage": "80090308: LdapErr: DSID-00000000, comment: AcceptSecurityContext error, data 52e, v0000"
}

Тот же LDAP 49 без подробной диагностики

Расшифровка бинарной записи. Отрицательный случай для разбора data: пустая диагностическая строка допустима. Нельзя восстанавливать из неё 52e, 775 или конкретную причину. Тоже авторская JSON-проекция, не продуктовый экспорт.

{
  "messageID": 8,
  "protocolOp": "bindResponse",
  "resultCode": 49,
  "matchedDN": "",
  "diagnosticMessage": ""
}

Команды и способы проверки

Укажите свой узел, путь к журналу и временной интервал. Требуемая среда указана рядом с командой.

Python3 / локальный разрешённый учебный JSONL; только чтение, без сети и LDAP bind

python3 - <<'PYCODE'
import json, re
from pathlib import Path
# Учебный JSONL: одна авторская проекция BindResponse на строку.
# Для своего экспорта сначала сопоставьте ключи со схемой источника.
for reference_line in Path('ldap-bind-demo.jsonl').read_text(encoding='utf-8').splitlines():
    if not reference_line.strip():
        continue
    reference_row = json.loads(reference_line)
    if reference_row.get('protocolOp') != 'bindResponse' or reference_row.get('resultCode') != 49:
        continue
    reference_message = reference_row.get('diagnosticMessage', '')
    reference_prefix = re.match(r'^([0-9A-Fa-f]{8})(?=:|\s|$)', reference_message)
    reference_data = re.search(r'\bdata\s+([0-9A-Fa-f]+)\b', reference_message, re.IGNORECASE)
    print(json.dumps({
        'messageID': reference_row.get('messageID'),
        'resultCode': reference_row['resultCode'],
        'extended_prefix_hex': reference_prefix.group(1) if reference_prefix else None,
        'debug_data_hex': reference_data.group(1) if reference_data else None,
        'debug_data_decimal': int(reference_data.group(1), 16) if reference_data else None,
        'diagnosticMessage': reference_message
    }, ensure_ascii=False))
PYCODE

Первоисточники

49 не устанавливает единственную причину. Нельзя считать data 52e доказательством существующего пользователя, переносить debug-формат на любую реализацию или подменять им Status/SubStatus 4625.

Связанные материалы

Как пользоваться техническим справочником

Найдите порт, код ошибки, событие или источник журнала. Уточните протокол и систему, затем сверяйте значение, поля, примеры и первоисточники. Назначение порта не определяет фактическую службу, а одна запись не доказывает инцидент.

Материалы по разделам

События и журналы

Два ответа рядом

Сравнение источников

Сравнение показывает различия. События и поля разных систем не считаются эквивалентными.

Выберите службу

В списке — службы, доступные с текущими условиями. Число рядом — количество записей портов, а не программ на вашем узле.

Как искать в справочнике

Введите число, код, фрагмент сообщения или вопрос. Известный идентификатор поможет найти карточку; это не анализ самого инцидента.

  1. Введите номер, код, имя или фрагмент записи. Для портов можно использовать список: 80, 443, 8000–8010.
  2. Уточните поиск фильтрами. Все условия действуют одновременно. Числа в списках показывают, сколько материалов останется при выборе варианта.
  3. Службу выбирайте из каталога: поиск внутри списка помогает найти название, а кнопка «Выбрать» применяет его.
  4. Убирайте отдельные условия кнопкой × рядом с фильтром. «Сбросить фильтры» сохраняет текст поиска и текущий раздел.
  5. В карточке сверьте источник, версию и условия регистрации, затем откройте поля, примеры и первоисточник.

/ — перейти к поиску. Прямые ссылки открывают выбранную карточку в этом же справочнике.

Назначения портов и коды приведены по официальным реестрам. Версии, условия регистрации и ссылки на документацию указаны в карточках.

Избранное и недавние материалы хранятся в этом браузере. Запрос и фильтры сохраняются при возврате к выдаче и обновлении вкладки. Поиск работает локально.

Что есть в справочнике

От вопроса к свидетельствам: кто вошёл, что запустил, к каким данным обратился, что изменил и где искать следы.

Выберите область, чтобы посмотреть доступные источники и перейти к материалам.

Уточнить или исправить ответ

Скопируйте сообщение и отправьте его на mail@ibcourses.ru.