1

我正在尝试更改account expiration datein windows active directory

我可以使用以下代码在帐户到期时更改从不选项。

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

这是我更改或延长帐户到期日期的代码。

公共类 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 中更改的一种方法,请尝试查看此讨论

-吉姆

于 2014-06-07T08:29:35.247 回答