Напоминание о смене пароля для Windows 7. VBS скрипт

Операционная система Windows 7 внесла немало изменений в работу не только пользователя, а и системного администратора. Например, напоминание о изменении пароля ненавязчивое, появляется в трее и исчезает само:

Если вспомнить Windows XP, то там ситуация была лучше: сообщение появлялось сразу после ввода пароля, предлагалось сменить пароль сейчас, загрузка не продолжалась до действия пользователя:

Чем же ситуация в Windows 7 хуже? Дело в том, что пользователь часто игнорирует всплывающую подсказку в трее, не замечает как его пароль просрочен (но компьютер, при этом, пускает пользователя без проблем), возникают проблемы с сетевой авторизацией.

Решение проблемы напоминания смены пароля в Windows 7

Официально, исправить ситуацию нельзя - Майкрософт не позаботилась о решении этой проблемы. Единственный выход - самописный скрипт. 

Его (скрипта) задача посчитать строк действия пароля и в случае приближения истечения срока действия пароля (порог задается) выводить окно напоминания. Вариант подобного скрипта мне посоветовали на форуме. Он полностью отвечал требованиям, я добавил только проверку версии ОС, чтобы отрабатывалось исключительно на Windows 7.

 

strComputer = "."
REM ========================================
REM Проверка версии операционной системы.
REM Если Windows 7, то действуем дальше
REM ========================================
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
Select Case Left(objOperatingSystem.Caption,19)
Case "Microsoft Windows 7"

REM ========================================
REM Доменные политики и количество дней
REM ========================================
Dim oDomain
Dim oUser
Dim maxPwdAge
Dim numDays
Dim warningDays
warningDays = 15 ' порог срабатывания уведомления

Set LoginInfo = CreateObject("ADSystemInfo") 
Set objUser = GetObject("LDAP://" & LoginInfo.UserName & "") 

strDomainDN = UCase(LoginInfo.DomainDNSName) 
strUserDN = LoginInfo.UserName

Set oDomain = GetObject("LDAP://" & strDomainDN)
Set maxPwdAge = oDomain.Get("maxPwdAge")

REM ========================================
REM Считаем сколько дней осталось
REM ========================================
numDays = CCur((maxPwdAge.HighPart * 2 ^ 32) + _
maxPwdAge.LowPart) / CCur(-864000000000)
REM WScript.Echo "Maximum Password Age: " & numDays ' это для дэбага

REM ========================================
REM Определяем когда менялся пароль
REM ========================================
Set oUser = GetObject("LDAP://" & strUserDN)
whenPasswordExpires = DateAdd("d", numDays, oUser.PasswordLastChanged)
fromDate = Date
daysLeft = DateDiff("d",fromDate,whenPasswordExpires)

REM WScript.Echo "Password Last Changed: " & oUser.PasswordLastChanged
if (daysLeft < warningDays) and (daysLeft > -1) then
Msgbox "Число дней до истечения срока действия пароля: " & daysLeft & "." & chr(13) & "Пароль действительный до " & whenPasswordExpires & chr(13) & chr(13) & "Чтобы изменить пароль, нажмите клавиши " & chr(13) & "CTRL+ALT+DEL и выберите 'Сменить пароль...'", 0, "Рекомендуется изменить ваш пароль"
End if

REM ========================================
REM Конец проверки версии ОС
REM ========================================
End Select
Next
REM ========================================
REM Зачистка
REM ========================================
Set oUser = Nothing
Set maxPwdAge = Nothing
Set oDomain = Nothing

 

Запускать скрипт груповой политикой (логон-скрипт). Результат работы такой:

39 коментарів

by Антон on Пн, 08/06/2012 - 11:56

Есть еще один выход - специализированное ПО, предназначенной для этих целей оповещения пользователей - например, NetWrix Password Expiration Notifier. Причем есть как бесплатная базовая версия (уведомление пользователей о том, что пароль необходимо сменить), так и с полная с расширенными возможностями (настройка оповещений, фильтрация, оповещения по SMS). 

by www_tank on Втр, 03/05/2013 - 10:21

редкой красоты скрипт! не пришлось ничего дорабатывать напильником. Спасибо!

by rublin on Втр, 03/05/2013 - 14:29

Спасибо, старался

by Николай on Птн, 08/23/2013 - 13:53

У меня не работаетDC  Win2008R2Скрипт запускается через bat файлик.  

by rublin on Птн, 08/23/2013 - 16:41

Если на клиенте запустить скрипт (vbs), что пишет? Ошибки выдает?

by Олег on Пн, 01/06/2014 - 13:53

Как допилить под Win 2008R2?

by rublin on Срд, 01/08/2014 - 09:42

Я так думаю, нужно в секции

REM ========================================
REM Проверка версии операционной системы.
REM Если Windows 7, то действуем дальше
REM ========================================
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
Select Case Left(objOperatingSystem.Caption,19)
Case "Microsoft Windows 7"

