Хобрук: Ваш путь к мастерству в программировании

Ошибка при смене пароля пользователя Active Directory

Привет, я пытаюсь сбросить пароль пользователя Active Directory, но получаю сообщение об ошибке. Ниже приведен мой код:

    public string ChangePassword(string Identity,string OldPassword, string Password)
 {
      string success = "Success";
      try
      {


          DirectoryEntry UserEntry = null;
          DirectoryEntry entry = new DirectoryEntry("LDAP://.../DC=Domain,DC=COM", Identity, OldPassword);

          DirectorySearcher search = new DirectorySearcher(entry);
          SearchResult resultsearch = search.FindOne();
          if (resultsearch == null)
          {
              success = "User Not Found In This Domain";
          }
          else
          {

              success = "find";
              UserEntry = resultsearch.GetDirectoryEntry();
              UserEntry.Username = @"Domain\Administrator";
              UserEntry.Password = "password";
              UserEntry.AuthenticationType = AuthenticationTypes.None;

              if (UserEntry == null)
                  success = "User Not Found In This Domain";
              else
              {
                  try
                  {
                      success = UserEntry.Username.ToString();


    UserEntry.Invoke("ChangePassword", new object[] { OldPassword, Password });
                      UserEntry.CommitChanges();

                  }
                  catch (Exception ex)
                  {
                      success = ex.ToString();
                  }
              }
          }
      }
      catch (Exception ex)
      {
          success = ex.ToString();
      }

Итак, я получаю сообщение об ошибке UserEntry.Invoke("ChangePassword", new object[] { OldPassword, Password }); UserEntry.CommitChanges();

Ошибка:

        System.Runtime.InteropServices.COMException (0x80020006): Unknown name.           (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))
        at System.DirectoryServices.DirectoryEntry.Invoke(String methodName, Object[] args)
        at WebService.ChangePassword(String Identity, String OldPassword, String Password) in c:\inetpub\wwwroot\WebSite1\App_Code\WebService.cs:line 370
17.04.2012

  • @Michael Todd Да, я просто меняю имя, но это правильный DOmain, и у меня есть права администратора. 18.04.2012
  • Есть ли причина, по которой вы не используете более новые API System.DirectoryServices.AccountManagement? Это UserPrincipal класс имеет ChangePassword метод, который работает очень хорошо. 18.04.2012
  • Да, я понимаю, что похоже, что API не включает метод смены пароля, @M.Babcock-я использую system.DirectoryServices.dll, должен ли я использовать любой другой файл dll? 18.04.2012
  • System.DirectoryServices.AccountManagement.dll 18.04.2012
  • @ M.Babcock M.Babcock, Мое приложение работает на версии 2.0, поэтому я думаю, что не могу использовать DirectoryServices.AccountManagement.Есть другие предложения? 18.04.2012

Ответы:


1

Если вы используете .NET Framework 3.5 или более позднюю версию, приведенный ниже код решит проблему. Определение класса опущено.

using System.DirectoryServices.AccountManagement;

public static string ChangePassword(string adminUser, string adminPassword,
    string domain, string container, string userName, string newPassword)
{
    try
    {
        PrincipalContext principalContext = 
            new PrincipalContext(ContextType.Domain, domain, container, 
                adminUser, adminPassword);
        UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, userName);
        if (user == null) return "User Not Found In This Domain";

        user.SetPassword(newPassword);
        return user.Name;
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

Использование:

ChangePassword(@"DOMAIN\Administrator", "password", "DOMAIN",
  "DC=Domain,DC=COM", userName, newPassword);

РЕДАКТИРОВАТЬ: добавлена ​​версия для платформы .NET 2.0.

Метод смены пароля для .NET 2.0:

public static string ChangePassword20(string adminUser, string adminPassword,
    string container, string domainController, string userName, string newPassword)
{
    const AuthenticationTypes authenticationTypes = AuthenticationTypes.Secure |
        AuthenticationTypes.Sealing | AuthenticationTypes.ServerBind;

    DirectoryEntry searchRoot = null;
    DirectorySearcher searcher = null;
    DirectoryEntry userEntry = null;

    try
    {
        searchRoot = new DirectoryEntry(String.Format("LDAP://{0}/{1}", 
            domainController, container), 
            adminUser, adminPassword, authenticationTypes);

        searcher = new DirectorySearcher(searchRoot);
        searcher.Filter = String.Format("sAMAccountName={0}", userName);
        searcher.SearchScope = SearchScope.Subtree;
        searcher.CacheResults = false;

        SearchResult searchResult = searcher.FindOne(); ;
        if (searchResult == null) return "User Not Found In This Domain";

        userEntry = searchResult.GetDirectoryEntry();

        userEntry.Invoke("SetPassword", new object[] { newPassword });
        userEntry.CommitChanges();

        return "New password set";
    }
    catch (Exception ex)
    {
        return ex.ToString();
    }
    finally
    {
        if (userEntry != null) userEntry.Dispose();
        if (searcher != null) searcher.Dispose();
        if (searchRoot != null) searchRoot.Dispose();
    }
}

Использование:

ChangePassword20(@"DOMAIN\Administrator", "password", "DC=Domain,DC=COM",
    "domainControllerName", "userName", "newPassword");
17.04.2012
  • Спасибо, Эспен, теперь я могу сбросить свой пароль, но мне нужно запустить приложение в .net 4.0, я хочу запустить его в среде 2.0 из-за требований, можете ли вы сказать мне, почему я не могу использовать directotyentry.invoke() ?? 18.04.2012
  • Если у вас есть права администратора, правильный способ установить пароль — использовать Invoke(SetPassword). Метод смены пароля требует, чтобы старый пароль был известен. Хитрость заключается в том, чтобы инициализировать запись каталога searchRoot с правильными учетными данными и AuthenticationTypes. 19.04.2012

  • 2

    Несколько вещей:

    • Вы не должны устанавливать имя пользователя, пароль или тип AuthN для UserEntry.
    • ваш успех = UserEntry.Username... должен быть obj foo = UserEntry.NativeObject;. Если это пройдет, у вас есть действительный DE.
    • Вам не нужно звонить CommitChanges() здесь.
    • Вы должны вызывать ChangePassword в контексте пользователя, а не администратора. Это пройдет через вызов GetDirectoryEntry() правильно.
    17.04.2012
  • Я пробую все вышеперечисленное до сих пор не понимаю. 18.04.2012
  • Новые материалы

    Неделя 1 — Кентерберийские рельсы.
    Неделя 1 — Кентерберийские рельсы. So. Мы все еще живы, все еще усердно работаем и еще не пассивно-агрессивно рассылаем друг другу сообщения «за мое последнее сообщение в Slack…», поэтому, на..

    Цена завтрашнего дня  — Джефф Бут
    Технологический прогресс в наши дни происходит с молниеносной скоростью, и мы не в состоянии это понять. Джефф в основном говорит о влиянии технологий на экономику по всему миру. Он твердо верит..

    Данные: суперсила современного бизнеса
    В цифровой среде данные превратились из простого побочного продукта бизнес-операций в центральный актив, стимулирующий рост и инновации. Крейг Манди, бывший главный директор по стратегии..

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..