2

LDAP->Unix に変換する方法については多くの例がありますが、Unix->LDAP のように元に戻すことはできません..

LDAP-> Unix用に私が持っているものは次のとおりです:

LDAP タイムスタンプを Unix タイムスタンプに変換する方法
http://www.morecavalier.com/index.php?who=Apps%2FLDAP+timestamp+converter

function LDAPtoUnix($t) {
    $secsAfterADepoch = $t / (100000000);
    $AD2Unix = ( (1970-1601) * 365 -3 + round((1970-1601)/4) ) * 86400;
    return intval($secsAfterADepoch-$AD2Unix);
}

私は正確であるべきだと思います。しかし、私は数学を逆転させるために私のちっぽけな小さな脳をひねっていますが、それを理解することはできません..異なるエポック間の秒単位の差を計算し、それらを特定の時間パラメータに単純に加算/減算するだけで頭が沸騰していますか?

タイムスタンプを逆にする方法について誰かが光を当てることができますか?

参照: http://msdn.microsoft.com/en-us/library/windows/desktop/ms679430(v=vs.85).aspx

また、脳が数学を計算したくないことに加えて、私が尋ねている主な理由は、PHPの浮動小数点メカニズムが必要なほど具体的ではないように見えるからですか? Unix->LDAP タイムスタンプを計算すると1.3009518089E+17、Active Directory がこの特定の表記法を好むかどうかわからないので、文字列に格納する必要がありますが、これらの計算方法がわかりません。大きな数であり、double にはなりません。

現時点で私は持っています:

printf("%.0f", UnixToLDAP(time()));

これにより正しい長さが得られますが、実際には具体的ではありません。

私が必要なもの

pwdLastSetActive Directory に適合する短くてシンプルな Unix->LDAP タイムスタンプ。また、それは可能な限り完璧でなければなりません

Google: 自動ソリューション (Windows 2012 Active Directory)

pwdLastSet に -1 を指定するだけで、Windows はパスワードが変更された後の最終ログイン時刻を自動的に設定します。完璧ではありませんが、グーグルで検索してここにたどり着いた人なら誰でもうまくいきます。

4

3 に答える 3

3

入力パラメーターに適切な名前を付け、戻る前に中間変数を割り当てることで、関数をもう少し読みやすくすることができます。$AD2Unixは実際には固定項であるため、おそらく定数である可能性があります。今のところ、関数の一番上に移動しました:

function LDAPtoUnix($ldap_ts) {
    $AD2Unix = ( (1970-1601) * 365 -3 + round((1970-1601)/4) ) * 86400;

    $secsAfterADepoch = $ldap_ts / 100000000;
    $unix_ts = intval( $secsAfterADepoch - $AD2Unix );

    return $unix_ts;
}

これで、反転する 2 つの線ができました。それらは明らかに逆の順序で発生する必要があり、次に単純な代数を使用して各 (/になる*、 に-なる+) の項を再配置すると、次のようになります。

function UnixtoLDAP($unix_ts) {
    $AD2Unix = ( (1970-1601) * 365 -3 + round((1970-1601)/4) ) * 86400;

    $secsAfterADepoch = intval( $AD2Unix + $unix_ts );
    $ldap_ts = $secsAfterADepoch * 100000000;

    return $ldap_ts;
}

いくつかのテストは、これがオリジナルをうまく反転させることを示唆しています。

于 2013-04-02T18:11:44.447 に答える
1

このようなもの?

function UnixToLDAP($t) {
    $AD2Unix = ( (1970-1601) * 365 -3 + round((1970-1601)/4) ) * 86400;
    return intval($t+$AD2Unix) * 100000000;
}
于 2013-04-02T18:12:16.860 に答える