18桁の文字列をLDAPAccountExpiresから通常の日時形式に変換したい。
129508380000000000 >> 2011年5月26日
次のリンクを使用して、上記の変換を取得しました。
DateTime.ParseまたはConvert.ToDateTimeを使用して変換しようとしました。しかし、成功しません。
誰かがそれを変換する方法を知っていますか?どうもありがとう。
参照 によると、UTCでのJan-01-1601以降のティック数であり、1601年の重要性を説明しています。
var accountExpires = 129508380000000000;
var dt = new DateTime(1601, 01, 01, 0, 0, 0, DateTimeKind.Utc).AddTicks(accountExpires);
Jan-02-1601以降のティック数です。
DateTime dt = new DateTime(1601, 01, 02).AddTicks(129508380000000000);
DateTimeクラスでFromFileTimeメソッドを使用できますが、このフィールドが期限切れにならないように設定されている場合、Int64.MaxValueとして返され、これらのメソッドのいずれでも機能しないことに注意してください。
Int64 accountExpires = 129508380000000000;
DateTime expireDate = DateTime.MaxValue;
if (!accountExpires.Equals(Int64.MaxValue))
expireDate = DateTime.FromFileTime(accountExpires);
AccountExpires値を設定するためにここに来た人のためのいくつかの情報。
有効期限をクリアするのは簡単です。
entry.Properties["accountExpires"].Value = 0;
ただし、int64/longを直接書き戻そうとすると、次のようになります。
entry.Properties["accountExpires"].Value = dt.ToFileTime();
'COMException was unhandled-Unspecifiederror'を取得できます
代わりに、値を文字列データ型として書き戻します。
entry.Properties["accountExpires"].Value = dt.ToFileTime().ToString();
ADUCとの整合性を保つために、設定する時刻に注意してください。時刻は00:00にする必要があります。
.Nowまたは.UtcNowの代わりに、.Todayを使用できます。
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();
投稿したリンクでソースを表示すると、c#に非常にうまく変換されるJavascript変換アルゴリズムが表示されます。
Rubyの場合
def ldapTimeConverter(ldap_time)
Time.at((ldap_time/10000000)-11644473600)
end
PowerShellスクリプトでの作業に出くわしました。 accountexpirationdate
プロパティをクエリでき、変換は必要ないことがわかりました。
誰かが上記の「最良の」方法を持っていましたが、期限切れにならないように設定されている場合、値はゼロです。
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);
}