You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Active Directory获取PasswordExpirationDate字段时遇LDAPAttributeError错误

解决LDAP获取AD密码过期日期的属性错误
  • 错误根源:Active Directory中不存在PasswordExpirationDate这个属性,你指定了无效的属性类型才触发LDAPAttributeError。

  • 两种正确获取密码过期日期的方法:

    1. 通过属性计算得到
      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}")
      
    2. 直接获取派生属性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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:58:32