DirectoryEntry не может изменить пароль из-за контроллера домена.Помогите? - PullRequest
0 голосов
/ 27 октября 2011

Предполагается, что это основной метод смены пароля с использованием DirectoryServices в ASP.NET.

код:

String path = ConfigurationManager.AppSettings["LDAPServer"] + myDN;
DirectoryEntry de = new DirectoryEntry(path, @"Domain A\" + myUserId, myPassword, AuthenticationTypes.Secure);
de.Invoke("ChangePassword", new object[] { myPassword, myNewPassword});

Это нормально работает, если я работаю локально через виртуальный IIS (с использованием Visual Studio). Однако, если я опубликую это в производстве, я получу:

Информация о конфигурации не может быть прочитана с контроллера домена, так как машина недоступна или доступ запрещен. (Исключение из HRESULT: 0x80070547)

Единственная разница между ними может заключаться в том, что мой компьютер находится в Домене A, но опубликованный сервер находится в Домене B. Домен A и домен B являются доверенными, а домен A является родительским для домена B.

Кто-нибудь знает, где и как возникает ошибка?

РЕДАКТИРОВАТЬ: Возможно, я должен добавить, что это веб-сервис. Другое приложение выдаст необходимую информацию для проверки, а веб-служба изменит пароль.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

Извините, что отметил ваш ответ и забрал его.Я на самом деле получал еще одну ошибку из-за идентичности, и я думал, что эта проблема была решена и перешел к следующей проблеме.

В любом случае, я решил ее, изменив ПУТЬ из DirectoryEntry.До этого было:

LDAP: //server.domain/DistinguishedName

но я изменил его на

LDAP: // DistinguishedName

тогда все работало нормально.

0 голосов
/ 27 октября 2011

Хорошо, что я сделал, чтобы обойти проблемы, подобные описанным выше, было следующее:

  1. Настройка учетной записи службы, которая может запрашивать обе AD

Первый метод

private bool ResetDomainAccountPassword(string loginName, string oldPassword, string newPassword)
{
  DirectoryEntry e2 = new DirectoryEntry();

  try
  {
    // ----- Get the credentials for the active directory service account.
    string userName = ServiceUser();
    string password = ServicePassword();

    using (DirectoryEntry e = new DirectoryEntry(Path(), userName, password, AuthenticationTypes.Secure))
    {
      string search = string.Format("(sAMAccountName={0})", loginName);

      DirectorySearcher s = new DirectorySearcher(e, search);

      SearchResult sr = s.FindOne();
      if (sr != null)
      {
        e2 = sr.GetDirectoryEntry();
        e2.Username = userName;
        e2.Password = password;
      }

      if (e2.NativeGuid != null)
      {
        return ResetPassword(e2, oldPassword, newPassword);
      }
      else
        return false;
    }
  }
  catch (Exception ex)
  {
    Exception inner = ex.InnerException;

    // ----- Handle exception here.

    return false;
  }
  finally
  {
    e2.Dispose();
  }
}

Метод сброса пароля

private bool ResetPassword(DirectoryEntry e, string oldPassword, string newPassword)
{
  try
  {
    ActiveDs.IADsUser u = e.NativeObject as ActiveDs.IADsUser;
    Type t = e.NativeObject.GetType();
    if (u.IsAccountLocked)
    {
      u.IsAccountLocked = false;
      u.SetInfo();
    }

    u.SetPassword(newPassword);
    u.SetInfo();

    e.CommitChanges();


    return true;
  }
  catch (Exception ex)
  {
    Exception inner = ex.InnerException;

    // ----- Handle exception here.

    return false;
  }
}

Одна вещь, которую я забыл: вам нужно добавить ссылку на «Active DS Type Library» (COM).

...