Мне было поручено создать сценарий, который считывает в файле список идентификаторов пользователей Active Directory, а затем сбрасывает флаг для пароля никогда не истекает. Кроме того, мой офицер безопасности не хочет, чтобы у 500 пользователей, у которых есть этот параметр, сразу же был сброшен их пароль, поэтому он хотел, чтобы политика домена по умолчанию на 90 дней была назначена во время запуска сценария, поэтому пользователь попадает в обычную ротацию паролей.
Я пытался создать сценарий PowerShell для этого, и у меня возникли проблемы. По общему признанию, я не лучший в PowerShell, поэтому был бы признателен за ваш вклад.
Мне нужно сбросить флаг, но изменить PwdLastSet на -1 оказалось непросто. Я думаю, это может быть потому, что я не умею читать в файле и выполнять две команды «ForEach-Object» из файла. Кто-нибудь может посмотреть?
Import-CSV PasswordExpiry.csv | ForEach-Object {Set-ADUser -Identity $_.SamAccountName -PasswordNeverExpires:$false}
ForEach-Object {
$samaccountname = $_.SamAccountName
$today = Get-Date
$lastchange = [datetime]::FromFileTime($_.pwdlastset[0])
$timediff = New-TimeSpan $lastchange $(Get-Date)
$hoursdiff = $timediff.TotalHours
if ($hoursdiff -lt $hourschange_sincePwdChange) {
$todouser = Get-ADUser $samaccountname -Properties pwdLastSet
$todouser.pwdLastSet = 0
Set-ADUser -Instance $todouser
$todouser.pwdLastSet = -1
Set-ADUser -Instance $todouser
}
}
Я получаю несколько ошибок позиционного параметра, в которых говорится, что он не может принять аргумент $ null, но я не уверен, где я ошибаюсь.
AD не позволит вам изменить дату последнего сброса пароля, кроме 0 (что приведет к смене пароля при следующем входе в систему). Для этого вы не можете установить PwdLastSet вручную, вам нужно использовать что-то вроде следующего фрагмента:
Set-ADUser -Identity JoeBlow -ChangePasswordAtNextLogon $true
Сдавайтесь, потому что вы не можете (напрямую) изменить атрибут pwdLastSet пользователя. Этот атрибут может быть установлен только самой Системой (механизмом служб каталогов). (ERROR_DS_ATTRIBUTE_OWNED_BY_SAM)
Дополнительную информацию см. В документации Microsoft MS-ADTS.
Мне удалось добиться этого с помощью следующего:
Import-Module ActiveDirectory
$ADUserParams=@{
'Searchbase' = 'OU=Users,OU=Testing,OU=IT,OU=XXX,DC=XXX,DC=local'
'Filter' = '*'
'Properties' = 'cn','sn','givenname','displayName','mail','description','UserPrincipalName', 'employeeNumber', 'profilepath', 'title'
}
$ADUsers = Get-ADUser @ADUserParams
ForEach ($ADUser in $ADUsers) {
$ADUser = Get-ADUser $ADUser -properties pwdlastset
$ADUser.pwdlastset = 0
Set-ADUser -Instance $ADUser
$ADUser.pwdlastset = -1
Set-ADUser -instance $ADUser
}
Взято из Вот