【问题标题】:Need to reset and expire a password in Active Directory within a PrincipalContext需要在 PrincipalContext 内的 Active Directory 中重置和过期密码
【发布时间】:2012-12-09 10:13:21
【问题描述】:

我尝试使用以下代码设置 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”这样的任意字符串,但这并不好。我尝试了很多东西都没有好的结果。

如何解决这个问题?

【问题讨论】:

    标签: c# active-directory passwords


    【解决方案1】:

    终于在这个 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 前缀。所以我做到了,它奏效了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多