Когда пользователь меняет свой пароль, обычно это происходит в течение дня. Это означает, что срок действия пароля, установленный на последнее изменение + 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}