0

假设这是在 ASP.NET 中使用 DirectoryServices 的基本密码更改方法。

编码:

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 的父级。

任何人都知道错误是在哪里以及如何产生的?

编辑:也许我应该补充一点,这是一个 Web 服务。另一个应用程序将抛出必要的信息进行验证,Web 服务将更改密码。

4

2 回答 2

0

好吧,我为解决上述问题所做的工作如下:

  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 类型库”(COM)的引用。

于 2011-10-27T08:51:32.667 回答
0

很抱歉将您的标记为答案并将其带走。由于身份问题,我实际上遇到了另一个错误,我认为这个问题已经解决并转移到下一个问题。

无论如何,我已经通过更改 DirectoryEntry 的 PATH 来解决它。之前是:

LDAP://server.domain/DistinguishedName

但我把它改成了

LDAP://DistinguishedName

然后一切正常。

于 2011-11-01T03:42:23.090 回答