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.
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.
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.