Проверка времени

У меня есть метод, который запрашивает активный каталог и возвращает значение последнего сброса пароля в локальной переменной. Я пытаюсь сравнить это значение с текущей датой и временем и проверить, прошло ли оно менее 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, измените оба на временной интервал и сравните его

Другие вопросы по тегам