我的应用程序每天执行一次LDAP查询,并获取给定容器中的所有用户和组。一旦获取,我的应用程序将遍历组的用户列表,仅将新的用户添加到我的应用程序的数据库(它只添加用户名)。
如果有50,000个用户,我的应用服务器每天都忙着45分钟执行此操作。
有没有办法在我的LDAP查询中指定我需要“delta”,以便我只检索自上次LDAP查询以来添加/修改/删除的用户?
答案 0 :(得分:2)
我认为每个条目都应该有一个modifyTimestamp
。看一下像softerra ldap浏览器(http://download.softerra.com/files/ldapbrowser26.msi)这样的东西。如果它存在,您应该能够在ldap查询中添加一个条件,以查找自上次运行同步作业以来已更改的条目。
答案 1 :(得分:1)
这取决于您的目录。应该有一个属性,如时间戳或序列号,可用于过滤LDAP查询。例如,在Active Directory中,值为'uSNChanged'。
答案 2 :(得分:1)
跟踪更改有两个主要选择:轮询和DirSync。这些文章应该为您提供一些背景知识,帮助您选择最适合您的文章。
http://support.microsoft.com/kb/891995
http://msdn.microsoft.com/en-us/library/ms677974(VS.85).aspx
这里有一些.NET的东西:
http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysynchronization.aspx
答案 3 :(得分:0)
您需要检查目录的操作属性。
使用OpenLDAP,您可以添加+符号以获取操作属性,并从createTimestamp:
进行检查始终采用祖鲁格式,即YYYYMMDDHHMMSSZ。使用像fedora-ds这样的其他DS你需要搜索操作属性。
ldapsearch -x< other_options> createTimestamp
答案 4 :(得分:0)
对于用户,请尝试:
directorySearcher.Filter = "(&(objectCategory=person)(objectClass=user)(whenChanged>=" + yourLastQueryDate.ToString("yyyyMMddHHmmss") + ".0Z))";
对于团体,请尝试:
directorySearcher.Filter = "(&(objectCategory=group)(whenChanged>=" + yourLastQueryDate.ToString("yyyyMMddHHmmss") + ".0Z))";
然后:
SearchResultCollection adSearchResults = dSearcher.FindAll();
注意:请确保您的上一个查询日期为UTC /祖鲁时间,或使用后缀“ .nZ”调整您的时区。