Hallo Kollegen,
mir war es bisher immer ein Dorn im Auge mitten in der Nacht und am Wochenende unsere Server rebooten zu müssen, weil sonst keine Wartungsfenster vorhanden sind. (und bei 20-30 Servern kann sich das ziehen...)
Ich habe mal ein kleines Powershellscript gebastelt, dass mir diese Arbeit (hoffentlich) abnimmt.
Ich bin leider kein Powershellguru... oder anderstgesagt, dies ist meine erste Berührung mit der Powershell... also vergebt mir unnütze Aufrufe und umständliche Lösungswege
Wer Verbesserungsvorschläge hat bitte immer her damit...
Momentan suche ich noch eine Möglichkeit, mehrere Domains und WSUS Server abzufragen... aktuell durchsucht er nur sich selbst.
Leider ist das Script auch nur direkt auf dem WSUS Server lauffähig.
Das Script wickelt folgendes ab.
1. Prüfen welche Rechner einen Neustart benötigen.
2. Ausschluss von Rechnern die ich nicht starten möchte
3. Prüfung ob die Rechner überhaupt online sind
4. Neustart
5. Prüfung ob die Rechner wieder online sind.
6. Falls nicht eine Benachrichtigung per Mail.
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
if (!$wsus)
{
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
}
Remove-Item W:\Wsus\Clients_reboot_needed.txt
Remove-Item W:\Wsus\Clients_rebooted.txt
$file1 = "W:\Wsus\Clients_reboot_needed.txt"
$file2 = "W:\Wsus\Clients_rebooted.txt"
$computerScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope;
$computerScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$computers = $wsus.GetComputerTargets($computerScope);
#hier können Rechner definiert werden die vom Neustart ausgeschlossen werden sollen.
$computers | foreach-object {
$_.FullDomainName | foreach-object {
if ($_ -eq 'Server1.DOMAIN.de'){
}
elseif ($_ -eq 'Server2.DOMAIN.de'){
}
elseif ($_ -eq 'Server3.DOMAIN.de'){
}
elseif ($_ -eq 'Server4.DOMAIN.de'){
}
elseif ($_ -eq 'Server5.DOMAIN.de'){
}
elseif ($_ -eq 'Server6.DOMAIN.de'){
}
else {
#Dies sind also alle Rechner die einen Neustart benötigen und neugestartet werden dürfen!
out-file -filepath $file1 -inputobject $_ -append -encoding default
}
}
}
#Sind die Rechner überhaupt erreichbar?
$file1 = get-content W:\Wsus\Clients_reboot_needed.txt
foreach ($Linie in $file1) {
if ( Test-Connection $Linie -count 1 -quiet ){
#ja sind Sie...
#Hier stehen nun alle Online Rechner mit Reboot pending
out-file -filepath W:\wsus\Clients_rebooted.txt -inputobject $Linie -append -encoding default
#Reboot endlich :D
#restart-computer -computername $Linie
}
}
Start-Sleep -s 1800
#Sind die Rechner nach dem Reboot per Ping erreichbar?
$file2 = get-content W:\Wsus\Clients_rebooted.txt
foreach ($Linie2 in $file2) {
if ( Test-Connection $Linie2 -count 1 -quiet ){
#be happy... Everything is allright :-)
}
else {
#Mailbenachrichtigung im Fehlerfall
function sendmail($body)
{
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$SmtpClient.Host = "mail.DOMAIN.de"
$mailmessage.from = "WSUS@DOMAIN.de"
$mailmessage.To.add("MEIN.NAME@DOMAIN.de")
$mailmessage.Subject = $Linie2 +' nach 30min nicht online'
$MailMessage.IsBodyHtml = $true
$mailmessage.Body = $body
$smtpclient.Send($mailmessage)
}
$body = $Linie2 +' ist nicht via ping erreichbar. Bitte umgehend prüfen'
sendmail $body
}
}
Grüße und viel Spass damit
Lenny