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

Я пытаюсь создать нового пользователя в AD. Я использую следующий код:

        using (var context = new PrincipalContext(ContextType.Domain, this.DomainName, userWithWMIAccessRights, userWithWMIAccessrightsPassword))
        {
            UserPrincipal user = new UserPrincipal(context);
            user.DisplayName = Newusername;
            user.Name = Newusername;
            user.Enabled = true;
            user.SetPassword(passwordOfThenewUser);
            user.Save(); //<-- throws exception InnerException = {"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"}
            return user;
        }

Я установил userWithWMIAccessrightsPassword следующим образом:

  • userWithWMIAccessrightsPassword является членом группы администраторов Enterpirse, администраторов домена и пользователей домена.
  • Запустил dcomcnfg из командной строки.
  • Выбранный инструментарий управления Windows из списка служб.
  • Обновил пользовательские разрешения, добавив учетную запись userWithWMIAccessrightsPassword с вкладки «Безопасность» и предоставив ему полные права.

Веб-приложение размещается на том же компьютере, что и AD. Когда я отлаживаю веб-приложение с помощью Visual Studio, пользователь и пароль устанавливаются без проблем.

Когда веб-приложение развернуто на машине AD, функция, которая создает пользователя, выдает {"Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))"} в строке кода, которая устанавливает пароль. Пользователь создан и не включен и без пароля.

Почему мне отказывают в доступе, когда PrincipalContext использует пользователя AD с полными правами?


person Briefkasten    schedule 22.07.2014    source источник


Ответы (1)


Хорошо, кажется, что PrincipalContext != имперсонирует.

Я мог бы решить проблему с помощью:

1.) установите контейнер PrincipalContext и вызовите ValidateCredentials(this.UserName, this.Password,ContextOptions.Negotiate).

2.)

using (new Impersonator(this.UserName, this.DomainName, this.Password, LogonType.LOGON32_LOGON_SERVICE, LogonProvider.LOGON32_PROVIDER_WINNT40))
        {
            using (var context = CreatePrincipalContext())
            {
                UserPrincipal user = new UserPrincipal(context);
                user.DisplayName = username;
                user.Name = username;
                user.Enabled = true;
                user.SetPassword(password);
                user.Save();
                return user;
            }
        }

Но я все еще смущен необходимостью класса подражателя с Principalcontext. Я думал, что PrincipalContext заменяет имперсионный класс.

person Briefkasten    schedule 23.07.2014