изменить версию "Microsoft Windows 7" на нужную.

by DjamBo on Птн, 04/04/2014 - 05:58

Я не силен в автозапуске скриптов, подскажите, как его запустить на win server 2008  r2 ?

by rublin on Птн, 04/04/2014 - 16:39

Task Scheduler (Назначенные задания).

Нужно прописать:

cscript <путь к скрипту>

 

by DjamBo on Пн, 04/07/2014 - 11:12

А разве не через групповые политики его нужно запускать?

by rublin on Пн, 04/07/2014 - 11:19

Да, протупил.

Через групповые политики скрипт нужно добавлять так (User Configuration - Policies - Windows Settings - Scripts - Logon):

 

by DjamBo on Пн, 04/07/2014 - 11:22

Спасибо, получилось.

by Dima on Пн, 04/07/2014 - 13:31

Здравствуйте, попробовал запустить скрипт на win 2012 r2 . Мои действия: сохранил вышеуказанный скрипт в формате .ps1. В групповых политиках, как указано на скриншоте сверху, добавить powershell скрипт. Применил политику, при входе в систему уведомление о смене пароля не меняется, подскажите, может не то делаю?

by rublin on Пн, 04/07/2014 - 16:05

Приветствую.

Во-первых, скрипт VBS. Поэтому нужно сохранять в формате .vbs

Во-вторых, скрипт написан для Windows 7. Поэтому нужно исправить под нужную версию ОС (выше в комментариях об этом писал).

 

by Dima on Пн, 04/07/2014 - 18:24

Изменил расширение скрипта на .vbs. Изменил версию Windows на Windows Server 2012 R2 Standart.Скрипт все равно не вылоняется. Думаю, что что-то делаю не так)

by rublin on Втр, 04/08/2014 - 08:50

Если запустить скрипт руками что-то происходит?

by Dima on Втр, 04/08/2014 - 09:48

Да, я разобрался) Поместил скрипт в расшаренную папку, в скрипте оставил все как у вас. ДОбавил скрипт в групповые политики, теперь при входе пользователя под windows 7 у него появляется это уведомление. Но есть маленькая проблемка, когда срабатывает скрипт то в нем написано, что осталось 6 дней, а стандартное уведомление говорит, что 5. Не знаете в чем может быть проблема?

by rublin on Втр, 04/08/2014 - 10:02

Рад что все получилось. Почему говорит 6 а не 5 дней - тут, скорее всего, виновата математика и округление. Смотреть эту часть скрипта:

REM ========================================
REM Считаем сколько дней осталось
REM ========================================
numDays = CCur((maxPwdAge.HighPart * 2 ^ 32) + _
maxPwdAge.LowPart) / CCur(-864000000000)

Или забить )))

by Dima on Втр, 04/08/2014 - 10:32

Вариант забить меня полностью устраивает) Ибо пользователи раньше ведь не замечали дефолтного уведомления,как раз поэтому я и занялся поиском решения проблемы.Спасибо еще раз)

by Dima on Втр, 04/08/2014 - 13:24

А вообще чисто для интереса попробовал, и вдруг кому понадобиться. Чтобы правильное время появлялось заменил в строчке  maxPwdAge.LowPart) / CCur(-864000000000), цифру 4 на 5. Теперь дата определяется корректно

by Макс on Пн, 04/28/2014 - 16:37

Приветствую!У меня Win2008R2Ent и Win2012, через групповые политики не запускается, локально пробую сам скрипт запустить, поправленный под 2008 и 2012 соответственно, ничего не происходит( ни ошибок, ничего..

by rublin on Пн, 04/28/2014 - 17:22

Привет.

Скрипт выдает уведомление только если пароль истекает раньше, чем установленный порог. Если ваш пароль не истекает - уведомлений не будет. Попробуйте раскоментить строку:

REM WScript.Echo "Maximum Password Age: " & numDays ' это для дэбага

 

by Макс on Втр, 04/29/2014 - 09:27

Да на 7 отрабатывает..А на серверных, может приведете как правильно писать? Пробовал "Microsoft Windows Server 2008 R2 Enterprise" собсно такая система и есть..есть еще 2012 Datacenter.. На них упорно не хочет. И включенный дебаг ничего не показывает

by rublin on Втр, 04/29/2014 - 10:12

Ну, по большому счету, можно исключить проверку версии ОС вообще - и скрипт будет отрабатывать на всех версиях.

by Макс on Втр, 04/29/2014 - 10:26

Убираем вот это?REM ========================================REM Проверка версии операционной системы.REM Если Windows 7, то действуем дальшеREM ========================================Set objWMIService = GetObject("winmgmts:" _    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")Set colOperatingSystems = objWMIService.ExecQuery _    ("Select * from Win32_OperatingSystem")For Each objOperatingSystem in colOperatingSystemsSelect Case Left(objOperatingSystem.Caption,19)Case "Microsoft Windows 7"

by rublin on Втр, 04/29/2014 - 10:29

Да. Там еще в конце что-то.

REM ========================================
REM Конец проверки версии ОС
REM ========================================
End Select
Next

Это, кажется. Запуск подскажет ;)

by Макс on Втр, 04/29/2014 - 10:48

Ееееес!!!!Без проверки действительно сработало отлично!)Спасибо огромнейшее!!! Респекты в карму просто нереальные Вам!)

