2014-01-30 162 views
0

以下代码返回给定Groupname的UserPricipal。但是在删除一个组之后,这个代码仍然返回一个UserPrincipal(删除的)。有没有办法删除这个“缓存”?如何清除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

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

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

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

+0

无法在UserPrincipalLookupService中指定服务器。我认为**%logonserver%**环境变量显示当前连接的域控制器。但我想设置许多ACL的远程,所以远程和我的电脑探测不到相同的DC。 –

+0

+1有帮助;同样的问题在这里,我已经为此搜索了MSDN。当你说“复制通常很快发生”......有人知道生存时间的来源,或者可以在Windows 2012 PDC上配置这种缓存/复制策略吗? – dlatikay