Доброго времени суток уважаемые форумчане!
В нашей компании основная работа пользователей сосредоточена на терминальных серверах под управлением ОС «Windows Server 2019».
Думаю, Вы неоднократно сталкивались с ситуацией, когда пользователь «забывает» вовремя сменить свой доменный пароль и жалуется сразу руководству, что он не может работать…
Такие ситуации бывают по разным причинам: отсутствие для этого должных знаний, лень, здравый пофигизм etc.
В связи с чем, возникла необходимость за 5-7дней до окончания срока действия пароля доменного пользователя автоматически предлагать ему сменить пароль, как это описано тут:
«Когда истекает пароль пользователя в AD, оповещаем пользователей о необходимости сменить пароль»
https://winitpro.ru/index.php/2020/02/25/ad-user-password-expiration/
Для этого создал powershell-скрипт со следующим содержимым (приведу его для лучшей наглядности):
$curruser= Get-ADUser -Identity $env:username -Properties 'msDS-UserPasswordExpiryTimeComputed','PasswordNeverExpires'
if ( -not $curruser.'PasswordNeverExpires') {
$timediff=(new-timespan -start (get-date) -end ([datetime]::FromFileTime($curruser."msDS-UserPasswordExpiryTimeComputed"))).Days
if ($timediff -lt 5) {
$msgBoxInput = [System.Windows.MessageBox]::Show("Ваш пароль истекает через "+ $timediff + " дней!`nХотите сменить пароль сейчас?","Внимание!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
cmd /c "explorer shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}"
}
'No' { }
}
}
}
И тут столкнулся с проблемой: при выполнении указанного содержимого в «PowerShell ISE» все отрабатывает корректно без ошибок, но если запускаю сохраненный скрипт из оболочки «PowerShell» от обычного пользователя или через GPO, то появляется ошибка:
Не удалось найти тип [System.Windows.MessageBox].
C:\Users\имя_пользователя\Documents\ad_user_pass_expired.ps1:5 знак:16
+ $msgBoxInput = [System.Windows.MessageBox]::Show("Ваш пароль истекает ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Windows.MessageBox:TypeName) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound
Немного погуглив, народ рекомендует использовать такую строку:
Add-Type PresentationFramework
либо вот такую
Add-Type -AssemblyName System.Windows.Forms
Но только я не пойму куда именно в скрипте (после каких строк или команд) нужно подставлять одну из приведенных строк…
Сразу признаюсь, что я не силён в программировании «PowerShell», поэтому прошу Вас помочь мне разобраться в этой задаче!
Не много не потеме конечно... у нас в конторе win2k12r2. И тоже политика со сменой пароля. Только вот она из коробки начинает напоминать пользователю о смене пароля за пару дней. Точно сказать не могу за сколько. Ну и соответственно после оконочания срока действия пароля - юзер просто не может войти в систему не сменив пароль.
Я может чего-то не понимаю. Но зачем PS. Если можно штатными средствами.
В Windows есть отдельный параметр групповой политики, позволяющий оповещать пользователей о необходимости сменить пароль.
Политика называется Interactive logon: Prompt user to change password before expiration и находится в разделе GPO Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options.
По умолчанию эту политика включена на уровне локальных настроек Windows и уведомления начинают появляться за 5 дней до истечения срока действия пароля. Вы можете изменить количество дней, в течении которых должно появляться уведомление о смене пароля.
Проблема решена! Был немного невнимателен! Свой рабочий скрипт прикреплю сюда - может кому-то пригодится!