2012-12-21 16 views
0

我尝试使用下面的代码来设置Active Directory中的用户密码内到期Active Directory中的密码:需要重置和PrincipalContext

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”这样的任意字符串,但这并不好。我尝试了许多事情,结果不好。

如何解决这个问题?

回答

3

终于挖出了这个StackOverflow的问题的答案:

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

离开件事。哇,什么概念。我尝试了它,并感到非常惊讶,它确实有效。这是我最后的工作代码:

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前缀关闭。所以我做了,它的工作。