Zwangweises Herunterfahren einer Reihe von Windows-Systemen per PowerShell

Dieses PowerShell-Skript fährt eine Reihe von Windows-Rechnern herunter. Die Rechnernamen kann man im Skript hinterlegen oder aus einer Datei oder dem Active Directory auslesen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Dr. Holger Schwichtenberg

Dieses PowerShell-Skript fährt eine Reihe von Windows-Rechnern herunter. Die Rechnernamen kann man im Skript hinterlegen oder aus einer Datei oder dem Active Directory auslesen.

Es ergeben sich immer wieder Situation, in denen man eine Reihe von Systemen auf einmal herunterfahren möchten (z. B. zu Wartungszwecken oder weil man abends in Büro kommt und sieht, dass wieder einmal eine Reihe von Mitarbeitern ihren PC angelassen haben und längst im Feierabend sind).

Das folgende PowerShell-Skript hilft. Die Quelle für die Rechnernamen kann vielfältig sein. Das Skript zeigt eine feste Hinterlegung im Skript, das Auslesen aus einer Textdatei oder die Verwendung einer Computerliste aus dem Active Directory.

# Zwangweises Herunterfahren einer Reihe von Windows-Systemen per PowerShell
# Autor: Dr. Holger Schwichtenberg, www.IT-Visions.de

# Feste Namensliste
#$Rechnernamen = { "PC1","PC2", "PC3", "usw" }
# Namens aus Datei
#$Rechnernamen = Get-Content "Rechnernamen.txt"
# oder Namensliste aus dem Active Directory (gefiltert)
$Rechnernamen = (get-adcomputer -Filter "Name -like 'E7*'").Name

[System.Collections.ArrayList] $RechnerZumHerunterfahren = @()
# Prüft, ob ein System erreichbar ist
filter Check-Online {
trap { continue }
. {
$timeout = 1000
$obj = New-Object system.Net.NetworkInformation.Ping
$result = $obj.Send($_, $timeout)
if ($result.status -eq 'Success') { 1 }
}
}

Write-host "Prüfe $($rechnernamen.Count) Computer..."
# Prüfung für alle Systeme in der Liste
foreach($c in $Rechnernamen)
{
$istOnline = $c | Check-Online
Write-host "$c ist$(if (-not $istOnline) { " NICHT" }) erreichbar" -ForegroundColor "$(if ($istOnline) { "Green" } else { "Red" })"
# prägnanter ab PowerShell 7 mit ternärem Operator:
# Write-host "$c ist$(-not $istOnline ? ' NICHT' : '') erreichbar" -ForegroundColor "$($istOnline ? "Green" : "Red")"

if ($istOnline){ $RechnerZumHerunterfahren.Add($c) | out-null }
}
if ($RechnerZumHerunterfahren.Count -eq 0) { Write-Host "Kein System ist eingeschaltet :-)" -ForegroundColor Green ; exit }

# Nachfrage
Write-Host "Jetzt $($RechnerZumHerunterfahren.Count) Systeme herunterfahren? J=Ja" -ForegroundColor Cyan
$r = Read-Host
if ($r -ne "j") { exit }

# Herunterfahren mit -force
foreach($c in $RechnerZumHerunterfahren)
{
Stop-Computer $c -Force;
Write-Warning "$c wird heruntergefahren...";
} ()