Назад | Перейти на главную страницу

как я могу настроить активный каталог, чтобы срок действия паролей истекал в полночь?

Когда пользователь меняет свой пароль, обычно это происходит в течение дня. Это означает, что срок действия пароля, установленный на последнее изменение + n дней, приведет к тому, что срок действия пароля истечет в течение дня. Как я могу заставить пароли истечь в полночь того дня?

Я не верю, что это возможно без изменения вручную PwdLastSetв ADSI Edit, что я бы не рекомендовал делать.

Значение хранится с интервалами в 100 наносекунд с 12:00 1 января 1601 года. Однако единственные варианты редактирования атрибута - установить для него значение 0 (срок действия пароля истек, и пользователь должен сбросить его), или -1 (значение PwdLastSet изменяется на текущую дату / время).

Как упоминалось в комментариях, вам нужно будет установить значение на 0 сначала, затем установите его на -1.

Вы могли бы потенциально написать сценарий для обновления атрибута до -1 в полночь определенного дня для всех пользователей. Однако это приведет к тому, что срок действия всех ваших паролей пользователей истечет в полночь через N дней (N - это параметр максимального возраста политики паролей вашего домена). Это потенциально может увеличить максимальный срок действия пароля.

Какова ваша цель в настройке пароля, срок действия которого истекает в полночь?

Windows просто не поддерживает концепцию «срока действия пароля», которая применяется во всем мире. Вы также не можете установить время, кроме как сказать, что оно истекло, или что оно было только что изменено. Однако вы могли бы написать сценарий, используя инструменты командной строки AD или PowerShell, который запускается каждую ночь: он может запрашивать в AD пользователей с паролями, срок действия которых истекает менее чем за 24 часа (pwdLastSet старше, чем на один день, чем максимальный возраст вашего пароля. дней) и установите его на -1 (срок действия пароля истек). Это позволит избежать непреднамеренного продления срока действия пароля, а также избежать истечения срока действия пароля в полдень.

Существуют также сторонние инструменты, которые могут сделать это за вас. Например, одна функция Hitachi ID Password Manager позволяет вам открыть всплывающее окно веб-браузера, в котором пользователь должен изменить свой пароль или выйти из системы, и вы можете настроить это так, чтобы это происходило за произвольное количество дней до фактического истечения срока действия. .

Вы можете запускать сценарий каждый день в полночь, и если срок действия пароля истекает в течение следующего дня, вы принудительно устанавливаете его.

Немного проиллюстрировано там

Никогда не тестировал в VBS;

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

Или там для примера PowerShell:

# This PowerShell Script will query Active Directory and return the user accounts with passwords 
# set to expire before the end of the next day, export a list of the affected accounts, and require
# a password change at the next logon.  The script is configured to ingore accounts which have been
# configured with passwords that never expire, and to ignore accounts who do not have permission to
# change their own password.  Any other account would be affected, so be warned before running this
# script, as you could experience unintended consequences.  Either modify the script to reduce the
# scope of user accounts, or ensure that accounts that shouldn't be affected are either flaged with
# a non-expiring password or are flagged with "cannot change password.  When ready to run/schedule 
# in production, remove the -WhatIf from the last line.
#
# - MWT, 10/11/13

# The 89 is based upon your environment. If passwords expire every X (90) days, and you run the script
# in the early morning, you can set it to -1*(X-1) (-89), if you run the script late at night, set it to
# -1*(X-2) (-88).

Import-Module ActiveDirectory # Required for PowerShell 2.0 only

$a = (Get-Date).Date.AddDays(-89)

# The following line will build the variable based upon the noted criteria
$b = Get-ADUser -Property Name,SamAccountName,PasswordLastSet,CannotChangePassword,PasswordNeverExpires -Filter {(PasswordLastSet -lt $a) -and (PasswordNeverExpires -eq $false)} | Where-Object {$_.CannotChangePassword -eq $false}

# The following line will display/export the data logging the accounts to be changed; please note the
# Out-File path and change to suit your needs.
$b | Format-Table Name,PasswordLastSet,CannotChangePassword,PasswordNeverExpires -AutoSize | Out-File -FilePath C:\passwordchanges.txt

# The following line will actually flag the accounts to require a password change (after -WhatIf is removed)
$b.SamAccountName | ForEach-Object {Set-ADUser -Identity $_ -ChangePasswordAtLogon $true -WhatIf}