by Макс on Втр, 04/29/2014 - 10:55

Рано обрадовался...на 2008 отработал, а на 2012 не хочет. Принудительно запустил - показывает. а при входе в систему окошка нет..Мож в 2012 гпо где секрет есть? или пните куда глядеть...

by rublin on Втр, 04/29/2014 - 14:31

Нет никакой разницы при запуске руками и групповыми политиками. Если сприпт отрабатывает, значит и в групповых политиках будет. Если при входе в систему окошка нет - смотреть логон скрипт в групповых политиках.

by Макс on Втр, 04/29/2014 - 15:08

Да смотрел rsop там показывает что политика отрабатывает, та же политика под тем же юзером на 2008 отрабатывает на ура. на 2012 что заметил окошко появляется, но спустя несколько минут) вот и не знаю даже куда копать)))Проверка зато убралась, это радует)

by obnix on Срд, 05/07/2014 - 09:17

Запускаю на w7 x64. При запуске ошибка:строка 36символ 1ошибка: Переполнение: "ccur"Что это может быть?

by Johnd556 on Втр, 07/08/2014 - 08:07

I like the valuable info you provide in your articles. I will bookmark your blog and check again here regularly. I am quite certain I'll learn a lot of new stuff right here! Best of luck for the next! cafeefdebabc

by Шаталов on Пн, 08/25/2014 - 14:19

А как быть с компами, где стоит галка Срок действия пароля не ограничен?п.с. Уведомление о смене пароля также появляется. Отсчет времени, я так понимаю, начинается с момента запуска скрипта.

by Шаталов on Пн, 08/25/2014 - 14:21

с учетной записью юзеров*

by diego on Птн, 09/26/2014 - 14:11

у меня не работает скрипт на 2008 r2Отключил блок проверки ОСзапускаю выходит ошибка:Сопоставление между именами пользователей и идентификаторами безопасности не было произведено.в чем проблема?

by alex on Чтв, 10/02/2014 - 10:42

скрипт не работает на 2012 . Отключил блок проверки ОС. Скрипт запускаю и ничего не происходит.

by alex on Чтв, 10/02/2014 - 17:31

вот работающий скрипт для 2008/2012 http://paste.org.ru/?20nkn6

by andrew_l on Пн, 09/26/2016 - 09:36

А зачем проверку сократили? Было: if (daysLeft < warningDays) and (daysLeft > -1) then Стало: if (daysLeft < warningDays) then

by Сергей on Втр, 10/11/2016 - 21:15

Вот то же самое но записанное в 6 (!) строчек. Еще и с проверкой на случай если юзер имеет бессрочный пароль (галочка "password never expire" в AD). Проверки версии ОС нет, т.к. от XP в домене уже давно пора отказаться (да и не в домене тоже).
Скрипт сохранять в файле с расширением .vbs

===============
WarningDays = 10 'За сколько дней будет выводиться сообщение (порог срабатывания)

Set oLoginInfo = CreateObject("ADSystemInfo") 'Получаем информацию о текущем окружении

Set oUser = GetObject("LDAP://" & oLoginInfo.UserName) 'Получаем информацию о юзере

WhenPasswordExpires = oUser.PasswordExpirationDate 'Получаем дату и время истечения пароля

DaysLeft = DateDiff("d",Date,WhenPasswordExpires) 'Вычисляем сколько дней осталось (по разнице между текущей датой и датой истечения)

'Выводим сообщение если удовлетворяет порогу срабатывания и если пароль пользователя не бессрочный
if (DaysLeft =< WarningDays) and (WhenPasswordExpires <> "01.01.1970") then Msgbox "Число дней до истечения срока действия пароля: " & daysLeft & chr(13) & "Пароль действителен до " & WhenPasswordExpires & chr(13) & chr(13) & "Чтобы изменить пароль, нажмите клавиши" & chr(13) & "Ctrl+Alt+Del и выберите 'Сменить пароль...'." & chr(13) & chr(13) & "Не откладывайте смену пароля на последний день!!!", 0, "Рекомендуется изменить ваш пароль!"

Post new comment

Filtered HTML

  • Адреси сторінок і електронної пошти атоматично перетворюються у посилання.
  • Дозволені теги HTML: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Рядки та параграфи відокремлюються автоматично.

Plain text

  • HTML теґи не відображаються
  • Рядки та параграфи відокремлюються автоматично.
By submitting this form, you accept the Mollom privacy policy.
© rublin.org, 2009 - 2015 Буду вдячний за зворотнє посилання, при використанні матеріалів сайту. Powered by Rublin Team.