我想将来自LDAP AccountExpires的18位数字符串转换为正常日期时间格式。
129508380000000000>> 2011年5月26日
我使用以下链接获得了上述转换。
我尝试使用DateTime.Parse或Convert.ToDateTime进行转换。但没有成功。
任何人都知道如何转换它?非常感谢。
答案 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();