Powershell. Смена пароля для локальных пользователей.
Сразу замечу что скрипт по смене пароля для локальных пользователей нужно запускать от имени локального администратора, или соответствующих групп, которые могут изменять пароль к учетным записям.
$Password = "$MyPa$w0rd" $users = Get-WmiObject -Class Win32_UserAccount -ComputerName $env:COMPUTERNAME -Filter LocalAccount='true' | select -ExpandProperty name foreach ($user in $users) { $user ([adsi]"WinNT://$env:COMPUTERNAME/$user").SetPassword("$Password") }
Теперь давайте разберем по строкам
$Password = '$MyPa$w0rd'
– объявляем переменную $Password, где будет указываться пароль, который установится пользователям после выполнения скрипта.
Сразу замечу что пароль взят в одинарные кавычки ” ‘ ” хотя можно и ставить в двойные, НО если указать в двойных кавычках, то к примеру, если будет в строке пароля символ $ то powershell будет принимать его как оглашение переменной. Одинарными кавычками мы указываем для powershell что все что в них заключено – это текст и соответственно вот такой пароль ‘$MyPa$w0rd’ в одинарных кавычках будет как принят powershell как текст $MyPa$w0rd, а если взят в двойные, то powershell будет понимать, что в переменной $Password содержатся две переменные $MyPa и $w0rd что конечно нам не нужно.
Другими словами на примере
1.
$Password = '$MyPa$w0rd'
– будет соответствовать тексту $MyPa$w0rd
2.
$Password = "$MyPa$w0rd"
– пароль будет пустой, так как мы не объявили две переменных $MyPa и $w0rd. Если бы мы объявили эти переменные скажем вот так $MyPa = “Новый” и переменную $w0rd= ” Пароль” тогда был бы “Новый Пароль”.
$users = Get-WmiObject -Class Win32_UserAccount -ComputerName $env:COMPUTERNAME -Filter LocalAccount='true' | select -ExpandProperty name
– создаем переменную в которую помещаем выполнение команды
Разбираем по строкам:
Get-WmiObject -Class Win32_UserAccount
– выбираем всех пользователей. Нужно быть ОСТОРОЖНЫМ при запуске в домене с большим количеством пользователей – команда может выполняться очень ДОЛГО.
-ComputerName $env:COMPUTERNAME
– Указываем компьютер с какого будем брать пользователя. $env:COMPUTERNAME – это переменная которая содержит имя ПК на котором запускается эта команда.
-Filter LocalAccount='true'
– Указываю что хочу взять пользователей только с локального ПК (если не указать это в команда. е то этот скрипт будет брать пользователей и из Actove Directory что будет делаться ДОЛГО).
select -ExpandProperty name
– Передаю данные которые получил от команды
Get-WmiObject -Class Win32_UserAccount -ComputerName $env:COMPUTERNAME -Filter LocalAccount='true'
и отбираю только значения свойства name.
foreach ($user in $users) { $user ([adsi]"WinNT://$env:COMPUTERNAME/$user").SetPassword("$Password") }
Об foreach будет отдельная статья. По сути я прохожусь по одному элементу в массиве элементов которые лежат в переменной $users.
([adsi]"WinNT://$env:COMPUTERNAME/$user").SetPassword("$Password")
Об [adsi] описывать не буду – почитаете вот здесь. Скажу только, что из полученных свойств мы вызываем метод SetPassword в который передаем наш пароль.
Приятной работы!