Active Directory属性“badPwdCount”

时间:2013-11-12 16:54:18

标签: c# .net windows active-directory

问题: 我们已经将AD服务器从2003升级到2008,并且由于一些“坏代码”,开发人员以这样的方式编码,他直接将“badPwdCount”属性值转换为INT,并且由于NULL值转换而爆炸 - NULL引用异常 - NULL无法转换为INT。

更大的问题: 我们目前无法进行部署,因为有超过100个个人应用程序依赖于此更改,我们正在寻找目前处理最少的应用程序。

背景: 现在这个“badPwdCount”属性的工作方式是,当用户登录到域时,它将被设置为零,否则它将为NULL。问题是这些用户都不会以交互方式登录,因为它们是外部的,我们通过API对它们进行身份验证,并且无法使用API​​登录。

问题: 有谁知道这个值是在注册表中还是在某个地方,我可以在哪里找到它并将其设置为零?还考虑通过脚本启动每个用户的登录,但也希望收集其他想法......

badPwdCount的MSDN页面: http://msdn.microsoft.com/en-us/library/windows/desktop/ms675244(v=vs.85).aspx

1 个答案:

答案 0 :(得分:3)

通常这很容易,您需要做的就是更新活动目录中的所有用户,如果为null,则将值设置为0。您可以通过多种方式执行此操作,例如脚本或代码或批量更新工具。

在这种情况下,badPwdCount是一个不复制的特殊属性(即每个域控制器都不同),据我所知,没有办法手动或通过脚本更新它,但是,我认为我有一个解决方案。

您应该能够轻松地针对每个域控制器触发活动目录中每个用户的单个失败登录,从而导致该值递增。

由于您使用C#标记了帖子,因此这里有一些C#代码可以帮到您:

using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.ActiveDirectory;

...

using (Domain domain = Domain.GetComputerDomain())
{
    foreach (DomainController domainController in domain.DomainControllers)
    {
        using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domainController.Name))
        using (UserPrincipal userPrincipal = new UserPrincipal(context))
        using (PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal))
        using (PrincipalSearchResult<Principal> results = searcher.FindAll())
        {
            foreach (UserPrincipal user in results.OfType<UserPrincipal>())
            {
                context.ValidateCredentials(user.SamAccountName, "THEREISNOWAYTHISISTHECORRECTPASSWORD");
            }
        }
    }
}

PS。如果这搞砸了你的AD,我不负任何责任!