Преобразование 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. Но никакого успеха.
Кто-нибудь знает, как его преобразовать? Большое спасибо.
Ответы
Ответ 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);
}