Скрипт исправления даты установки пароля пользователя в 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. Журнал выполнения скрипта отсылается двум администраторам. Вот так выглядит журнал:
    • –2
    • 5,7k
    • 6
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

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

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

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