Блог Бакшина Тараса

Powershell. Скрипт по смене пароля для локальных пользователей

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 в который передаем наш пароль.

Приятной работы!