我如何清除UserPrincipal缓存

时间:2014-01-30 15:48:47

标签: java active-directory acl

以下代码返回给定Groupname的UserPricipal。但删除组后,此代码仍然返回UserPrincipal(已删除的组)。有没有办法删除这个“缓存”?

UserPrincipalLookupService upls=fs.getUserPrincipalLookupService();
UserPrincipal who;
try {
    who = upls.lookupPrincipalByName("myDeletedGroupName");
} catch (IOException e1) {
    // TODO Auto-generated catch block
return;
}

因为在设置Windows ACL时我需要UserPrincipalName。在重新创建具有相同名称的已删除组后,ACL将设置为旧组而不是新组 - 在查看Windows-GUI时,我会在ACL列表中看到旧的objectSid而不是新组(-name)。

简而言之:

    1. creating AD Group "xxxx"
    2. setting ACL in File f for xxxx
    3. deleting Group "xxxx"
    4. deleting ACL
    5. create new Group "xxxx" in AD 
    6. setting ACL in File f for xxxx
    -> the OldSid from the deleted Group is the ACL Principal

1 个答案:

答案 0 :(得分:1)

Active Directory是一个分布式系统。可能有多个域控制器为同一个域提供服务。因此,在通过一个域控制器从Active Directory中删除对象后,您仍可以在复制启动之前在另一个域控制器上找到已删除的对象。

即使您只有一个域控制器,您仍需要注意您正在使用的服务。有正常的LDAP服务和全局编录服务。全局编录服务是来自不同域(包括本地域)的对象的缓存,位于同一个林中。其目的是允许用户在同一Active Directory林中的所有域中进行全局搜索。您将在全局目录中找到类似的问题。删除域控制器上的对象后,您仍然可以从全局编录中找到已删除的对象,直到复制开始。好消息在同一个域控制器内,这种复制通常很快发生。

我不熟悉Java中的UserPrincipalLookupService,但很有可能,它使用全局编录来查找用户主体。您可能需要检查该类是否允许您指定要使用的域控制器以及执行查询时要使用的全局编录。如果该类不允许您指定服务器,我恐怕您必须等待复制。