В этой статье мы рассмотрим, как изменить (сбросить) пароль одного или сразу нескольких пользователей Active Directory из командной строки PowerShell с помощью командлета Set-ADAccountPassword.
Большинство администраторов привыкли выполнять смену (сброс) паролей пользователей в AD через графическую оснастку dsa.msc (Active Directory Users & Computers — ADUC). Для этого нужно найти учетную запись пользователя в AD щелкнуть по нему правой кнопкой и выбрать пункт «Смена пароля» (Reset password). Это простой и понятный способ.
Но вам не удастся использовать консоль ADUC, когда необходимо сбросить пароль сразу множеству пользователей, использовать процедуру сброса пароля в качестве одного из действий скрипта. В этом случае можно сбросить пароли в AD из командной строки PowerShell.
Как сбросить пароль пользователю в AD?
Для сброса пароля пользователя в AD используется командлет Set-ADAccountPassword, входящий в модуль Active Directory для Windows PowerShell (в десктопых версиях Windows он входит в состав RSAT, а в серверных редакциях устанавливается в виде отдельного компонента AD DS Snap-Ins and Command-Line Tools). Перед использованием модуля его необходимо импортировать в сессию PowerShell:
Import-module ActiveDirectory
Для сброса пароля ваша учетной запись должна обладать соответствующими правами. Естественно, обычные пользователи AD по-умолчанию не могут сбросить пароль других аккаунтов, чтобы эта возможность появилась, пользователю (группе пользователей) нужно делегировать право на сброс пароля на контейнер AD, либо добавить его в доменную группу Account Operators.
Чтобы проверить, что у вашей учетной записи есть право на сброс пароля определенного пользователя, откройте его свойства, перейдите на вкладку Security -> Advanced -> Effective Access -> укажите имя своей учетной записи -> убедитесь, что у вас есть разрешение Reset Password.
Чтобы сбросить пароль для пользователя с учетной записью dakimov и установить новый пароль SuperStr0n@p1, выполните команду:
Set-ADAccountPassword dakimov -Reset -NewPassword (ConvertTo-SecureString -AsPlainText “SuperStr0n@p1” -Force -Verbose) –PassThru
По умолчанию командлет возвращает объект и ничего не отображает в консоли. Чтобы вывести информацию об объекте пользователя в AD мы используем параметр –PassThru.
В качестве имени пользователя можно указать sAMAccountName (как в нашем случае), objectGUID, SID пользователя, или его DN (Distinguished Name, например CN=Akimov,OU-Users,DC=winitpro,DC=ru).
Если при смене пароля пользователя не указывать параметр –Reset, необходимо указать старый и новый пароль учетной записи.
Set-ADAccountPassword : The password does not meet the length, complexity, or history requirement of the domain.
Это означает что к указанному паролю применяются некоторые требования сложности, длины и т.д., определенные в доменной политике паролей или гранулированной политике паролей, действующей на учетку.
Если у вас включено ведение истории PowerShell команд, и вы не хотите, чтобы пароли в открытом виде отображались в консоли PoSh, пароль как и при создании пользователя нужно преобразовать в безопасную строку (подробнее о защите паролей в скриптах PowerShell здесь):
$NewPasswd=Read-Host "Введите новый пароль пользователя" –AsSecureString
Теперь сбросим пароль:
Set-ADAccountPassword dakimov -Reset –NewPassword $NewPasswd –PassThru
При сбросе пароля можно принудительно снять блокировку ученой записи, даже если она заблокирована (как найти с какого компьютера блокируется учетная запись, смотрите в статье Поиск источника блокировки пользователя в Active Directory):
Unlock-ADAccount –Identity dakimov
Чтобы пользователь при следующем входе в домен сменил данный пароль на новый, нужно изменить его свойства в AD, выполнив команду:
Set-ADUser -Identity dakimov -ChangePasswordAtLogon $true
Вы можете совместить в одной строке команду смены пароля и включение требования сменить пароль (атрибут userAccountControl):
Set-ADAccountPassword dakimov -NewPassword $NewPasswd -Reset -PassThru | Set-ADuser -ChangePasswordAtLogon $True
С помощью командлета Get-ADUser вы можете убедиться, что пароль сброшен успешно, выведя время последней смены пароля аккаунта:
Get-ADUser dakimov -Properties * | select name, pass*
При сбросе пароля на контроллере домена (DC) регистрируется событие EventID 4724. Это событие помогает определить учетную запись, которая выполнила сброс пароля пользователя.
Изменить пароль нескольких пользователей в AD
Выше мы показали, как из PowerShell сбросить пароль одного пользователя в AD. Рассмотрим теперь другой сценарий – когда вам нужно сменить пароли сразу нескольких пользователей.
Самый простой случай – вам нужно сбросить пароли всех пользователей с определенными свойствами учеток. Например, нужно заставить сбросить пароль всем сотрудникам департамента Sales на одинаковый и заставить его сменить при следующем входе:
get-aduser -filter "department -eq 'Sales Dept' -AND enabled -eq 'True'" | Set-ADAccountPassword -NewPassword $NewPasswd -Reset -PassThru | Set-ADuser -ChangePasswordAtLogon $True
Рассмотрим другой случай. Допустим, у вас имеется CSV / Excel файл, в котором содержится список пользователей, которым нужно сбросить пароли и уникальный пароль для каждого пользователя. Формат файла users.csv:
sAMAccountName;NewPassword
aivanov;PaSSde0r1
bpetrov;New$isde01
ssidorov;k@nndj!223
С помощью следующего PowerShell скрипта можно сбросить пароль для каждой учетной записи из файла:
Import-Csv users.csv -Delimiter ";" | Foreach {
$NewPass = ConvertTo-SecureString -AsPlainText $_.NewPassword -Force
Set-ADAccountPassword -Identity $_.sAMAccountName -NewPassword $NewPass -Reset -PassThru | Set-ADUser -ChangePasswordAtLogon $false
}
После выполнения даннго кода всем пользователям в файле будет установлен новый уникальный пароль.
Можно ли изменить пароль учетной записи компьютера (не сбросить, а установить свой)?
Не совсем понимаю зачем это вам нужно, но думаю поможет такой VBS скрипт
Dim objComputer
Set objComputer = GetObject("LDAP://CN=computername,DC=domain,DC=COM")
objComputer.SetPassword "computername$"
Wscript.Quit
_https://support.microsoft.com/en-us/help/216393/resetting-computer-accounts-in-windows
Помогите пожалуйста, не могу отфильтровать смену паролей пользователей по OU,.пробую с
Get-ADUser -SearchBase «OU=Moscow,DC=domain,DC=local» не выходит
Не понял точно, что вам нужно. Предполагаю, что нужно вывести аккаунты, отсортированные по дате смены пароля. Попробуйте такой PoSh код:
Get-ADUser -filter * -SearchBase "OU=MSK,DC=domain,DC=loc" -properties *| select sAMAccountName, PasswordLastSet| sort PasswordLastSet -Descending
Нет, все намного проще, нужно сменить пароли всех пользователей на одинаковые в определенной OU
Вот так попробуйте:
Get-ADUser -filter * -SearchBase "OU=MSK,DC=domain,DC=loc" | Set-ADAccountPassword -Reset -NewPasword (Read-Host -Prompt "Новый пароль" -AsSecureString)
Set-ADAccountPassword : Не удается найти параметр, соответствующий имени параметра «NewPasword».
Get-ADUser -filter * -SearchBase «CN=*,OU=*,OU=St44,DC=*,DC=*» | Set-ADAccountPassword -Reset -NewPassword (ConvertTo-SecureString -AsPlainText -String ‘*****’ -force) –PassThru — вот это сработало. ‘*****’ — не кавычки, а апостроф.
Спасибо тебе winItpro !
Get-ADUser -filter {passwordexpired -eq $True} | Set-ADAccountPassword -NewPassword $623326 -Reset -PassThru | Set-ADuser -ChangePasswordAtLogon $True
Подскажи где я ошибся? фильтрую по пользователям у которых срок действия истек и хочу Установить при входе им пароль 623326 и заставить их сменить его при входе
Почему то фильтр
{passwordexpired -eq $True}
работает некорректно (хотяpasswordexpired -eq $False
— ок), наверно лучше заменить на:$623326 = "newpass123"
Get-Aduser -Properties * | where {$_.PasswordExpired -eq $true}| Set-ADAccountPassword -NewPassword $623326 -Reset -PassThru | Set-ADuser -ChangePasswordAtLogon $True