Метод userprincipal.Разрешения FindByIdentity

Я пытаюсь использовать .NET System.DirectoryServices.AccountManagement библиотека для получения UserPrincipal для конкретного пользователя Active Directory.

у меня есть следующий код:

PrincipalContext context = new PrincipalContext(ContextType.Domain, "DomainName");
userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);

этот код работает как действительный пользователь домена, но когда я его выполняю, я получаю следующее исключение:

система.DirectoryServices.DirectoryServicesCOMException (0x8007052E): ошибка входа в систему: неизвестное имя пользователя или неверный пароль.

что интересно что я могу сделать следующий вызов, используя тот же контекст, без проблем:

context.ValidateCredentials(username, password, ContextOptions.Negotiate)

идеи?

2 ответов


вам нужно использовать PrincipalContext конструктор, который принимает имя пользователя и пароль.

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


похоже, у вас есть сохраненные сетевые учетные данные. В Windows можно указать использование других сетевых учетных данных при попытке доступа к сетевым ресурсам. Я могу воспроизвести точно такую же проблему, как вы видите, настроив неправильные сетевые учетные данные.

предполагая, что ваш домен называется yourdomain.com, вы можете сказать Windows всегда использовать определенное имя пользователя и пароль, когда он разговаривает с любыми компьютерами с достаточным yourdomain.com.

== = Windows 7/2008 ===

  1. запустите "Crendentail Manager".
  2. в разделе Учетные данные Windows нажмите Add a Windows credentials
  3. в сети-адрес, поместить в *.yourdomain.com
  4. в имени пользователя и пароле введите неправильное имя пользователя или неправильный пароль

=== Windows XP / 2000 / 2003 ===

  1. Нажмите кнопку Пуск и выполните команду
  2. тип control keymgr.dll
  3. Нажмите кнопку " Добавить "на" сохраненные имена пользователей и пароли" диалоговое окно
  4. в текстовом поле сервера введите *.yourdomain.com
  5. в имени пользователя и пароле введите неправильное имя пользователя или неправильный пароль

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

почему контекст.ValidateCredentials(имя пользователя, пароль, ContextOptions.Переговоры) работа? Это просто потому, что вы инициализируете другую аутентификацию Kerberos/NTLM, так как вы предоставляете uername и password снова. Под капотом, если выбран Kerberos, он отправит контроллеру домена предоставленные имя пользователя и пароль и обмен на билет Kerberos TGT. Затем ваш компьютер получает сервисный билет на сервере LDAP, используя этот билет TGT. Затем ваш компьютер отправит этот сервисный билет на сервер LDAP. Обратите внимание, что этот билет не сохраняется в текущем сеансе входа в систему.

почему UserPrincipal.FindByIdentity не работает? Если у вас нет сохраненного пароля, обычно он должен работать поскольку Windows будет просто использовать текущий билет TGT пользователя входа в систему для обмена на билет службы сервера LDAP. Нет никакого процесса проверки имени пользователя/пароля. Однако, если у вас есть плохой пароль пользователя, Windows подумает, что он не должен использовать текущий билет пользователя TGT. Вместо этого он должен получить новый билет TGT, используя сохраненный сетевой пароль. Вот почему вы видите System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Logon failure: unknown user name or bad password.