web-dev-qa-db-ja.com

LDAP AccountExpiresをC#でDateTimeに変換します

18桁の文字列をLDAPAccountExpiresから通常の日時形式に変換したい。

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を使用して変換しようとしました。しかし、成功しません。

誰かがそれを変換する方法を知っていますか?どうもありがとう。

16
TTCG

編集された回答

参照 によると、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);
20
agent-j

DateTimeクラスでFromFileTimeメソッドを使用できますが、このフィールドが期限切れにならないように設定されている場合、Int64.MaxValueとして返され、これらのメソッドのいずれでも機能しないことに注意してください。

Int64 accountExpires = 129508380000000000;

DateTime expireDate = DateTime.MaxValue;

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

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

投稿したリンクでソースを表示すると、c#に非常にうまく変換されるJavascript変換アルゴリズムが表示されます。

2
DaveRead

Rubyの場合

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

PowerShellスクリプトでの作業に出くわしました。 accountexpirationdateプロパティをクエリでき、変換は必要ないことがわかりました。

0
northben

誰かが上記の「最良の」方法を持っていましたが、期限切れにならないように設定されている場合、値はゼロです。

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
BillJam