Скрипт исправления даты установки пароля пользователя в 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 = "<tr><td style='border:1px solid RGB(200,200,200);'><strong>" + $lsAccount + "</strong></td><td style='border:1px solid RGB(200,200,200);'>" + $gsPwdLastSet + "</td>"; 		set-password $lsAccount; 		$gsPwdLastSet = get-password $lsAccount; 		$lsText = $lsText + "<td style='border:1px solid RGB(200,200,200);'>" + $gsPwdLastSet + "</td></tr>"; 	} else { 		$lsText = "<tr><td style='border:1px solid RGB(200,200,200);'><strong>" + $lsAccount + "</strong></td><td style='border:1px solid RGB(200,200,200);'>Нет на работе</td><td style='border:1px solid RGB(200,200,200);'></td></tr>"; 	} 	return $lsText; }  $gsText = $gsText + "<table style='border-collapse:collapse; width:500px; font-family:Tahoma,Arial,Calibri;font-size:10pt;'>"; $gsText = $gsText + "<tr><td style='width:40%; border:1px solid RGB(200,200,200); text-align:center;'>Учетная запись</td>"; $gsText = $gsText + "<td style='width:130px; border:1px solid RGB(200,200,200); text-align:center;'>Было</td><td style='width:130px; border:1px solid RGB(200,200,200); text-align:center;'>Стало</td></tr>";  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 + "</table>"; if ($ARGS[1] -ne $Null) { 	send-eMail $ARGS[1] "admin1@domain.com" $gsText; } else { 	send-eMail "admin1@domain.com" "admin2@domain.com" $gsText; }

Под катом описание, использование и особенности.

Для начала надо установить ActiveRoles Management Shell for Active Directory.
Скрипт может принимать в качестве параметра учётную запись, дату изменения пароля которой надо сбросить. Без параметров скрипт отрабатывает по файлу «c:\scriptps\set-ADUserPswDate.txt» (прописан в скрипте). В файле каждая учётная запись пишется с новой строки.
Особенности работы скрипта:
1. Задать дату установки пароля нельзя, можно только обнулить и установить текущую дату. Особенности работы Active Directory.
2. Если скрипт отрабатывает по файлу (то есть по списку пользователей), то пароли сбрасываются не одномоментно всем, а со случайным перерывом между пользователями. Возможная длительность перерыва от 218 до 884 секунд.
3. Пароль не сбрасывается до 8:00 и позже 19:00 и в выходные.
4. Журнал выполнения скрипта отсылается двум администраторам. Вот так выглядит журнал:

ссылка на оригинал статьи http://habrahabr.ru/post/205696/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *