C # — Active Directory — свойство accountExpires неправильно считывается

#c# #active-directory #passwords

#c# #active-directory #пароли

Вопрос:

Я работаю над инструментом, который перечисляет ряд свойств пользователя active Directory. В настоящее время я могу показать дату истечения срока действия, добавив 90 дней (типичная политика) к свойству lastPasswordSet. Однако некоторые учетные записи настроены так, чтобы срок действия никогда не истекал.

Я провел некоторое исследование и выяснил, что если свойство при преобразовании в длинное целое число равно 9223372036854775807, то срок действия пароля никогда не истекает (по крайней мере, мне так сказали).

Проблема, с которой я сталкиваюсь, заключается в том, что КАЖДАЯ учетная запись, которую я просматриваю, имеет 9223372036854775807 в качестве значения accountExpires. У меня есть инструмент Microsoft AD, и я могу проверить, для каких учетных записей фактически установлено значение «никогда не истекать», а для каких — через 90 дней. Я не уверен, что я делаю неправильно:

     public bool doesPWExpire(string userDN)
    {
        DirectoryEntry ent = new DirectoryEntry(userDN);
        //get account expires property
        LargeInteger passChanged = ent.Properties["accountExpires"].Value as LargeInteger;

        //convert to data type long
        long int64Value = (long)((uint)passChanged.LowPart | (((long)passChanged.HighPart) << 32));

        if (int64Value == 9223372036854775807)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
  

Ответ №1:

Вы затягиваете.Максимальное значение, хорошее значение для «никогда». Ваш код непоследователен, вы считываете свойство «accountExpires», но присваиваете переменной с именем «passChanged». Это говорит о том, что вы действительно хотите прочитать свойство, связанное с паролем. Например, «maxPwdAge» и «PasswordLastChanged». Срок действия учетных записей обычно не истекает, срок действия паролей истекает.

Комментарии:

1. Спасибо за ваш ответ. В этом есть большой смысл. Знаете ли вы какой-либо другой способ определить, установлен ли в AD флажок «Срок действия пароля не истек»?

2. Почему бы вам просто не попробовать это? Создайте учетную запись с паролем, срок действия которого не истекает, проверьте, что вы получите обратно при чтении maxPwdAge.

3. Для чтения и настройки ‘Срок действия пароля никогда не истекает’ посмотрите на атрибут ‘userAccountControl’ и ADS_UF_DONT_EXPIRE_PASSWD

4. Срок действия учетных записей обычно не истекает, срок действия паролей истекает. Неверно. Дата истечения срока действия может быть установлена как для учетной записи, так и для пароля, срок действия обоих может истечь.

5. Пожалуйста, сосредоточьтесь на слове «обычно».

Ответ №2:

Я полагаю, DateTime expiry = DateTime.FromFileTime((int)ent.Properties["accountExpires"].Value) это поможет вам

Комментарии:

1. Спасибо за ваш ответ. Я получаю недопустимое исключение приведения с этим кодом. Я продолжу играть с этим, но дайте мне знать, если у вас есть какие-либо другие идеи.

2. Возможно, вам придется преобразовать его в строку и вызвать int.parse или попробовать преобразовать в long . У меня нет под рукой тестовой среды.