22 déc. 2010

[snippet] Eteindre des PC en masse

Vous avez un grand parc informatique à gérer, mais les utilisateurs ne prennent pas l'habitude d'éteindre leur machine en parant le soir. La solution est de mettre une tâche planifiée avec un shutdown /s. Mais si on veut être plus flexible, par exemple changer l'heure d'extinction, il faut rassembler les machines en un batch qui va lancer l'ordre shutdown à distance. Le problème d'un tel script, c'est qu'il peut durer des heures pour quelques machines. En effet, un shutdown /m machine peut prendre un certain temps, surtout si la machine est déjà éteinte.
La solution, pinguer la machine avant de lancer l'ordre, si elle ne répond pas, alors on ne lance pas l'ordre.

Voici un petit script powershell qui fait ça très bien :
 
echo "Synthaxe: script.ps1 `"Reseau`" `"Plage1[;Plage2;Plage3...]`" IP_min IP_max"
echo "Exemple: shutdown.ps1 "172.16" `"100;101;102`" 1 24"
echo "Exemple: shutdown.ps1 "192.168" `"1`" 1 255"

if($args.Length -lt 4) {
    echo "Erreur de synthaxe : nombre d'arguement incorrect"
    exit 1
}

$date = date
echo "Début shutdown : $date" >> ShutdownLog.txt
$reseau = [string]$args[0]
$plages = [string]$args[1]
$min = [int]$args[2]
$max = [int]$args[3]
$count = 0
$countPing = 0
echo "Args: réseau=$reseau, plages=$plages, min=$min, max=$max" >> ShutdownLog.txt

$plages.Split(";") | ForEach-Object {
    $plage = $_
    for($i=$min; $i -le $max; $i++) {
        $ip = "$reseau.$plage.$i"
        $count++
        ping -n 1 -w 1000 $ip
        if($?) {
           echo " shutdown /t 60 /f /m \\$ip"
           $countPing++
        }
    }
}


echo "$count IP scannées, $countPing ordres d'extinctions" >> ShutdownLog.txt
$date = date
echo "Fin shutdown: $date" >> ShutdownLog.txt


Pensez à la planète !