На самом деле я отлаживаю приложение C#, но поскольку та же команда возможна в PowerShell, я пробую выполнить ее там.
Я пытаюсь проверить учетные записи пользователей, используя следующее в PowerShell:
> Add-Type -AssemblyName System.DirectoryServices.AccountManagement
> $ds = New-Object System.DirectoryServices.AccountManagement.PrincipalContext("domain", "<domain>", "<OuDN>", "negotiate", "<username>", "<password>")
> $ds.ValidateCredentials("<username>", "<password>", "negotiate")
Последняя команда всегда возвращает false, я проверил учетные данные, войдя с ними в систему. Мы отключили аутентификацию NTLM в среде, и я вижу, что каждый раз, когда я выполняю ValidateCredentials()
соединение NTLM с помощью lsass.exe, оно блокируется (идентификатор события 4002 в средстве просмотра событий). Я включил ведение журнала Kerberos, но при попытке проверки в средстве просмотра событий не генерируются никакие события. Это заставляет меня думать, что он даже не пытается выполнить аутентификацию Kerberos, но я могу ошибаться.
Я проверил, что SPN для компьютера существуют setspn -L
, и поскольку аутентификация Kerb работает везде в системе, я не уверен, что это неправильная конфигурация.
Обновлять:
Я нашел решение, но пока не публикую его как ответ, так как у меня все еще есть странное поведение. Я добавил @<domain>
к имени пользователя, и это работает в приложении C#, которое я отлаживаю, но запуск той же самой команды в PowerShell по-прежнему возвращает false, хотя теперь я получаю KDC_ERR_PREAUTH_FAILED
в средстве просмотра событий.