Le redémarrage d’un appareil peut être une source de frustration pour les utilisateurs finaux. Ils sont bien conscients que cela va libérer de la mémoire vive et améliorer les performances de leur appareil, mais ils ne peuvent pas se résoudre à arracher le pansement.
C’est là que ce script entre en jeu.
L’exécution du script informera vos utilisateurs finaux que pour appliquer divers correctifs et mises à jour, ils doivent redémarrer leur appareil. Ils auront alors le choix de redémarrer leur appareil immédiatement, de reporter le redémarrage d’une heure ou de l’annuler complètement. S’ils ne font pas de choix, l’appareil redémarrera automatiquement dans 15 minutes, avec un compte à rebours pour leur indiquer le temps qu’il leur reste avant l’arrêt. Cela leur donne l’occasion de se préparer mentalement et de sauvegarder tous les fichiers importants.
Le script utilise des formulaires Windows pour afficher la notification, et le contenu est entièrement personnalisable. Vous pouvez ajouter le nom de votre entreprise, modifier le message et changer les options des boutons (si vous êtes d’humeur particulièrement malicieuse, vous pouvez même supprimer le bouton d’annulation). Vous pouvez également ajuster le délai de redémarrage automatique ou de report des mises à jour. Veillez simplement à ne pas laisser vos utilisateurs finaux tergiverser trop longtemps !
Le script :
Atera ne garantit pas l'intégrité, la disponibilité, la sécurité, l'absence de virus, la sûreté, la légalité, la non-violation, le statut des droits ou la fonctionnalité des scripts. L'utilisation des scripts partagés se fait à vos propres risques. Les scripts sont fournis "TEL QUEL".*
?[void][Reflection.Assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[void][Reflection.Assembly]::Load('System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[void][Reflection.Assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
function Main {
Param ([String]$Commandline)
if((Call-MainForm_psf) -eq 'OK')
{
}
$global:ExitCode = 0
}
function Call-MainForm_psf
{
[void][reflection.assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[void][reflection.assembly]::Load('System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[void][reflection.assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
[System.Windows.Forms.Application]::EnableVisualStyles()
$MainForm = New-Object 'System.Windows.Forms.Form'
$panel2 = New-Object 'System.Windows.Forms.Panel'
$ButtonCancel = New-Object 'System.Windows.Forms.Button'
$ButtonPostpone1Hour = New-Object 'System.Windows.Forms.Button'
$ButtonRestartNow = New-Object 'System.Windows.Forms.Button'
$panel1 = New-Object 'System.Windows.Forms.Panel'
$labelITSystemsMaintenance = New-Object 'System.Windows.Forms.Label'
$labelSecondsLeftToRestart = New-Object 'System.Windows.Forms.Label'
$labelTime = New-Object 'System.Windows.Forms.Label'
$labelInOrderToApplySecuri = New-Object 'System.Windows.Forms.Label'
$timerUpdate = New-Object 'System.Windows.Forms.Timer'
$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
$TotalTime = 900
$MainForm_Load={
$labelTime.Text = "{0:D2}" -f $TotalTime
$script:StartTime = (Get-Date).AddSeconds($TotalTime)
$timerUpdate.Start()
}
$timerUpdate_Tick={
[TimeSpan]$span = $script:StartTime - (Get-Date)
$hours = "{0:00}" -f $span.Hours
$mins = "{0:00}" -f $span.Minutes
$secs = "{0:00}" -f $span.Seconds
$labelTime.Text = "{0}:{1}:{2}" -f $hours, $mins, $secs
$timerUpdate.Start()
if ($span.TotalSeconds -le 0)
{
$timerUpdate.Stop()
Restart-Computer -Force
}
}
$ButtonRestartNow_Click = {
Restart-Computer -Force
}
$ButtonPostpone1Hour_Click={
shutdown -r -t 3600
$MainForm.Close()
}
$ButtonCancel_Click={
$MainForm.Close()
}
$labelITSystemsMaintenance_Click={
}
$panel2_Paint=[System.Windows.Forms.PaintEventHandler]{
}
$labelTime_Click={
}
$Form_StateCorrection_Load=
{
$MainForm.WindowState = $InitialFormWindowState
}
$Form_StoreValues_Closing=
{
}
$Form_Cleanup_FormClosed=
{
try
{
$ButtonCancel.remove_Click($buttonCancel_Click)
$ButtonPostpone1Hour.remove_Click($ButtonPostpone1Hour_Click)
$ButtonRestartNow.remove_Click($ButtonRestartNow_Click)
$panel2.remove_Paint($panel2_Paint)
$labelITSystemsMaintenance.remove_Click($labelITSystemsMaintenance_Click)
$labelTime.remove_Click($labelTime_Click)
$MainForm.remove_Load($MainForm_Load)
$timerUpdate.remove_Tick($timerUpdate_Tick)
$MainForm.remove_Load($Form_StateCorrection_Load)
$MainForm.remove_Closing($Form_StoreValues_Closing)
$MainForm.remove_FormClosed($Form_Cleanup_FormClosed)
}
catch [Exception]
{ }
}
$MainForm.SuspendLayout()
$panel2.SuspendLayout()
$panel1.SuspendLayout()
$MainForm.Controls.Add($panel2)
$MainForm.Controls.Add($panel1)
$MainForm.Controls.Add($labelSecondsLeftToRestart)
$MainForm.Controls.Add($labelTime)
$MainForm.Controls.Add($labelInOrderToApplySecuri)
$MainForm.AutoScaleDimensions = '6, 13'
$MainForm.AutoScaleMode = 'Font'
$MainForm.BackColor = 'White'
$MainForm.ClientSize = '373, 279'
$MainForm.MaximizeBox = $False
$MainForm.MinimizeBox = $False
$MainForm.Name = 'MainForm'
$MainForm.ShowIcon = $False
$MainForm.ShowInTaskbar = $False
$MainForm.StartPosition = 'CenterScreen'
$MainForm.Text = 'Your Company | IT Systems Maintenance'
$MainForm.TopMost = $True
$MainForm.add_Load($MainForm_Load)
$panel2.Controls.Add($ButtonCancel)
$panel2.Controls.Add($ButtonPostpone1Hour)
$panel2.Controls.Add($ButtonRestartNow)
$panel2.BackColor = 'ScrollBar'
$panel2.Location = '0, 205'
$panel2.Name = 'panel2'
$panel2.Size = '378, 80'
$panel2.TabIndex = 9
$panel2.add_Paint($panel2_Paint)
$ButtonCancel.Location = '250, 17'
$ButtonCancel.Name = 'ButtonCancel'
$ButtonCancel.Size = '77, 45'
$ButtonCancel.TabIndex = 7
$ButtonCancel.Text = 'Cancel'
$ButtonCancel.UseVisualStyleBackColor = $True
$ButtonCancel.add_Click($buttonCancel_Click)
$ButtonPostpone1Hour.Font = 'Microsoft Sans Serif, 8.25pt, style=Bold'
$ButtonPostpone1Hour.Location = '139, 17'
$ButtonPostpone1Hour.Name = 'ButtonPostpone1Hour'
$ButtonPostpone1Hour.Size = '105, 45'
$ButtonPostpone1Hour.TabIndex = 6
$ButtonPostpone1Hour.Text = 'Postpone for 1 Hour'
$ButtonPostpone1Hour.UseVisualStyleBackColor = $True
$ButtonPostpone1Hour.add_Click($ButtonPostpone1Hour_Click)
$ButtonRestartNow.Font = 'Microsoft Sans Serif, 8.25pt, style=Bold'
$ButtonRestartNow.ForeColor = 'DarkRed'
$ButtonRestartNow.Location = '42, 17'
$ButtonRestartNow.Name = 'ButtonRestartNow'
$ButtonRestartNow.Size = '91, 45'
$ButtonRestartNow.TabIndex = 0
$ButtonRestartNow.Text = 'Restart Now'
$ButtonRestartNow.UseVisualStyleBackColor = $True
$ButtonRestartNow.add_Click($ButtonRestartNow_Click)
$panel1.Controls.Add($labelITSystemsMaintenance)
$panel1.BackColor = '0, 114, 198'
$panel1.Location = '0, 0'
$panel1.Name = 'panel1'
$panel1.Size = '375, 67'
$panel1.TabIndex = 8
$labelITSystemsMaintenance.Font = 'Microsoft Sans Serif, 14.25pt'
$labelITSystemsMaintenance.ForeColor = 'White'
$labelITSystemsMaintenance.Location = '11, 18'
$labelITSystemsMaintenance.Name = 'labelITSystemsMaintenance'
$labelITSystemsMaintenance.Size = '269, 23'
$labelITSystemsMaintenance.TabIndex = 1
$labelITSystemsMaintenance.Text = 'Scheduled Maintenance'
$labelITSystemsMaintenance.TextAlign = 'MiddleLeft'
$labelITSystemsMaintenance.add_Click($labelITSystemsMaintenance_Click)
$labelSecondsLeftToRestart.AutoSize = $True
$labelSecondsLeftToRestart.Font = 'Microsoft Sans Serif, 9pt, style=Bold'
$labelSecondsLeftToRestart.Location = '87, 176'
$labelSecondsLeftToRestart.Name = 'labelSecondsLeftToRestart'
$labelSecondsLeftToRestart.Size = '155, 15'
$labelSecondsLeftToRestart.TabIndex = 5
$labelSecondsLeftToRestart.Text = 'Time left to restart :'
$labelTime.AutoSize = $True
$labelTime.Font = 'Microsoft Sans Serif, 9pt, style=Bold'
$labelTime.ForeColor = '192, 0, 0'
$labelTime.Location = '237, 176'
$labelTime.Name = 'labelTime'
$labelTime.Size = '43, 15'
$labelTime.TabIndex = 3
$labelTime.Text = '00:60'
$labelTime.TextAlign = 'MiddleCenter'
$labelTime.add_Click($labelTime_Click)
$labelInOrderToApplySecuri.Font = 'Microsoft Sans Serif, 9pt'
$labelInOrderToApplySecuri.Location = '12, 84'
$labelInOrderToApplySecuri.Name = 'labelInOrderToApplySecuri'
$labelInOrderToApplySecuri.Size = '350, 83'
$labelInOrderToApplySecuri.TabIndex = 2
$labelInOrderToApplySecuri.Text = 'In order to apply security patches and updates for your system, your computer must be restarted.
Please save all your files now to prevent data loss.'
$timerUpdate.add_Tick($timerUpdate_Tick)
$panel1.ResumeLayout()
$panel2.ResumeLayout()
$MainForm.ResumeLayout()
$InitialFormWindowState = $MainForm.WindowState
$MainForm.add_Load($Form_StateCorrection_Load)
$MainForm.add_FormClosed($Form_Cleanup_FormClosed)
$MainForm.add_Closing($Form_StoreValues_Closing)
return $MainForm.ShowDialog()
}
Main ($CommandLine)
Les données des programmes en cours seront-elles perdues lorsque l'appareil sera redémarré ?
Le choix de redémarrer immédiatement l’appareil peut entraîner une perte de données. Pour éviter cela, le message par défaut affiché à l’utilisateur final lors de l’exécution du script comprend un rappel de sauvegarder ses fichiers. Il est recommandé de conserver cette ligne dans le message affiché afin que les utilisateurs finaux soient conscients du risque de perte de données et puissent prendre des mesures pour l’éviter.
Les utilisateurs seront-ils avertis du redémarrage de l'appareil s'ils ont sélectionné l'option de report ?
Oui, les utilisateurs seront informés de l’heure exacte du redémarrage par un rappel de connexion à Windows affiché dans le coin inférieur droit de leur écran. Si le délai de report des mises à jour est modifié, cela sera reflété dans le dialogue de rappel. En outre, une fenêtre de rappel apparaîtra 10 minutes avant le redémarrage.
Une fois le redémarrage programmé, mon utilisateur final peut-il l'annuler ?
Si un utilisateur final est informé d’un redémarrage programmé mais souhaite l’annuler, il peut le faire en lançant la fenêtre d’exécution (CTRL+R) et en tapant “shutdown -a” suivi d’Entrée. Le redémarrage sera alors annulé.
Remarques techniques:
Le script est un fichier .ps1.
Pour modifier le délai de redémarrage automatique ou de report des mises à jour, vous pouvez mettre à jour le nombre de secondes dans les lignes 35 et 62 du script, respectivement. Le délai par défaut est fixé à 15 minutes, soit 900 secondes.
Explorez notre bibliothèque de scripts partagés
La plateforme de gestion informatique tout-en-un qui fera passer vos opérations informatiques au niveau supérieur !