.NET DirectoryServices查找方法使用UTC还是本地时间?
,则.NET DirectoryServices查找方法使用UTC还是本地时间?,.net,datetime,active-directory,.net,Datetime,Active Directory,,则UserPrinciple和ComputerPrinciple类的查找方法(如FindByLogonTime和FindBybadPasswordEntry)使用UTC时间过滤结果。然而,测试表明这些方法似乎将本地时间作为输入,而生成的对象使用UTC作为其时间属性,需要转换为本地时间 下面的示例似乎正确列出了自当地时间早上6点以来在服务器上尝试登录失败的所有用户: static void Main() { var pc = new PrincipalContex
UserPrinciple
和ComputerPrinciple
类的查找方法(如FindByLogonTime和FindBybadPasswordEntry)使用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();
}
static void Main()
{
var pc=新的PrincipalContext(ContextType.Domain,dcServer);
PrincipalSearchResult uFailed=UserPrincipal.FindByBappassword尝试(pc,DateTime.Now.Date.AddHours(6),MatchType.greaterth);
字符串s=“”;
foreach(uFailed中的用户主体u)
{
s+=u.SamAccountName+“:“+Convert.ToDateTime(u.LastBadPasswordTest).ToLocalTime().ToString()+”\r\n”;
}
控制台。写入;
Console.Read();
}
请注意LastBadPasswordAttract属性的UTC转换,但不在FindByBadPasswordAttract筛选器中
在不知道我是否遗漏了什么(可能)或MSDN文档是否错误的情况下将其投入生产时,我很紧张。代码在其查询的DC上运行,因此应该没有时区问题。MSDN文档是准确的,您只需要注意传入的
日期时间
值的.Kind
属性
如果深入研究引用源或反汇编,您会发现您要传递的DateTime
值最终会被传递到,这在其行为中考虑了种类
因此,您可以基于DateTime.UtcNow
传入一个值,该值的.Kind
值为DateTimeKind.Utc
,并且该值可以工作,或者,您可以像当前一样执行并传递DateTime.Now
,它的.Kind
为DateTimeKind.Local
,并且该本地时间将在查询之前转换为UTC。只需确保您认识到这是运行代码的计算机的本地时间。如果这可能与您的用户不在同一时区,则您可能需要使用TimeZoneInfo
获取与其他一些本地时区相当的UTC时间
如果出于某种原因,您决定传入一个您自己构造的日期,它可能会有DateTimeKind.Unspecified
。对于此特定函数,它将被视为UTC。这并不一定适用于所有日期/时间函数,因此要小心
另外,在输出中,当您使用的值已经是DateTime
时,不需要调用Convert.ToDateTime
。因此,在这段代码中,您甚至不需要ToString
,除非您计划传递一个格式说明符。同样,如果您的用户可能在其他时区,请不要使用。ToLocalTime
,而是使用时区信息
上的方法之一进行转换
另一个小优化是,如果您愿意,可以使用DateTime.Today
而不是DateTime.Now.Date
。(除了可读性稍高之外,没有什么区别。)很抱歉耽搁了您的时间,感谢您的帮助——这有助于我了解发生了什么,欢迎并感谢您提供的提示。没问题。很高兴我能帮忙!