1

问题:我们已经将 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

4

1 回答 1

3

通常这很容易,您需要做的就是更新活动目录中的所有用户并将值设置为 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。如果这搞砸了你的广告,我对此不承担任何责任!

于 2013-11-12T17:47:01.827 回答