问题:
我们从2003年到2008年升级了AD服务器,由于一些“错误代码”,开发人员以这样的方式编码,他直接将“badpwdcount”属性值强制转换为int,结果由于空值转换而崩溃-空引用异常-空值无法转换为int。
更大的问题:
我们现在无法进行部署,因为有超过100个独立的应用程序依赖于此更改,我们目前正在寻找一种最不复杂的处理方法。
背景:
现在这个“badpwdcount”属性的工作方式是,当用户登录到域时,它将被设置为零,否则为空。问题是,这些用户都不会交互登录,因为他们是外部用户,我们通过api对他们进行身份验证,他们也不能使用api登录。
问题:
有人知道这个值是否在注册表中或其他地方,我可以在哪里找到它并将其设置为零吗?也在考虑通过脚本启动每个用户的登录,但也希望收集其他想法…
badpwdcount的msdn页:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms675244(v=vs.85).aspx
最佳答案
通常这很简单,您只需要更新active directory中的所有用户,如果该值为空,则将其设置为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");
}
}
}
}
如果这把你的广告搞砸了,我不负任何责任!