Скрипт исправления даты установки пароля пользователя в AD
Всем привет! Иногда возникает ситуация, когда надо пользователю изменить дату установки пароля в Active Directory. Представляю скрипт. Наверняка многим пригодится.set-ADUserPswDate.ps1# Основной скрипт изменения даты установки пароля по файлу или по учетной записи пользователя. # Автор Лужин Кирилл # luzhin.kirill@yandex.ru
Add-PSSnapin Quest.ActiveRoles.ADManagement;
$gsFilename = «c:\scriptps\set-ADUserPswDate.txt»; $giRows = (Get-Content -LiteralPath $gsFilename).Count; $giX = 0; $giMinimumSleep = 218; $giMaximumSleep = 884; $gtBeginDay = »08:00:00»; $gtEndDay = »19:00:00»; $today_date = Get-date -Format «dd.MM.yyyy»;
function set-password ($lsAccount) { Set-QADUser $lsAccount -ObjectAttributes @{pwdLastSet=0} | Out-Null; Set-QADUser $lsAccount -ObjectAttributes @{pwdLastSet=-1} | Out-Null; }
function get-password ($lsAccount) { get-qaduser $lsAccount -IncludedProperties pwdLastSet | % {$lsPwdLastSet = $_.pwdLastSet;} $lsPwdLastSet = $lsPwdLastSet.AddHours (3); $lsPwdLastSetNorm = get-date -uformat '%d.%m.%Y %R' -Date $lsPwdLastSet; return $lsPwdLastSetNorm; }
function send-eMail ($to,$toCc,$text=»,$subject=«Изменение даты установки пароля»,$toBcc=«admin3@domain.com») { write-host «Кому: $to | тема: $subject | текст: $text»; $Enc = [Text.Encoding]:: UTF8; Send-MailMessage -to $to -from «admin1@domain.com» -Bcc $toBcc -Cc $toCc -subject $subject -smtpServer MAIL-SRV -BodyAsHtml $text -Encoding $Enc; }
function get-sleepRandom ($liMinimum, $liMaximum) { $giSleep = Get-Random -minimum $liMinimum -maximum $liMaximum # $giSleep = 30; $giSleepS = $giSleep % 60; $giSleepM = $giSleep — $giSleepS; $giSleepM = $giSleepM / 60; $gdFuture = (Get-Date).AddSeconds ($giSleep); write-host «Ждем»$giSleepM» минут »$giSleepS» секунд (будет выполнен »$gdFuture»)…»; Start-Sleep -Seconds $giSleep }
function isAtWork ($ltBegin, $ltEnd) { $lbAtWork = $FALSE; $giDayOfWeek = (get-date).DayOfWeek.ToString ('d'); if (($giDayOfWeek -gt 0) -and ($giDayOfWeek -lt 6)) { $today_date_full = $today_date + » » + $ltBegin; $today_date_full2 = $today_date + » » + $ltEnd; write-host $today_date_full» — »$today_date_full2; $a=[datetime]:: parse ($today_date_full); $c=[datetime]:: parse ($today_date_full2); $b = get-date; if (($b -gt $a) -and ($b -lt $c)) { write-host $b». Время позже 8:00 и раньше 19:00, пользователь может поменять пароль!»; $lbAtWork = $TRUE; } else { write-host «Время раньше 8:00 или позже 19:00, пользователь не может поменять пароль.»; } } else { write-host «Сегодня выходной, пользователя нет на работе.»; } return $lbAtWork; }
function update-password_wReport ($lsAccount) { write-host » »; write-host »*»$lsAccount; $gbAtWork = isAtWork $gtBeginDay $gtEndDay; if ($gbAtWork) { $gsPwdLastSet = get-password $lsAccount; $lsText = » + $lsAccount + » + $gsPwdLastSet + »; set-password $lsAccount; $gsPwdLastSet = get-password $lsAccount; $lsText = $lsText + » + $gsPwdLastSet + »; } else { $lsText = » + $lsAccount + «Нет на работе»; } return $lsText; }
$gsText = $gsText + »; $gsText = $gsText + «Учетная запись»; $gsText = $gsText + «БылоСтало»;
if ($ARGS[0] -ne $Null) { $gsText = $gsText + (update-password_wReport $ARGS[0]); } else { Get-Content -LiteralPath $gsFilename | % { $gsText = $gsText + (update-password_wReport $_); $giX = $giX + 1; if ($giX -lt $giRows) { get-sleepRandom $giMinimumSleep $giMaximumSleep; } } } $gsText = $gsText + »; if ($ARGS[1] -ne $Null) { send-eMail $ARGS[1] «admin1@domain.com» $gsText; } else { send-eMail «admin1@domain.com» «admin2@domain.com» $gsText; } Под катом описание, использование и особенности. Читать дальше →