1

account expiration datein windowsを変更しようとしていますactive directory

以下のコードを使用して、アカウントの有効期限が切れる際にNeverオプションを変更できます。

final Modification mod = new Modification(ModificationType.REPLACE,
        "accountExpires", "9223372036854775807");//Can change the required date with milliseconds

LDAPResult result=connection.modify(userDN, mod);

しかし、account expiry date手段を変更しようとすると、コードは正常に実行され、コンソールに成功が出力されました。しかし、日付は変更されませんAD

アカウントの有効期限を変更または延長するコードは次のとおりです。

public class AccountExpireSetting {

public void ChangeAccountExpires(String userDN,String password , String dateToChange) throws LDAPException
{
    LDAPConnection connection=null;
    String someDate = null;
    try {
        connection = new LDAPConnectionObject().getConnection();
    } catch (LDAPException e1) {
        e1.printStackTrace();
    }


    try{
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        Date date = sdf.parse(dateToChange);
        System.out.println("Date to MillSeconds : "+date.getTime());
        someDate = String.valueOf(date.getTime());

        Date date1=new Date(date.getTime());
        System.out.println("MillSeconds to Date : "+date1);
    }
    catch(Exception e){
        e.printStackTrace();
    }

    try{

        System.out.println("Going to replace account expires to never");
        final Modification mod = new Modification(ModificationType.REPLACE,
                "accountExpires", someDate);// 9223372036854775807 milliseconds can change the password to never expire
        // 9223372036854775807  

        LDAPResult result=connection.modify(userDN, mod);
        System.out.println("Account expires status : " + result); // Password status : LDAPResult(resultCode=0 (success), messageID=2, opType='modify')
    }catch(LDAPException e) {
        // TODO Auto-generated catch block
        System.out.println("Error in replacing account expires to never");  

        e.printStackTrace();
    }finally
    {
        System.out.println("Closing the connection.");
        connection.close();
    }  
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    String temp="CN=Anand,OU=Java,OU=Chennai,OU=Department,dc=tstdmn,dc=com";
    try {
        new AccountExpireSetting().ChangeAccountExpires(temp, "password@123","08.06.2014");
    } catch (LDAPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

人々がより良い解決策を提供してくれることを願っています。

4

1 に答える 1

4

acountExpires はミリ秒単位ではなく、1601 年 1 月 1 日 (UTC) からの 100 ナノ秒間隔の数です。

Active Directory 内のユーザー オブジェクトに有効期限が設定されていない場合、accountExpires 属性は膨大な数に設定されます。実際の値は 2^63 – 1、つまり 9,223,372,036,854,775,807 です。これは、64 ビットの数値が -2^63 から 2^63 - 1 の範囲であり、これが 64 ビット値として保存できる最大の数値になるためです。明らかに、これは解釈できないほど遠い未来の日付を表しています。実際、AccountExpirationDate がこの値を読み取ろうとすると、エラーが発生します。ユーザー オブジェクトに有効期限があり、[アカウント] タブで [無効] を選択して ADUC でこの日付を削除すると、GUI は accountExpires を 0 に設定します。したがって、値 0 と 2^63 - 1 はどちらも実際には"一度もない"

Java で変更する 1 つの方法については、このディスカッションを参照してください。

-ジム

于 2014-06-07T08:29:35.247 に答える