如何从 Active Directory 获取用户密码到期日期?

How to get user password expiration date from Active Directory?

伙计们!

有一个 Active Directory (Windows) 和一个 Linux samba 客户端。 Active Directory 的策略做了这样的调整,所以用户需要定期更改他的密码(密码有有效期)。

我的问题很简单:如果我在装有 Samba 的 Linux 机器上工作,我能得到给定用户的这个过期时间吗?

这取决于域控制器的配置。你可以试试:

net ads user info USERNAME@DOMAIN.COM -S DC_SERVER_NAME -U USERNAME

其中 USERNAME@DOMAIN.COM 是从中收集信息的帐户,DC_SERVER_NAME 是您的域控制器的主机名,USERNAME 是您的用户名。

系统将提示您输入域密码。

现在您可以获取帐户信息,包括密码到期日,或者您可以获取

ads_pull_uint32 failed

在这种情况下,您的域控制器未配置为向类 UNIX 系统提供帐户信息。

您可以联系您的域管理员说服他安装和配置 Microsoft Windows Services for UNIX 以便此命令为您提供所需的信息。

这个答案可能令人沮丧。这对我来说是因为我处于同样的情况并且对这个话题进行了很多研究。

我的解决方法:我在设置域密码 (smbpasswd -U USERNAME -r DC_SERVER_NAME) 时设置了 80 天后的日历提醒,因为它每 90 天过期一次。不完美,但可行。

[更新] 我找到了一种使用 rpcclient 确定域密码到期日期的方法,这是我的脚本:

#!/bin/bash
# author: Tim Wahrendorff 2016
# licence: Public Domain - https://wiki.creativecommons.org/wiki/Public_domain
# 
# To use this script you need at least: 
# sudo apt-get install libnotify-bin rpcclient
#
# Please set your account, password and domaincontroller to use this script


USER="username" # Domain accountname
PASS="Pa$$W0rd" # Domain password
DC="vmdc01"     # Domaincontroller

### START RPCCLIENT query
if [ "x$USERDCID" == "x" ]; then
    RPCLOOKUPID=$(rpcclient -U $USER%$PASS -c "lookupnames $USER" $DC 2> ./rpc_errFile)

    USERDCID=$(echo "$RPCLOOKUPID" | grep -e '[0-9]\{4,9\} ' -o)
fi

QUERYUSER=$(rpcclient -U $USER%$PASS -c "queryuser $USERDCID" $DC 2> ./rpc_errFile)

EXPDATE=$(echo "$QUERYUSER" | grep 'Password must change Time' | grep -e '[a-Z]\{2\}, [0-9]\{2\} [a-Z]\{3\} [0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}' -o)

## Load rpc error Message
RPCERR=$(<./rpc_errFile)

## send notifications to Unity Desktop
if [ "x$RPCERR" != "x" ]; then
    notify-send -i /usr/share/icons/gnome/48x48/status/dialog-error.png "Error while fetching expiration date of your domain password" "$RPCERR"    
else
    notify-send -i /usr/share/icons/gnome/48x48/status/dialog-information.png "your domain password expires at " "$EXPDATE h"
fi

### END RPCCLIENT query

我在自动启动时将此脚本配置为 运行,我在 Unity 通知中显示我的域密码何时到期。请随意扩展、改进和重新发布此脚本,它是 public 域。

[/更新]

如果您使用的是 kerberos 票证,ADpassword 是一个简单的 python 应用程序,用于检查密码过期并要求用户更改它。

ADpassword in GitHub

在 linux 你可以使用 pdbedit

pdbedit -L -v -u <username>

然后查找行:密码必须更改