从Active Directory获取PasswordExpirationDate字段时遇LDAPAttributeError错误
解决LDAP获取AD密码过期日期的属性错误
错误根源:Active Directory中不存在
PasswordExpirationDate这个属性,你指定了无效的属性类型才触发LDAPAttributeError。两种正确获取密码过期日期的方法:
通过属性计算得到
AD中用户的pwdLastSet记录了上次修改密码的时间戳,结合域策略的maxPwdAge(最大密码有效期)可以计算出过期日期。
示例代码:# 先获取用户的pwdLastSet属性 user_fields = ['pwdLastSet', 'distinguishedName'] conn.search(search_base=base, search_filter=filter, search_scope=SUBTREE, attributes=user_fields) # 查询域的maxPwdAge(替换为你的域的search_base) conn.search(search_base='CN=Default Domain Policy,CN=Policies,CN=System,DC=yourdomain,DC=com', search_filter='(objectClass=domain)', attributes=['maxPwdAge']) max_pwd_age = conn.entries[0].maxPwdAge.value # 转换时间并计算过期日期 from datetime import datetime, timedelta for user_entry in conn.entries: pwd_last_set = user_entry.pwdLastSet.value if pwd_last_set and max_pwd_age != 0: # 转换AD时间戳为本地datetime pwd_last_dt = datetime.fromtimestamp(pwd_last_set / 10000000 - 11644473600) # 转换maxPwdAge为timedelta(AD存储的是负数) pwd_valid_delta = timedelta(seconds=abs(max_pwd_age) / 10000000) expiry_date = pwd_last_dt + pwd_valid_delta print(f"{user_entry.distinguishedName.value} 密码过期日期: {expiry_date}")直接获取派生属性
msDS-UserPasswordExpiryTimeComputed
这是AD预计算好的派生属性,直接返回密码过期的时间戳,无需手动计算,适合Windows Server 2003及以上版本的AD。
修改你的代码,把fields里的PasswordExpirationDate替换成这个属性即可:fields = ['msDS-UserPasswordExpiryTimeComputed', 'distinguishedName'] conn.search(search_base=base, search_filter=filter, search_scope=SUBTREE, attributes=fields, paged_size=self.page_size, paged_cookie=cookie) response = conn.response_to_json() # 转换时间戳为可读格式 import json from datetime import datetime response_data = json.loads(response) for entry in response_data['entries']: expiry_ts = entry['attributes'].get('msDS-UserPasswordExpiryTimeComputed') if expiry_ts and expiry_ts != 0: expiry_dt = datetime.fromtimestamp(expiry_ts / 10000000 - 11644473600) print(f"{entry['dn']} 密码过期日期: {expiry_dt}")
注意点:
- 如果用户设置了密码永不过期,
msDS-UserPasswordExpiryTimeComputed的值会是0,需要在代码中做判断跳过。 - 访问派生属性可能需要对应的LDAP权限,确保你的连接账号有足够权限。
- 如果用户设置了密码永不过期,
内容的提问来源于stack exchange,提问作者Aman Raheja
相关产品推荐
相关产品推荐

