在C#中将LDAP AccountExpires转换为DateTime

时间:2011-06-15 15:31:18

标签: c# datetime ldap

我想将来自LDAP AccountExpires的18位数字符串转换为正常日期时间格式。

129508380000000000>> 2011年5月26日

我使用以下链接获得了上述转换。

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进行转换。但没有成功。

任何人都知道如何转换它?非常感谢。

8 个答案:

答案 0 :(得分:17)

编辑回答

这是自UTC时间01-1-1601以来的滴答数,根据Reference,它描述了1601年的重要性。良好的背景阅读。

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

原始接受的答案

这是自2001年1月2日至1月1日以来的滴答数。

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

答案 1 :(得分:17)

您可以在DateTime类上使用FromFileTime方法,但请注意,当此字段设置为未过期时,它将作为Int64.MaxValue返回,并且不适用于这两种方法。

Int64 accountExpires = 129508380000000000;

DateTime expireDate = DateTime.MaxValue;

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

答案 2 :(得分:8)

来到这里寻找设置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这样的其他输入可以替换域控制器的时间,Kind为Local:

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();

答案 3 :(得分:2)

如果您在发布的链接上查看来源,您应该会看到一个Javascript转换算法,它应该很好地转换为c#

答案 4 :(得分:0)

我偶然发现了PowerShell脚本。我发现我可以查询accountexpirationdate属性,不需要转换。

答案 5 :(得分:0)

某人有“最佳”方式,但当它设置为永不过期时,该值为零。

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);
}

答案 6 :(得分:0)

对于Ruby

def ldapTimeConverter(ldap_time)
  Time.at((ldap_time/10000000)-11644473600)
end

答案 7 :(得分:0)

我将为这个问题提供一个完美的答案,通过它您可以将DateTime转换为Active Directory long int格式,反之亦然。

这是一个解决方案:-

要从AD获取DateTime

string tickstring = de.Properties["accountExpires"][0].ToString();
long Ticks = (long) tickstring;

DateTime ReferenceDate = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long ExpireDateTicks = Ticks + ReferenceDate.Ticks;
DateTime ExpireDate = new DateTime(ExpireDateTicks);

要将DateTime转换为AD长整数格式

DateTime ReferenceDate = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime ExpireDate = new DateTime(Request.EndDate.Year, Request.EndDate.Month, Request.EndDate.Day, 0, 0, 0);

long Ticks = ExpireDate.Ticks - ReferenceDate.Ticks;
NewUser.accountExpires = Ticks.ToString();