我想要在 Active Directory 中搜索 x 天/月内未登录的非活动用户。我有这样的 ldapsearch 查询:
ldapsearch -h domain.test -p 389 -D "cn=login,ou=test,dc=domain,dc=test" -w "passwd" -s sub -b "ou=Test,dc=domain,dc=test" "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))"
它为我提供了 domain.test 中所有不活跃用户及其所有属性的列表。
我想添加一个过滤器,用于搜索 x 天/月内未登录的用户,如果结果是 sAMAccountNames 列表(非活动用户和 lastLogonTimestamp >例如 3 个月),那就太好了。我知道 LastLogonTimestamp 不是用户上次登录的实际时间,但在这种情况下它并不那么重要。
编辑:现在我只需要知道是否有办法在上面的 ldapsearch 查询的输出中显示像“lastLogonTimestamp”这样的属性?
回答:上述 ldapsearch 查询的输出中未为每个对象设置属性 lastLogonTimestamp。我没有注意到这一点。因此 grep 显示它:
ldapsearch -h domain.test -p 389 -D "cn=login,ou=test,dc=domain,dc=test" -w "passwd" -s sub -b "ou=Test,dc=domain,dc=test" "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))" | grep -i lastlogontimestamp
编辑:要将 Windows lastLogonTimestamp 转换为日期,我使用了:
while read -r line;
do
let "ts = ($line / 10000000) - 11644473600" && echo $ts >> linux_timestamp;
date -d @$ts +'%Y%m%d' >> linux_date;
done < users_lastlogontimestamp
非常感谢您的任何建议。
答案1
您只需要修改过滤器以添加另一个条件,以便 ldap 服务器仅返回 lastLogonTimestamp>= 的条目时间戳。要仅检索特定属性而不是整个条目,请指定服务器要返回的属性。
例如:-
ldapsearch -h domain.test -p 389 -D "cn=login,ou=test,dc=domain,dc=test" -w "passwd" -s sub -b "ou=Test,dc=domain,dc=test" "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2)(lastlogontimestamp>=131550784796762354))" samAccountName lastlogontimestamp
答案2
感谢 Najmuddin 的回答。
我认为比较 lastlogontimestamps 是可以的 - 但事实并非如此,因为 lastlogontimestamp 值不可比较。唯一的办法是先转换为日期格式,然后进行比较以获取 lastlogon 是例如 2017 年 6 月 1 日之前的用户。问题是:如何在 bash 中将 Windows lastlogontimestamp 转换为日期?
请让我知道这是否是正确的方法。