Проверка времени
У меня есть метод, который запрашивает активный каталог и возвращает значение последнего сброса пароля в локальной переменной. Я пытаюсь сравнить это значение с текущей датой и временем и проверить, прошло ли оно менее 24 часов. Я думаю, что я близко, но не могу заставить это работать.
Спасибо Джейсон
string passwordLastSet = string.Empty;
passwordLastSet = DateTime.FromFileTime((Int64)(result.Properties["PwdLastSet"][0])).ToString();
public string lastReset(DateTime pwordLastReset)
{
if (DateTime.Now.AddHours(24) <= passwordLastSet)
{
return "try again later";
}
else
{
return "all is good";
}
}
7 ответов
Это:
if (DateTime.Now.AddHours(24) <= passwordLastSet)
должно быть
if (DateTime.Now <= passwordLastSet.AddHours(24))
Я пытаюсь сравнить это значение с текущей датой и временем и проверить, прошло ли оно менее 24 часов.
Этот код почти пишет сам.
DateTime timeOfLastPasswordReset = // get time of last password reset
DateTime now = DateTime.Now;
TimeSpan difference = now.Subtract(timeOfLastPasswordReset);
if(difference < TimeSpan.FromHours(24)) {
// password was reset less than twenty-four hours ago
}
else {
// password was reset no less than twenty-four hours ago
}
Обратите внимание, что код читается точно так, как вы указали на английском языке.
Как насчет (если я правильно прочитал ваши намерения):
// Does passwordLastSet, with 24 hours added to it, fall before or after DateTime.Now?
// If AFTER, then reject, if BEFORE, then accept
if (passwordLastSet.Add(new TimeSpan(24, 0, 0)) > DateTime.Now)
{
// Password was last set within the last 24 hours
return "try again later";
}
else
{
return "all is good";
}
if (DateTime.Now.Subtract(passwordLastSet).TotalHours < 24)
Console.WriteLine("Try again");
else
Console.WriteLine("all is good");
Вы также можете использовать TotalDays < 1
Пытаться DateTime.Now.AddHours(-24) <= passwordLastSet
как вы хотите смоделировать, что сейчас прошло 24 часа, а не в будущем
Быть педантичным:
Вам необходимо проверить наличие особых случаев перед преобразованием в DateTime - например, pwdLastSet может быть нулевым, поэтому вы должны проверить это перед попыткой преобразования.
pwdLastSet
хранится как UTC - так что преобразование в местное время с использованиемDateTime.FromFileTime
может вернуть неоднозначное время.Так что было бы лучше использовать
DateTime.FromFileTimeUtc
и сравнить сDateTime.UtcNow
,
В зависимости от того, чего именно вы хотите достичь, вы также можете проверить флаги userAccountControl - что-то вроде следующего (непроверенного):
[Flags]
private enum AdsUserFlags
{
Script = 0x1,
AccountDisabled = 0x2,
HomeDirectoryRequired = 0x8,
AccountLockedOut = 0x10,
PasswordNotRequired = 0x20,
PasswordCannotChange = 0x40,
EncryptedTextPasswordAllowed = 0x80,
TempDuplicateAccount = 0x100,
NormalAccount = 0x200,
InterDomainTrustAccount = 0x800,
WorkstationTrustAccount = 0x1000,
ServerTrustAccount = 0x2000,
PasswordDoesNotExpire = 0x10000,
MnsLogonAccount = 0x20000,
SmartCardRequired = 0x40000,
TrustedForDelegation = 0x80000,
AccountNotDelegated = 0x100000,
UseDesKeyOnly = 0x200000,
DontRequirePreauth = 0x400000,
PasswordExpired = 0x800000,
TrustedToAuthenticateForDelegation = 0x1000000,
NoAuthDataRequired = 0x2000000
}
...
AdsUserFlags userAccountControl = (AdsUserFlags)result.Properties["userAccountControl"][0];
long lastReset = (long)result.Properties["PwdLastSet"][0];
if (lastReset == 0L)
{
if ((userAccountControl & AdsUserFlags.PasswordDoesNotExpire) == 0)
{
// ... user must set password at next login
}
else
{
// ... presumably password has never been reset
}
}
else
{
DateTime lastResetUtc = DateTime.FromFileTimeUtc(lastReset);
// ... etc - compare with DateTime.UtcNow
}
Вы сравниваете строковую переменную и переменную d atetime, ее невозможно сравнить
DateTime passwordLastSet = DateTime.FromFileTime((Int64)(result.Properties["PwdLastSet"][0]));
public string lastReset(DateTime pwordLastReset)
{
if (DateTime.Now.AddHours(24) <= passwordLastSet)
{
return "try again later";
}
else
{
return "all is good";
}
}
измените вашу строку на DateTime
если вы хотите сравнить его с текущим временем
просто используйте это
if (DateTime.Now <= passwordLastSet)
{
return "try again later";
}
else
{
return "all is good";
}
если хотите проверить больше 24, измените оба на временной интервал и сравните его