Пользователь
0,0
рейтинг
12 декабря 2013 в 15:34

Администрирование → Скрипт исправления даты установки пароля пользователя в 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. Журнал выполнения скрипта отсылается двум администраторам. Вот так выглядит журнал:
Лужин Кирилл @luzhin_kirill
карма
9,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (6)

  • +1
    Два вопроса:
    1) А зачем, простите? Ну то есть реальная польза от скрипта какая?

    2) А переписать на использование традиционных средств Power Shell по работа с AD?

    А вообще спасибо — полистал код, интересно?
    • 0
      Это четыре вопроса :)
  • 0
    реальная польза от скрипта какая?
    Установлено у пользователя в AD свойство «Пароль не устаревает» и надо это убрать. Флажок снимаем и учётка тут же истекает (и пользователь не может никуда попасть), ведь пароль установлен очень давно. А если таких пользователей человек 30 или больше, что делать?
  • 0
    так это «зло» — на тему установки галки «Пароль не устаревает»… Это только для техноучеток — да и в 2008r2 схеме — уже можно этим не пользоваться. Реально зло… Но в принципе, в живой среде, да еще и большой бывает все, согласен.

    Как насчет переписать не под quest software? думали??
  • 0
    Но в принципе, в живой среде, да еще и большой бывает все
    Так и есть.
    Как насчет переписать не под quest software? думали??
    Да, конечно, думали. Мысль такая есть.
  • 0
    Люди, минусуете, так пишите, за что.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.