Befehle auf allen Clients im Netzwerk ausführen mit PowerShell und WinRM

Wer hat sich das nicht schon immer gewünscht per CMD oder PowerShell an einer zentralen Stelle Befehle auf allen Clients ausführen?

Dies ist mit PowerShell und dem Befehl Invoke-Command oder Enter-PSSession ganz einfach möglich.

Dazu müssen die Clients aber noch angepasst werden.

Ich gehe davon aus dass Ihr eine Windows Domäne benutzt, in meinem Beispiel habe ich einen Server 2016 als DomänenController.

Schritt 1:

Zuerst geht Ihr in die Gruppenrichtlinienverwaltung, dort geht Ihr in folgenden Pfad:

Computerkonfiguration -> Richtlinien-> Administrative Vorlagen -> Windows-Komponenten -> Windows-Remotverwaltung (Windows Remote Management, WinRM)-> WinRM Dienst:

Remoteverwaltung über WinRM zulassen diesen setzt Ihr auf Aktiviert bei Bedarf könnt Ihr noch einen Adressbereich definieren von dem aus auf die Clients zugegriffen werden kann.

ACHTUNG: Unter Windows Server 2008 R2 heißt der Eintrag:

Automatische Konfiguration von Listenern zulassen

Wenn dies jeder im Netzbereich machen darf, dann tragt bei IPv4/IPv6 Filter ein * ein und klickt auf Übernehmen (Ok).

In einer Produktivumgebung sollte der Zugriff möglichst auf die IP des Adminplatzes oder des DCs beschränkt werden.

 

Schritt 2:

Wir verbleiben in der Gruppenrichtlinienverwaltung.

Computerkonfiguration -> Richtlinien-> Windows Einstellungen -> Sicherheitseinstellungen -> Windows-Firewall mit erweiterter Sicherheit -> Windows-Firewall mit erweiterter Sicherheit:

Eingehende Regeln -> Rechte Maustaste -> Neue Regel

In meinem Fall habe ich die Verbindung für Öffentliche bereiche gesperrt, dies könnt Ihr von eurem Anwendungsfall abhängig machen.

Der Status „Öffentlich/Privat/Domäne“ beschreibt nur den Zugewiesenen bereich eures Netzwerkadapters.

Schritt 3.1:

Als letzter Schritt in der GPO muss noch dieser Pfad angepasst werden:

Computerkonfiguration -> Richtlinien-> Windows Einstellungen -> Sicherheitseinstellungen -> Systemdienste:

Windows –Remoteverwaltung (WS-Verwaltung)

Den Startmodus auf Automatisch setzen:

Schritt 3.2:

Computerkonfiguration -> Einstellungen -> Systemsteuerungseinstellungen-> Dienste:

Rechte Maustaste -> Neu -> Dienst

Setzt den Dienst WinRM und Dienstaktion auf Dienst starten.

Nun noch unter Wiederherstellung alles auf „Dienst neu starten“.

Ihr seid jetzt mit der Konfiguration in der GPO fertig.

Die Clients könnt ihr entweder mit einem „gpupdate /force“ vor Ort zwingen sich die neue Gruppenrichtlinie zu ziehen oder Ihr wartet bis der Rechner sich die neue Richtlinie gezogen hat.

Ab jetzt könnt Ihr von eurem Rechner der mit dem Domänenadmin angemeldet ist oder die PowerShell als Domänenadmin ausführt alle Clients Remote steuern.

Ich habe ein kleines Skript geschrieben um auf allen Clients einen Befehl auszuführen, es gibt manchmal Anwendungsfälle wo man doch eine Rückmeldung vom Client benötigt.

Dies bekommt man über die GPO nicht immer.

Skripting und Befehle ausführen:

$computers = Get-ADComputer —Filter 'Name —like "TSTWKS*"'
$cp = $computers.Name

foreach($computer in $cp) 
{
  Try{
  "Try $computer";
  if (Test-Connection —ComputerName $computer -Quiet -Count 1){
    Invoke—Command —ComputerName $computer -ScriptBlock {shutdown -r -f -t 00} -ErrorAction Stop;
  }else{
    Write-Host "Not Online $computer" -ForegroundColor Yellow 
    }
  }
Catch {
  Write-Host "No WinRM Active $computer" -ForegroundColor Red 
  }
}

 

Kurze Erklärung zum Script:

Es fragt im ActiveDirectory nach Computernamen die mit „TSTWKS*“ beginnen.

Danach wird der Befehl für jeden Rechner in einer For Schleife ausgeführt.

Es wird erst geprüft ob der Rechner auf ein PING mit einem Paket reagiert.

Erst dann wird der Befehl Invoke-Command mit dem Parameter –ScriptBlock „BEFEHL ODER SKRIPT“ ausgeführt.

Wenn ein Rechner nicht erreichbar ist wird dieser Übersprungen und es wird eine entsprechende Meldung generiert.

Ihr könnt dort jeden beliebigen PowerShell Code ausführen Befehle oder sogar komplette Skripte.

Beachtet bitte im Beispiel Code ist der befehl „shutdown -r -f -t 00“ eingetragen dieser befehl startet alle Rechner neu, daher bitte Vorsichtig 🙂

Wenn Ihr euch manuell auf einen Client schalten wollt geht dies mit dem Befehl:

Enter-PSSession –Computername „XXX“

Beim ausführen des Skripts oder der Befehle müsst Ihr immer mit einem Konto angemeldet sein was Lokale Administrator Rechte auf dem Client besitzt, sonst kommt die Meldung Zugriff Verweigert.

Ich wünsche euch viel Spaß beim Administrieren und sagt am besten mal eure Meinung in den Kommentaren.

Unterstützt mich und bestellt etwas bei Amazon über meinen Reflink

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>