我的应用程序每天执行一次 LDAP 查询,并获取给定容器中的所有用户和组。获取后,我的应用程序将遍历组用户列表,仅将新用户添加到我的应用程序数据库中(它仅添加用户名)。
如果有 50,000 个用户,我的应用程序服务器每天忙于执行此操作 45 分钟。
有没有办法在我的 LDAP 查询中指定我需要一个“增量”,以便我只检索自上次 LDAP 查询以来添加/修改/删除的那些用户?
我的应用程序每天执行一次 LDAP 查询,并获取给定容器中的所有用户和组。获取后,我的应用程序将遍历组用户列表,仅将新用户添加到我的应用程序数据库中(它仅添加用户名)。
如果有 50,000 个用户,我的应用程序服务器每天忙于执行此操作 45 分钟。
有没有办法在我的 LDAP 查询中指定我需要一个“增量”,以便我只检索自上次 LDAP 查询以来添加/修改/删除的那些用户?
我认为每个条目都应该有一个modifyTimestamp
。看看 softerra ldap 浏览器 ( http://download.softerra.com/files/ldapbrowser26.msi ) 之类的东西。如果存在,您应该能够向 ldap 查询添加条件,以查找自上次运行同步作业以来已更改的条目。
这取决于您的目录。应该有一个属性,例如时间戳或序列号,您可以使用它来过滤您的 LDAP 查询。例如,在 Active Directory 中,该值为“uSNChanged”。
跟踪更改有两种主要选择:轮询和 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
对于用户尝试:
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/Zulu 时间或使用“.nZ”后缀来调整您的时区。
您需要检查 Directory 的操作属性。
使用 OpenLDAP,您可以添加 + 号以获取操作属性并从 createTimestamp 进行检查:
它始终采用 Zulu 格式,即 YYYYMMDDHHMMSSZ。与 fedora-ds 等其他 DS 一样,需要搜索操作属性。
ldapsearch -x <其他选项> createTimestamp