在 Windows Server 2003 或 2008 以及 Active Directory 中,是否有一种方法可以在策略中指定当用户密码当天过期时,让其在某个时间过期,比如说凌晨 4:00。
出现这个问题是因为密码过期时间是在工作日的中午,比如早上 9 点。然后当用户已经在网络中登录 Windows 并使用不同的应用程序时,这些应用程序会因为身份验证而开始出现错误行为。他们必须注销并重新登录,以便 Windows 要求输入新密码。
因此,如果他们在清晨登录时要求输入新密码,那么他们就不必在工作日重新注销。
一位 AD 管理员说:“让他们在一天开始之前检查一下密码是否会过期”..但实际上,谁会这样做呢?
我无法访问 AD 来检查这些类型的策略。那么,这可能吗?
答案1
据我所知这是不可能的。
可能会出现多个提醒通知,指出当前密码将在 N 天后过期,并提供更改密码的选项。如果用户选择忽略此提醒,那么他们很不幸地自掘坟墓。
答案2
我们也遇到了类似的问题。
我能想到的唯一方法是每晚运行一个脚本,该脚本将检查活动目录并确定哪个帐户将在第二天过期。如果是,则标记它以更改密码。代码看起来类似于以下内容;我还没有尝试运行这个脚本,所以可能需要稍微调整一下:
Const SEC_IN_DAY = 86400
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
Const ADS_SCOPE_SUBTREE = 1000
dim strname
dim strdist
dim dtmvalue
on error resume next
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = "SELECT distinguishedName, profilepath, name from 'LDAP://dc=Example,dc=com' where objectCategory = 'User'"
Set objuserRecordSet = objCommand.Execute
objUSerRecordSet.MoveFirst
Do Until objuserRecordSet.EOF
strdist = objuserRecordSet.Fields("distinguishedName").Value
strname = objuserRecordSet.Fields("name").Value
Set objUserLDAP = GetObject _
("LDAP://" & strdist)
intCurrentValue = objUserLDAP.Get("userAccountControl")
dtmValue = objUserLDAP.PasswordLastChanged
If intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then
x = "The password does not expire."
Else
Set objDomainNT = GetObject("WinNT://escc.gov.uk")
intMaxPwdAge = objDomainNT.Get("MaxPasswordAge")
If intMaxPwdAge < 0 Then
x = "Password does not expire"
Else
intMaxPwdAge=intMaxPwdAge/86400
strold = ((dtmValue + intMaxPwdAge)-now)
if strold < 2 and strold > 0 then
objUserLDAP.pwdLastSet = 0
objUserLDAP.SetInfo
end if
end if
End If
dtmValue= ""
objuserrecordset.movenext
Loop