需要在PrincipalContext中的Active Directory中重置和过期密码

时间:2012-12-21 20:26:21

标签: c# active-directory passwords

我尝试使用以下代码设置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”这样的任意字符串,但这并不好。我尝试了很多事情,没有取得好成绩。

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

最后在StackOverflow问题中挖出了一个答案:

Active Directory Services: PrincipalContext -- What is the DN of a "container" object?

将事物留在 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前缀保留为关闭状态。所以我做了,它有效。