Цикл сценария Powershell для повторного запроса пользователя каждый час или до тех пор, пока не будет достигнут лимит времени ожидания

#powershell #sccm #reboot

Вопрос:

Новичок

Я хотел бы использовать сценарий Powershell, аналогичный приведенному ниже примеру, чтобы предложить конечным пользователям всплывающее сообщение о том, что требуется перезагрузка, затем представить окно сообщения для перезагрузки сейчас или выбрать » нет » для задержки. Если выбрано «нет», я бы хотел, чтобы скрипт ждал час и запрашивал пользователя снова каждый час, пока не истечет время ожидания. Например, запускайте запросы в 7:00 утра по местному машинному времени, затем запрашивайте каждый час с возможностью перезагрузки сейчас, выбрав » да » или «отложить», выбрав » нет » до 1:00 по местному машинному времени. Затем пользователь перезагрузит машину через 10 минут. чтобы сэкономить на работе.

Я разверну это с помощью SCCM. Это будет проводиться раз в неделю.

Сценарий ex.

 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null
$TimeStart = Get-Date
$TimeEnd = $timeStart.addminutes(360)
Do
{
    $TimeNow = Get-Date
    if ($TimeNow -ge $TimeEnd)
    {
        
        Unregister-Event -SourceIdentifier click_event -ErrorAction SilentlyContinue
        Remove-Event click_event -ErrorAction SilentlyContinue
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
        Exit
    }
    else
    {
        $Balloon = new-object System.Windows.Forms.NotifyIcon
        $Balloon.Icon = [System.Drawing.SystemIcons]::Information
        $Balloon.BalloonTipText = "IT is requiring a reboot in order to maintain system stability supporting IT security measures. Please reboot at your earliest convenience."
        $Balloon.BalloonTipTitle = "Reboot Required"
        $Balloon.BalloonTipIcon = "Warning"
        $Balloon.Visible = $true;
        $Balloon.ShowBalloonTip(20000);
        $Balloon_MouseOver = [System.Windows.Forms.MouseEventHandler]{ $Balloon.ShowBalloonTip(20000) }
        $Balloon.add_MouseClick($Balloon_MouseOver)
        Unregister-Event -SourceIdentifier click_event -ErrorAction SilentlyContinue
        Register-ObjectEvent $Balloon BalloonTipClicked -sourceIdentifier click_event -Action {
            Add-Type -AssemblyName Microsoft.VisualBasic
            
            If ([Microsoft.VisualBasic.Interaction]::MsgBox('Would you like to reboot your machine now?', 'YesNo,MsgBoxSetForeground,Question', 'System Maintenance') -eq "NO")
            { }
            else
            {
                shutdown -r -f
            }
            
        } | Out-Null
        
        Wait-Event -timeout 3600 -sourceIdentifier click_event > $null
        Unregister-Event -SourceIdentifier click_event -ErrorAction SilentlyContinue
        $Balloon.Dispose()
    }

}
Until ($TimeNow -ge $TimeEnd)
 

Комментарии:

1. У вас есть хорошее представление о том, чего вы хотите достичь. Я бы сказал, идите вперед и сделайте это. StackOverflow станет местом, где вы сможете задавать вопросы, если застрянете в процессе. И люди здесь будут рады помочь, если вы покажете, что вы пробовали и как это не работает.

2. Я бы провел серьезный поиск, прежде чем вы потратите время на кодирование, хотя, судя по краткому поиску в Google, есть несколько способов сделать это с помощью доступного кода.

3. Почему бы вам просто не использовать SCCM для принудительного развертывания с указанием крайнего срока? Если требуется перезагрузка, она будет запрашивать пользователя так часто, пока не будет соблюден крайний срок.

4. Спасибо за ваши предложения. Да, есть несколько способов сделать это, но я не нашел ни одного из них с желаемыми результатами моих компаний. Этот сценарий отлично работает, позволяя пользователям откладывать, но в конце цикла Do он закрывается и не вызывает перезагрузку в $timeEnd. Поэтому мы хотим начать выдачу запросов в 07:00, разрешить им отложить до 13:00, запросить, что у вас не хватает времени, и принудительно завершить работу с минимальной задержкой. чтобы сэкономить на работе. Я могу развернуть сценарий с помощью SCCM для запуска раз в неделю.

Ответ №1:

Еще раз всем спасибо! Добавление этого оператора if до тех пор, пока не даст мне желаемый результат.

$timeNow = Дата получения, если ($timeNow-ge $timeEnd) { завершение работы-r-f-t 600-c «Вы достигли отведенного времени для задержки перезагрузки. Пожалуйста, сохраните свою работу и перезагрузитесь, иначе ваш компьютер автоматически перезагрузится через 10 минут».}

Благодаря этому сообщению https://www.itninja.com/blog/view/reboot-required-toast-notifications-for-windows-machines для оригинального сценария. Я просто изменил для достижения желаемых результатов.