Преобразование учетной записи LDAPExpires в DateTime в C # - PullRequest
15 голосов
/ 15 июня 2011

Я хочу преобразовать 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. Но безуспешно.

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

Ответы [ 7 ]

19 голосов
/ 03 ноября 2011

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

Int64 accountExpires = 129508380000000000;

DateTime expireDate = DateTime.MaxValue;

if (!accountExpires.Equals(Int64.MaxValue))
    expireDate = DateTime.FromFileTime(accountExpires);
18 голосов
/ 15 июня 2011

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

Это число тиков с января по 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);
8 голосов
/ 07 декабря 2011

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

Очистить истечение срока легко и просто:

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

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

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

Вы можете получить сообщение «COMException не обработан - ошибка не указана»

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

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

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

Вместо .Now или .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();
2 голосов
/ 15 июня 2011

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

0 голосов
/ 14 ноября 2018

для рубина

def ldapTimeConverter(ldap_time)
  Time.at((ldap_time/10000000)-11644473600)
end
0 голосов
/ 21 мая 2014

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

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);
}
0 голосов
/ 24 января 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...