According to MSDN, методы поиска (например, FindByLogonTime и FindByBadPasswordAttempt) классов UserPrinciple
и ComputerPrinciple
используют время UTC для фильтрации результатов. Тем не менее, тестирование показывает, что эти методы, по-видимому, принимают локальное время в качестве входных данных, тогда как результирующие объекты используют UTC для своих временных свойств и должны быть преобразованы в локальное время..NET DirectoryServices Поиск методов использует UTC или локальное время?
Вот пример, который, кажется, правильно список всех пользователей с неудачной попытки входа в систему на сервере, так как 6am по местному времени:
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();
}
Примечание преобразование UTC для свойства LastBadPasswordAttempt, но не в фильтре FindByBadPasswordAttempt.
Я нервничаю из-за того, что ввел это в производство, не зная, не хватает ли я чего-то (вероятно) или если документы MSDN ошибочны. Код запускается на запросе DC, поэтому не должно быть проблем с часовым поясом.
Извините за задержку и спасибо за помощь - это помогает мне понять, что происходит, и советы приветствуются и оцениваются. – nedm
Нет проблем. Рад, что смог помочь! –