<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1678611822423757&amp;ev=PageView&amp;noscript=1">
Defrag This

| Read. Reflect. Reboot.

Évaluer les délais de redémarrage avec PowerShell

Dan Franciscus| October 30 2019

| IT insights, Sysadmin

measuring-reboot-time-with-powershell

Les environnements d'entreprise regroupent généralement différents systèmes d'exploitation Windows, ainsi que des ressources matérielles et logicielles variées. Habituellement, la gestion et la configuration des machines reposent sur une stratégie de groupe et le gestionnaire de configuration System Center Configuration Manager (SCCM), ou parfois sur d'autres méthodes plus modernes telles que Chef ou Puppet. Un temps de démarrage long est le symptôme d'un ordinateur Windows malsain.

Un matériel défaillant (des disques durs lents, par exemple) peut en être la cause. Ou peut-être s'agit-il d'une stratégie de groupe qui retarde le processus d'accès à l'écran de connexion. Dans cet article, je vous indiquerai comment utiliser PowerShell pour mesurer le nombre de secondes nécessaires à l'arrêt et au démarrage d'un ordinateur.

Commande Measure-RebootTime

Avant, les utilisateurs se plaignaient de notre parc d'ordinateurs. En effet, il fallait du temps à certaines machines pour démarrer (15 minutes parfois !). Du fait que ces machines ne sont pas utilisées à certaines heures ou certains jours, j'ai décidé de créer une fonction PowerShell pour réinitialiser un groupe d'ordinateurs et évaluer leur temps de démarrage. Ainsi j'ai créé la commande Measure-RebootTime qui inclut une fonction d'assistant Get-RebootTime.

Téléchargez le livre électronique (en anglais) - How to automate using  PowerShell

La fonction Get-RebootTime est très simple. J'ai utilisé la commande Measure pour déterminer le délai de démarrage via la commande Restart-Computer, tout en attendant que PowerShell (WMI) soit disponible pour les connexions à distance. J'ai également défini un délai d'expiration de 1 200 secondes. J'arrondis les secondes à deux décimales et l'intègre à une classe PSCustomObject.

$Time = Measure-Command {

    Restart-Computer -ComputerName $ComputerName -Wait -For powershell -Timeout 1200 -ErrorAction Stop

} | Select-Object -ExpandProperty TotalSeconds

$RoundedTime = [math]::Round($Time,2)

[PSCustomObject]@{

    ComputerName = $ComputerName

    Seconds = $RoundedTime

}

Après avoir créé Get-RebootTime, je me suis rendu compte que je voulais qu'elle s'applique simultanément à plusieurs ordinateurs ; j'ai donc ajouté Measure-RebootTime, qui utilise PoshRSJob pour analyser plusieurs machines dans chaque tâche. PoshRSJob, le populaire module de communauté PowerShell développé par Bo Prox, permet d'utiliser PowerShell pour gérer les espaces.

#requires -modules PoshRSJob

function Measure-RebootTime {

    [CmdletBinding()]

    param(

        [Parameter(Mandatory=$true)]

        [string[]]$ComputerName

    )

    $ComputerName | Start-RSJob -ScriptBlock {Get-RebootTime -ComputerName $_ } -Throttle 150 | Wait-RSJob | Get-RSJob | Receive-RSJob | Select-Object *

}

Tests

Dans cet exemple, je dispose de deux machines, Test-1 et Test-2, et je souhaite mesurer le délai en secondes nécessaire pour les démarrer. Il me suffit de les ajouter au paramètre -ComputerName dans la commande Measure-RebootTime.

C:\> Measure-RebootTime -ComputerName Test-1,Test-2




ComputerName Seconds

------------ -------

Test-1       51

Test-2       50




Comme nous pouvons voir, l'objet renvoyé comprend le nom de l'ordinateur, et le délai en secondes nécessaire pour redémarrer la machine et rendre le protocole WMI accessible sur le réseau. Bien entendu, il appartient à l'utilisateur de décider jusqu'à quel point le délai de redémarrage d'une machine est acceptable. Dans le cas présent, 50 secondes ont été nécessaires pour chaque machine.

Synthèse

Les commandes Measure-Command, Restart-Computer et Start-RSJob sont la véritable valeur ajoutée des fonctions PowerShell. L'utilisation conjointe de ces commandes permet d'exécuter cette tâche de manière efficace et simple, sans beaucoup de code ni complexité. J'ai intégré dans mes scripts les modules PowerShell et les modules de communauté, ce qui m'a permis de développer des fonctions beaucoup plus rapidement.

Topics: IT insights, Sysadmin

Leave a Reply

Your email address will not be published. Required fields are marked *

THIS POST WAS WRITTEN BY Dan Franciscus

Dan Franciscus is a systems engineer and VMware Certified Professional (VCP) specializing in VMware, PowerShell, and other Microsoft-based technologies. You can reach Dan at his blog (http://www.winsysblog.com/) or Twitter at @dan_franciscus.

Free Trials

Getting started has never been easier. Download a trial today.

Download Free Trials

Contact Us

Let us know how we can help you. Focus on what matters. 

Send us a note

Subscribe to our Blog

Let’s stay in touch! Register to receive our blog updates.