Подтвердить что ты не робот

Преобразование LDAP AccountExpires в DateTime в С#

Я хочу преобразовать 18-значную строку из LDAP AccountExpires в обычный формат времени.

129508380000000000 → 26 мая 2011 г.

Я получил вышеуказанное преобразование, используя следующую ссылку.

http://www.chrisnowell.com/information_security_tools/date_converter/Windows_active_directory_date_converter.asp?pwdLastSet,%20accountExpires,%20lastLogonTimestamp,%20lastLogon,%20and%20badPasswordTime

Я попытался преобразовать, используя DateTime.Parse или Convert.ToDateTime. Но никакого успеха.

Кто-нибудь знает, как его преобразовать? Большое спасибо.

4b9b3361

Ответ 1

Отредактированный ответ

Это количество тиков с января по 01-1601 в UTC, согласно Ссылка, в котором описывается значение 1601 года. Хорошее фоновое чтение.

var accountExpires = 129508380000000000;
var dt = new DateTime(1601, 01, 01, 0, 0, 0, DateTimeKind.Utc).AddTicks(accountExpires);

Оригинальный принятый ответ

Это число тиков с января по 02-1601.

DateTime dt = new DateTime(1601, 01, 02).AddTicks(129508380000000000);

Ответ 2

Вы можете использовать метод FromFileTime в классе DateTime, но не смотрите, когда это поле не истечет, оно возвращается как Int64.MaxValue и не работает ни с одним из этих методов.

Int64 accountExpires = 129508380000000000;

DateTime expireDate = DateTime.MaxValue;

if (!accountExpires.Equals(Int64.MaxValue))
    expireDate = DateTime.FromFileTime(accountExpires);

Ответ 3

Некоторая информация для всех, кто пришел сюда, чтобы установить значение AccountExpires.

Чтобы очистить срок действия, приятно и легко:

entry.Properties["accountExpires"].Value = 0;

Однако, если вы попытаетесь напрямую написать int64/long:

entry.Properties["accountExpires"].Value = dt.ToFileTime();

Вы можете получить "COMException был необработанным - ошибка Unspecified"

Вместо этого напишите обратно в виде строкового типа данных:

entry.Properties["accountExpires"].Value = dt.ToFileTime().ToString();

Помните о времени дня, которое вы устанавливаете, для согласованности с ADUC время должно быть 00:00.

Вместо. Теперь или .UtcNow вы можете использовать. Сегодня:

var dt1 = DateTime.Today.AddDays(90);
entry.Properties["accountExpires"].Value = dt1.ToFileTime().ToString();

Другой ввод, такой как dateTimePicker, можно заменить временем, вроде как локальный для контроллера домена:

var dt1 = dateTimePicker1.Value;
var dt2 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 0, 0, 0, DateTimeKind.Local);
entry.Properties["accountExpires"].Value = dt2.ToFileTime().ToString();

Ответ 4

Если вы просматриваете источник по ссылке, которую вы опубликовали, вы должны увидеть алгоритм преобразования Javascript, который должен хорошо перевести на С#

Ответ 5

Я наткнулся на это, работая над PowerShell script. Я обнаружил, что могу запросить свойство accountexpirationdate, и преобразование не требуется.

Ответ 6

У кого-то был "лучший" способ выше, но когда он никогда не истек, значение равно нулю.

public static DateTime GetAccountExpiresDate(DirectoryEntry de)
{
    long expires = de.properties["accountExpires"].Value;
    if (expires == 0)   // doesn't expire
        return DateTime.MaxValue;

    return DateTime.FromFileTime(expires);
}