根据 MSDNUserPrinciple
,和类的查找方法(如 FindByLogonTime 和 FindByBadPasswordAttempt)ComputerPrinciple
使用 UTC 时间来过滤结果。但是,测试表明这些方法似乎将本地时间作为输入,而生成的对象使用 UTC 作为其时间属性,需要转换为本地时间。
以下示例似乎正确列出了自当地时间上午 6 点以来在服务器上登录尝试失败的所有用户:
static void Main()
{
var pc = new PrincipalContext(ContextType.Domain, dcServer);
PrincipalSearchResult<UserPrincipal> uFailed = UserPrincipal.FindByBadPasswordAttempt(pc, DateTime.Now.Date.AddHours(6), MatchType.GreaterThan);
string s = "";
foreach (UserPrincipal u in uFailed)
{
s += u.SamAccountName + ": " + Convert.ToDateTime(u.LastBadPasswordAttempt).ToLocalTime().ToString() + "\r\n";
}
Console.Write(s);
Console.Read();
}
请注意 LastBadPasswordAttempt 属性的 UTC 转换,但不是在 FindByBadPasswordAttempt 过滤器中。
我很担心在不知道我是否遗漏某些东西(可能)或 MSDN 文档是否错误的情况下将其投入生产。代码在它查询的 DC 上运行,所以应该没有时区问题。