Активный каталог - исключение было выдано целью вызова - PullRequest
3 голосов
/ 26 октября 2011

У меня есть веб-приложение на отдельном сервере, отличном от Active Directory, и я хочу изменить пароль пользователя. Код следующий:

string newPassword = Membership.GeneratePassword(int.Parse(WebConfigurationManager.AppSettings["passLenght"]),
                                int.Parse(WebConfigurationManager.AppSettings["passNonAlpha"]));

DirectoryEntry de = new DirectoryEntry(WebConfigurationManager.ConnectionStrings["ADConnString"].ConnectionString,
WebConfigurationManager.AppSettings["ADAdmin"], WebConfigurationManager.AppSettings["ADAdminPass"]);

DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(objectClass=user) (userPrincipalName=" + name + "))";

SearchResultCollection results = deSearch.FindAll();

if (results.Count == 1)
{
   foreach (SearchResult OneSearchResult in results)
   {
      DirectoryEntry AlterUser = OneSearchResult.GetDirectoryEntry();
      AlterUser.AuthenticationType = AuthenticationTypes.Secure;
      AlterUser.Invoke("SetPassword", newPassword);
      AlterUser.CommitChanges();
      AlterUser.Close();
   }
}

Когда я запускаю это в своей среде разработки (где Active Directory и веб-приложение находятся на одном сервере), это работает. Но когда я пытаюсь запустить его в производственной среде, у меня появляется следующая ошибка:

Исключение было сгенерировано целью вызова

Чего мне не хватает?

Спасибо.

EDIT:

Я мог бы углубиться в ошибку исключения, и я получил это:

Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

Ответы [ 3 ]

8 голосов
/ 31 октября 2011

Разрешения являются проблемой.Учетная запись, под которой работает ваш код ASP.NET, не имеет разрешения для установки пароля учетной записи.

Либо:

  • Запустите AppPool под пользователем с необходимыми разрешениями, либо
  • Используйте олицетворение для повышения разрешений дляSetPassword call

Причина, по которой он работает в вашей среде разработки / сбои в работе, вероятно, вызвана комбинацией:

  • Вы запускаете приложение подВеб-сервер разработки Visual Studio, работающий под вашей учетной записью, имеющий необходимые разрешения.Запуск его под «реальным» IIS запускает его под менее привилегированной учетной записью.
  • В реальной среде есть еще один переход компьютера с веб-сервера на сервер AD, и учетные данные не передаются.Веб-сервер должен иметь сетевые учетные данные (либо как часть идентификатора AppPool, либо как вызов LogonUser) для аутентификации в AD.
1 голос
/ 09 мая 2012

Код выглядит правильно. Это может произойти из-за того, что пароль, который вы отправляете через Active Directory, не соответствует минимальным требованиям. Попытка использовать более сложный пароль, такой как «M2k3ThisWork!»

0 голосов
/ 04 октября 2016

Если вы хотите изменить пароль AD, вы используете это

AlterUser.Invoke("ChangePassword", OldPassword, newPassword);
...