0

我试图使用以下代码来设置 Active Directory 的用户密码:

using (var context = new PrincipalContext( ContextType.Domain ))
{
  using (var user = UserPrincipal.FindByIdentity( context, IdentityType.SamAccountName, userName ))
  {
      user.SetPassword( "newpassword" );
      user.ExpirePasswordNow();
  }
}

该代码毫无问题地提取了用户信息,但是在尝试重置密码时我得到了拒绝访问。然后我意识到上面的代码没有提供在其中进行操作的安全上下文。怎么放进去?MSDN 给出了 PrincipalContext 的完整构造函数:

public PrincipalContext(
   ContextType contextType,
   string name,
   string container,
   string userName,
   string password
)

我能找到的所有示例都清楚地表明,第一个字符串是服务器名称,用户名和密码也很清楚,但“容器”是什么。MSDN中的描述一清二楚:

“存储上的容器用作上下文的根。所有查询都在这个根下执行,所有插入都在这个容器中执行。”

我尝试使用像“ABCD”这样的任意字符串,但这并不好。我尝试了很多东西都没有好的结果。

如何解决这个问题?

4

1 回答 1

3

最后在这个 StackOverflow 问题中找到了答案:

Active Directory 服务:PrincipalContext——“容器”对象的 DN 是什么?

把东西留在null。哇,什么概念。我试过了,令我惊讶的是它确实有效。这是我的最终工作代码:

using (var context = new PrincipalContext(ContextType.Domain, "xxxdcoly302.xxx.xx.lcl", null, @"XXX\admin-acct", "Beautifu!"))
{
    using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userAccountID))
    {
        user.SetPassword("Pa$$word1");
        user.ExpirePasswordNow();
    }
}

请注意,我首先尝试将“LDAP://”作为上述服务器名称的一部分(“xxxdcoly302.xxx.xx.lcl”)。这没有用!它告诉我“无法联系服务器”。我找到了另一个 StackOverflow 答案,说不要使用 LDAP 前缀。所以我做到了,它奏效了。

于 2012-12-21T20:26:20.790 回答