将密码过期时间安排到特定时间

将密码过期时间安排到特定时间

在 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

相关内容