2016-08-17 104 views
2

我目前正在寻找某种最佳做法,即在用户登录到某个用户时更改用户的活动目录用户密码基于asp.net的Web应用程序和密码已过期,并在登录会话。MS修补程序后在c#/ asp.net中更改Active Directory用户密码KB3167679

我们正在运行的Windows Server 2008 R2,IIS7应用程序了与.NET Framework 3.5的

到目前为止,我用这个:

public int changeUserPassword(String _userID, String _oldPassword, String _newPassword, bool _change) 
{ 
    try 
    { 
     PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, "do.ma.in", "DC=do,DC=ma,DC=in", 
     ContextOptions.SimpleBind, @"domain\admin_account", "admin_pw"); 
     UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, _userID); 

     if (_change) 
     { 
      oUserPrincipal.ChangePassword(_oldPassword, _newPassword); 
     } 
     else 
     { 
      oUserPrincipal.SetPassword(_newPassword); 
     } 
     oUserPrincipal.Save(); 
    } 
    catch (Exception e) 
    { 
     //error handling 
    } 
    return 1; 
} 

此方法处理发起PW变化后用户的情况下,登录,在过期的pw登录(ChangePassword方法)期间更改以及密码重置,其中生成临时密码等(SetPassword方法)。

我们需要ChangePassword方法的原因是有一个关于当前密码的用户确认,所以AD密码历史被应用,因为我们不允许最后的x个密码。 SetPassword只是设置密码,不管它是否在最近的历史记录中。

SetPassword似乎仍然可以正常工作,但自Microsoft修补程序KB3167679以来,更改密码方法似乎不再有效。 KB3167679 该文章特别提到,这只会发生在被锁定或禁用的帐户,但当帐户处于活动状态或处于“密码过期”模式时,它也不再起作用。 异常消息I geet是“一个或多个输入参数无效”。

我以前使用过另一个使用DirectoryEntry的实现,但它有错误,因为它有时可以工作,有时它不会,这很烦人。所以我宁愿不回去。

我们在具有新补丁的实例上观察到这一点,没有它的实例可以正常工作。我还能够在测试服务器上重现该行为,该方法在安装所述修补程序后停止工作。

不幸的是,微软并没有提供这篇文章中的最佳实践,我似乎也无法找到自己的一个。所以问题是如果你对我有一个提示什么是标准的方式去这里。

回答

2

我遇到过类似的问题。尝试将ContextOptions.SimpleBind更改为ContextOptions.Negotiate

+0

非常感谢,这确实有用。到目前为止,我所有的测试都很成功如果它在特定情况下失败,我会报告。 – vm370

相关问题