Einstieg in die PowerShell - Scripting 101

Lesezeit
22 Minuten
Bis jetzt gelesen

Einstieg in die PowerShell - Scripting 101

30.06.2025 - 15:17
Veröffentlicht in:

Admins, die bislang nur die Kommandozeile und deren einfache Batch-Skripte nutzen, müssen sich beim Scripting mit der PowerShell umstellen. Diese ist zwar genauso wie die CMD eine Shell, aber auch eine vollwertige Skriptumgebung, die das Erstellen großer und komplexer Dateien zur Verwaltung des Windows-Systems unterstützt. Dieser Workshop führt in die Administration via PowerShell ein.

In Kürze

PowerShell ist die von Microsoft entwickelte Shell und Skriptsprache zur Automatisierung von Windows-, Server- und Cloud-Infrastrukturen. Mit Cmdlets, Skripten und Remoting lassen sich Systeme effizient verwalten, wiederkehrende Aufgaben automatisieren und komplexe Administrationsprozesse standardisieren.

Generell ist der Umgang mit der PowerShell nicht sehr kompliziert. Geben Sie Get-Command  ein, sehen Sie zum Beispiel alle Befehle, die Ihnen zur Verfügung stehen. Die Groß- und Kleinschreibung spielt übrigens beim Aufruf von Cmdlets keine Rolle. Die wenigsten Administratoren kennen alle Cmdlets, die für die PowerShell verfügbar sind. Die PowerShell bietet jedoch eine ausführliche Hilfe an. Haben Sie nur einen Teil eines Befehls in Erinnerung, können Sie mit dem Platzhalter "*" arbeiten. Der Befehl Get-Command *mailbox  zeigt zum Beispiel alle Cmdlets an, deren Name mit "mailbox" endet. Ist der gesuchte Befehl nicht dabei, verwenden Sie einfach mehrere Platzhalter, zum Beispiel Get-Command *mailbox*. Diese Anweisung bringt alle Befehle auf den Bildschirm, in denen das Wort "mailbox" irgendwo vorkommt.

Für nahezu alle Kommandos gilt die Regel, dass diese in vier Arten vorliegen: Es gibt Cmdlets mit dem Präfix "New-", um etwas zu erstellen, und "Remove-", um etwas zu löschen. Möchten Sie das Objekt anpassen, gibt es das Präfix "Set-" und zu guter Letzt gibt es "Get-", um Informationen zu einem Objekt abzurufen. Neben diesen Befehlen existieren noch andere, zum Beispiel "Start-" und "Stop-" oder "Export-" und "Import-"Cmdlets. Allerdings lassen sich die meisten Administrationsaufgaben mit den erwähnten Präfixen durchführen. Geben Sie nur den Cmdlet-Namen ein, passiert entweder überhaupt nichts, das Cmdlet zeigt alle Objekte der Organisation an oder Sie werden nach der Identität des Objekts gefragt.

Möchten Sie beispielsweise ein einzelnes Objekt bearbeiten, müssen Sie dessen Namen angeben. Ansonsten erhalten Sie entweder eine Fehlermeldung, die Sie darüber informiert, welche Optionen fehlen – was ebenfalls eine Hilfe sein kann –, oder die PowerShell fragt die notwendigen Optionen ab und legt das Objekt an. Das Gleiche gilt für die anderen "Set-", "Remove-" und "Get-"Cmdlets.

Hilfe in der PowerShell aufrufen

Um notwendige Informationen und Optionen in einer Befehlszeile anstatt nach und nach einzugeben, bietet die PowerShell eine ausführliche Hilfe an. Mit dem Befehl Help <Cmdlet>  erhalten Sie Informationen zum entsprechenden Cmdlet. Für viele Cmdlets gibt es noch die Option "-Detailed" für noch ausführlichere Informationen. Mit Help <Cmdlet>-Examples  lassen sich Beispiele für den Befehl anzeigen. Auch das funktioniert für alle Befehle in der PowerShell.

Rufen Sie eine Hilfe zu Cmdlets auf, kann sich die PowerShell selbstständig aus dem Internet mit update-help  aktualisieren. Dazu muss Ihre Arbeitsstation natürlich über eine Internetverbindung verfügen. Alternativ laden Sie die Hilfedateien auf einem anderen Computer herunter und speichern diese auf Servern und Computern ohne Internetverbindung mittels save-help  ab.

Ebenfalls hilfreich ist das Cmdlet Show-Command, das ein neues Fenster mit allen Befehlen einblendet, die in der PowerShell verfügbar sind. Sie können im Fenster nach Befehlen suchen und sich eine Hilfe dazu sowie Beispiele anzeigen lassen. Außerdem stellen Sie mit dem Fenster auch eigene Kommandos zusammen, ohne diese direkt in der PowerShell eingeben zu müssen.

ild 1: Platzhalter erlauben das Anzeigen von Zusatzinformationen, wenn der genaue Befehl nicht bekannt ist.
Bild 1: Platzhalter erlauben das Anzeigen von Zusatzinformationen, wenn der genaue Befehl nicht bekannt ist.

Daten abfragen

Mit den Get-Cmdlets lassen Sie sich Informationen zu Objekten anzeigen, deren Ausgabe Sie über "|fl" formatieren. Wünschen Sie nicht alle Informationen, sondern nur einzelne Parameter, können Sie diese nach der Option "|fl" anordnen. Um etwa für das Postfach "thomas.joos@contoso.int" nur den Displaynamen, die Datenbank, den Alias und die Organisationseinheit (Organizational Unit, OU) anzuzeigen, verwenden Sie

Get-Mailbox thomas.joos@contoso.int |fl DisplayName, Database, Alias, OrganizationalUnit 

Sie können in der PowerShell auch alle Exchange-Datenbanken ausgeben lassen, die auf den Servern Ihrer Organisation existieren. Rufen Sie dazu in der Exchange Management Shell den Befehl Get-MailboxDatabase  auf. Sie erhalten mit diesem Befehl nicht nur eine formatierte Liste aller Postfachdatenbanken eines Servers, sondern alle Postfachdatenbanken auf allen Exchange-Servern in der Organisation. Auch hier gilt wieder, dass diese Befehle für alle Get-Cmdlets gelten. Diese können zu den Bordmitteln von Windows gehören oder zu anderen Servern wie SQL Server oder in diesem Beispiel Exchange. Grundsätzlich ist der Umgang mit den Shells anderer Microsoft-Server wie hier der Exchange Management Shell identisch zur Arbeit mit der PowerShell.

Skripte in der PowerShell erstellen

Umfangreichere Skripte, die eine Abfolge einzelner PowerShell-Befehle beinhalten, lassen sich in Dateien mit der Endung "PS1" zusammenzufassen. Um solch ein Skript auszuführen, verwenden Sie den Befehl mit der Syntax .\<Pfad und Name der PS1-Datei>. Vergessen Sie zu Beginn das Präfix ".\" nicht. Sie müssen für die Ausführung ferner die Sicherheitseinstellungen der PowerShell anpassen.

In der PowerShell ist die sogenannte Ausführungsrichtlinie für Skripte jetzt standardmäßig auf "RemoteSigned" gesetzt. Die Ausführungsrichtlinie bestimmt, ob Skripte ausgeführt werden dürfen und ob diese digital signiert sein müssen. Standardmäßig blockiert die PowerShell Skripte. Sie können die Ausführungsrichtlinie mit dem Set-ExecutionPolicy-Cmdlet ändern und mit Get-ExecutionPolicy  anzeigen. Dabei stehen folgende Einstellungen zur Verfügung:

  • Restricted: Standardeinstellung, keine Skripte erlaubt.
  • AllSigned: Nur signierte Skripte sind gesattet.
  • RemoteSigned: Bei dieser Einstellung müssen Sie Skripte durch eine Zertifizierungsstelle signieren lassen.
  • Unrestricted: Mit dieser Einstellung funktionieren alle Skripte.

Ebenfalls interessant ist die Oberfläche zum Erstellen von Skripten und Ausführung von Befehlen für die Windows PowerShell, das so genannte "Windows PowerShell Integrated Scripting Environment" (ISE). Dieses starten Sie durch Eintippen von powershell ise  oder indem Sie den Befehl ise  in einer PowerShell-Sitzung eingeben. Die grafische Oberfläche bietet die Möglichkeit, Skripte für die PowerShell in einer einheitlichen Oberfläche zu erzeugen. Der Vorteil dabei ist, dass Sie beim Eingeben von Befehlen bereits Vorschläge für Cmdlets unterbreitet bekommen. Außerdem sind die Befehle farblich hervorgehoben, sodass sich die einzelnen Optionen besser unterscheiden lassen.

Im oberen Bereich können Sie Skriptbefehle angeben und diese dann als Skript abspeichern. Des Weiteren haben Sie die Möglichkeit, eine PowerShell remote auf einem anderen Computer zu öffnen. Verwenden Sie dazu den Menüpunkt "Datei". Die PowerShell zeigt das ISE als zusätzliche Registerkarte an. Geben Sie im oberen Bereich Befehle ein, werden diese nicht sofort ausgeführt, sondern wie in einem normalen Skript zunächst aufgelistet. Sind Sie fertig mit der Eingabe der Befehle, starten Sie deren Ausführung, indem Sie auf das grüne Abspielsymbol mit der QuickInfo "Skript ausführen" klicken.

Über den Menüpunkt "Ansicht" passen Sie die verschiedenen Bereiche des ISE an Ihre Bedürfnisse an. So lässt sich zum Beispiel der Bereich zum Erstellen von Skripten an der rechten Seite anordnen. Skripte können Sie während der Ausführung bearbeiten und so Fehler schneller beheben. Laden Sie ein Skript über "Datei / Öffnen", sehen Sie im Befehlsfenster dessen Bestandteile. Markieren Sie eine Zeile im Skript, können Sie über den Menüpunkt "Debuggen / Haltepunkt umschalten" eine Pause im Skript einbauen.

Bild 2: Die PowerShell hilft beim Zusammenstellen von Befehlen mit einer grafischen Oberfläche.
Bild 2: Die PowerShell hilft beim Zusammenstellen von Befehlen mit einer grafischen Oberfläche.

Variablen verwenden

Interessant ist auch die Möglichkeit, dass Sie innerhalb der Shell Variablen definieren können, die aktuelle Informationen automatisch abfragen. Diese Variablen lassen sich dann später innerhalb eines Skripts verwenden. Möchten Sie beispielsweise das aktuelle Datum als Variable "$heute" hinterlegen, geben Sie in der Shell den Befehl $heute = Get-Date  ein. Anschließend wird das heutige Datum in der Variablen hinterlegt. Geben Sie dann in der Shell $heute  ein, erhalten Sie das aktuelle Datum.

Auf einzelne Bestandteile der Variable können Sie auch getrennt zugreifen. Interessiert Sie etwa aus dem Datum lediglich die Uhrzeit, lesen Sie ohne viel Aufwand mit $heute.ToShortTimeString()  nur die Uhrzeit in Stunden und Minuten aus der Variablen aus. Eine weitere Möglichkeit ist das Formatieren der Ausgabe. So erzwingen Sie per Eingabe des Befehls $heute. ToString("MMMM")  die Ausgabe des Monats oder über $heute.ToString("MM")  den Monat als Zahl innerhalb des Kalenderjahres. Generell können Sie hinter den meisten Befehlen, die einen Status oder eine Statistik ausgeben, noch den Zusatz "|fl" eingeben. Dieser bewirkt, dass Sie eine formatierte Liste erhalten, die deutlich mehr Informationen ausgibt als der Befehl ohne diesen Zusatz.

Im Beispiel des Datums ist es jedoch auch möglich, einzelne Bestandteile ohne Variable auszulesen. Der Befehl Get-Date -displayhint date  zeigt nur das Datum, Get-Date -displayhint time  nur die Uhrzeit an. Auch können Sie ermitteln, welche Art von Objekt von einem bestimmten Cmdlet abgerufen wird, indem Sie die Ergebnisse eines Get-Cmdlets mit einem Pipeline-Operator (|) an den Befehl Get-Member  übergeben.

Bild 3: In der grafischen Oberfläche der PowerShell finden sich die verfügbaren Cmdlets alphabetisch aufgelistet
Bild 3: In der grafischen Oberfläche der PowerShell finden sich die verfügbaren Cmdlets alphabetisch aufgelistet

PowerShell über das Netzwerk nutzen

Damit Sie einen Computer über die PowerShell remote verwalten können, aktivieren Sie zunächst die Remoteverwaltung auf dem Computer. Dazu geben Sie auf dem entsprechenden Computer den Befehl Enable-PSRemoting -force  in der PowerShell ein. Dieses Kommando aktiviert auch die Ausnahmen in der Windows-Firewall. Mit Disable-PSRemoting -Force  deaktivieren Sie die Remoteverwaltung eines Computers wieder. Sie müssen für solche administrativen Befehle die PowerShell über die App-Leiste (Klick mit der rechten Maustaste) auf der Startseite mit Administratorrechten starten.

Um den Port für die Verbindung zu überprüfen, verwenden Sie den Befehl winrm enumerate winrm/config/listener. Der Listener verwendet den Port 5985. Funktioniert der Zugriff nicht, können Sie auf dem Zielcomputer auch eine Liste von Computern pflegen, die Zugriff auf Remote-PowerShell-Sitzungen haben sollen:

winrm set winrm/config/client @{TrustedHosts="<Alle Quellcomputer, durch Komma getrennt>"} 

Um nun über das Netzwerk PowerShell-Befehle auf Hosts auszulösen, starten Sie auf dem Zielcomputer mit winrm quickconfig  die Remoteverwaltung. Anschließend authentifizieren Sie sich, wenn Sie unter einem anderen Benutzer als dem aktuell angemeldeten am Server arbeiten möchten. Danach baut die PowerShell eine Sitzung auf und Sie können auf dem Quellserver Befehle eingeben, die auf dem Zielserver wirken.

Auf Servern und Computern, die Mitglied einer Domäne sind, funktionieren diese Sitzungen übrigens am einfachsten. In Remote-PowerShell-Sitzungen verwenden Sie die gleichen Cmdlets wie lokal. Allerdings erlauben nicht alle Befehle eine Remoteverwaltung. Sie identifizieren die kompatiblen Cmdlets am schnellsten, indem Sie überprüfen, ob das Cmdlet die Option "-ComputerName" unterstützt. Mit dem Befehl Get-Help * -Parameter ComputerName  lassen Sie sich eine Liste all dieser Cmdlets anzeigen.

Um eine Remotesitzung in der normalen PowerShell zu erstellen, verwenden Sie New-PSSession. Mit Enter-PSSession <Servername>  bauen Sie eine Verbindung auf und beenden mit Exit-Session  die Sitzung wieder. Auch haben Sie die Möglichkeit, Sitzungen zu unterbrechen und erneut aufzubauen. Bei unterbrochenen Sitzungen laufen die Cmdlets weiter, auch wenn Sie sich vom Server getrennt haben. Dazu nutzen Sie die neuen Cmdlets Disconnect-PSSession, Connect-PSSession  und Receive-PSSession.

Dateioperationen in der PowerShell

Die PowerShell verfügt über eine Reihe von Cmdlets, um Netzwerkeinstellungen eines Computers zu steuern oder abzufragen. Eine Liste aller Cmdlets, mit denen sich Netzwerkeinstellungen festlegen lassen, gibt der Befehl Get-Command -Noun Net*  aus. Doch nicht nur die Netzwerkverwaltung können Sie in der PowerShell durchführen, sondern auch Dateien verwalten, wie wir nachfolgend zeigen.

Der Befehl Remove-Item C:\Scripts\* -Exclude *.doc  löscht alle Dateien, außer denen, die Sie mit "-Exclude" ausgeschlossen haben – in diesem Fall DOC-Dateien. Und Remove-Item C:\Scripts\* -Include .xls,.doc  löscht nur die Dateien hinter "-Include". Beide Optionen können Sie auch gemeinsam verwenden, zum Beispiel mit Remove-Item C:\Scripts\* -Include *.txt -Exclude *test*. Hier löscht die PowerShell alle Textdateien im Ordner, außer Dateien mit der Zeichenfolge "test" im Dateinamen. Wenn Sie sich ob der Konsequenzen Ihres Befehls nicht ganz sicher sind, verwenden Sie den Parameter "-Whatif". Die PowerShell entfernt dann in unserem Beispiel keine Dateien, gibt aber aus, was passieren würde:

Remove-Item C:\Windows\*.exe -Whatif 

Mit dem Copy-Item-Cmdlet kopieren Sie Dateien oder Ordner. Der Befehl Copy-Item C:\Scripts\test.txt C:\Test  etwa kopiert die Datei "test.txt". Die Syntax ähnelt dem Copy-Befehl in der herkömmlichen Eingabeaufforderung und auch hier können Sie mit dem Platzhalter "*" arbeiten. Wenn Sie einen ganzen Ordner samt Inhalt kopieren möchten, verwenden Sie den Parameter "-Recurse". So legt der Befehl

Copy-Item C:\Scripts C:\Test -Recurse 

eine Kopie des Ordners "C:\Scripts" im Ordner "C:\Test" an. Ohne die Option
"-Recurse" wird in "C:\Test" zwar ein Ordner "Scripts" angelegt, es werden aber keine Dateien und Ordner kopiert.

Mit dem Move-Item-Cmdlet verschieben Sie Objekte. Auch hier können Sie wieder mit Platzhaltern arbeiten, genauso wie beim Kopieren. Standardmäßig überschreibt das Move-Item-Cmdlet vorhandene Dateien im Zielordner nicht, dazu ist der Parameter "-Force" nötig

Move-Item C:\Scripts\test.zip C:\Test -Force 

Mit dem Befehl

Move-Item C:\Scripts\test.log C:\Test\ad.log 

verschieben Sie Dateien und benennen diese gleichzeitig um.

Über das New-Item-Cmdlet erstellen Sie neue Dateien oder Ordner. So legen Sie mit

New-Item C:\Temp\PowerShell -Type Directory 

im Ordner "C:\Temp" einen leeren Ordner mit der Bezeichnung "PowerShell" an. Um eine neue Datei zu erstellen, verwenden Sie die gleiche Syntax, aber den Typ "File":

New-Item C:\Scripts\skript.txt -Type File 

Mit

New-Item C:\Scripts\skript.txt -Type File -Force  

ersetzen Sie dabei eine vorhandene Datei durch eine neue. Über

New-Item C:\Scripts\skript.txt 
-Type File -Force -Value "<Text>" 

erstellen Sie eine neue Datei mit dem in Anführungszeichen angegebenen Text als Inhalt. Neue Daten fügen Sie wie folgt in eine Textdatei ein:

Add-Content C:\Scripts\test.txt "<Text>" 

Standardmäßig fügt das Add-Content-Cmdlet den neuen Wert hinter dem letzten Zeichen in der Textdatei ein.

Den Inhalt einer Datei ersetzen Sie mit dem Set-Content-Cmdlet, während der Clear-Content-Befehl den Inhalt löscht. Auch hier können Sie mit Platzhaltern arbeiten. Neben Textdateien unterstützt das Cmdlet auch Excel-Tabellen, Word-Dokumente und andere Dateien.

Mit dem Remove-Item-Cmdlet löschen Sie Objekte. Um etwa alle Dateien im Ordner "Scripts" ohne Rückfrage zu entfernen, nutzen Sie

Remove-Item C:\Scripts\* -Recurse 

Der Befehl

Remove-Item C:\Scripts\* -Exclude *.doc 

löscht alle Dateien, außer denen, die Sie mit "-Exclude" ausgeschlossen haben. Demgegenüber entfernt

Remove-Item C:\Scripts\* -Include .xls,.doc  

nur die Dateien hinter "-Include". Beide Optionen lassen sich auch gemeinsam verwenden, zum Beispiel mit

Remove-Item C:\Scripts\* -Include *.txt -Exclude *test* 

Systemadministration über Cmdlets

Eine häufige Administrationsaufgabe ist die Verwaltung der laufenden Prozesse auf einem Server. Über den Befehl Get-Process  zeigen Sie alle laufenden Prozesse eines Computers an. Möchten Sie nur alle Prozesse mit dem Anfangsbuchstaben "S" angezeigt bekommen, geben Sie Get-Process s*  ein. Sollen die Prozesse zusätzlich noch sortiert werden, zum Beispiel absteigend nach der CPU-Zeit, verwenden Sie

Get-Process s* |Sort-Object cpu -Descending 

Sie können Informationen zu den Prozessen auch ausdrucken, zum Beispiel eine Liste aller aktuell gestarteten Prozesse mit Get-Process | out-printer.

Mit der Where-Abfrage lassen sich Informationen auch filtern. Sollen zum Beispiel alle gestoppten Systemdienste in der PowerShell angezeigt werden, geben Sie

Get-Service | Where-Object {$_.Status -Eq "Stopped"} 

ein. Auch auf die Ereignisanzeige lässt sich zugreifen. Zum Beispiel zeigen sich Ihnen die 100 neuesten Fehlermeldungen in der Ereignisanzeige "System" über

Get-EventLog System -Newest 100 | Where {$_.entryType -Match "Error"} 

Dienste starten und beenden Sie in der PowerShell übrigens mit Start-Service, Stop-Service, Get-Service  und Set-Service.

Natürlich haben Sie die Möglichkeit, auch Netzlaufwerke in Windows einzubinden. Dazu dient New-PSDrive  am besten mit der Option "-Persist". Alle Optionen des Cmdlets sind über Get-Help New-PSDrive -Detailed  verfügbar.

Eine wesentliche Sicherheitskomponente ist die Firewall. Alle Befehle, die Ihnen zur Verwaltung der Brandschutzmauer zur Verfügung stehen, lassen Sie sich mit Get-Command -module Netsecurity  anzeigen. Um zum Beispiel eine neue Firewall-Regel zu erstellen, verwenden Sie

New-NetFirewallRule -DisplayName "ICMP block" -Direction Inbound -Protocol icmp4 -Action Block 

Anstatt eine neue Regel zu erzeugen, ist es allerdings oft einfacher, Firewall-Regeln zu kopieren. Dazu steht das Copy-NetFirewallRule-Cmdlet zur Verfügung. Umbenennen lassen sich die Regeln mit dem Rename-NetFirewallRule-Kommando. Beim Kopieren können Sie über "-NewName" auch einen neuen Namen angeben, zum Beispiel:

Copy-NetFirewallRule -DisplayName "<Require Outbound Authentication>" -NewName "<Alternate Require Outbound Authentication>" 

Löschen können Sie Firewallregeln mit Remove-NetFirewallRule. Einen Überblick über alle Regeln eines Rechners, unabhängig von deren Status, verschaffen Sie sich mit Get-NetFirewallRule -All.

Ein anderes Thema im Netzwerkumfeld ist die IP-Adresszuweisung über DHCP. Administratoren, die DHCP auf Basis von Windows-Servern einsetzen, können natürlich auch diesen Bereich über die PowerShell verwalten. Um die Einstellungen abzufragen, verwenden Sie den Befehl Get-DhcpServerv4Scope. Alle Cmdlets zur Verwaltung von DHCP in Windows Server erhalten Sie durch die Eingabe von Get-Command *dhcp*.

Cover des IT-Adminstrator-Sonderhefts 01/2024 "PowerShell"

Dieser Artikel erschien im IT-Administrator Sonderheft I/2024

"PowerShell – Infrastrukturen automatisiert verwalten"

Das Sonderheft I/2024  liefert auf 205 Seiten praktisches Know-how zum Umgang mit der Microsoft-Skriptumgebung und deren Einsatz zur Automatisierung wichtiger Serversysteme. Das Autorenteam wirft unter anderem einen Blick auf die Methoden und Techniken, die die PowerShell für die Administration bereitstellt.

Bestellen Sie das Sonderheft hier als E-Paper
oder
hier als gedrucktes Heft.

Wiederherstellungspunkte im Fehlerfall nutzen

Sollte auf einem Rechner einmal etwas schieflaufen, lässt sich der Computer über Wiederherstellungspunkte wieder in einen funktionierenden Zustand zurücksetzen. Mit dem Befehl Get-ComputerRestorePoint  sehen Sie alle vorhandenen Systemwiederherstellungspunkte auf dem System. Um einen Rechner in einen früheren und funktionsfähigen Zustand zu versetzen, nutzen Sie Restore-Computer <SequenceNumber>, wobei Sie in der "SequenceNumber" den gewünschten Wiederherstellungspunkt angeben. Diese Nummer erfahren Sie über Get-ComputerRestorePoint. Nach der Eingabe des Befehls startet der Assistent sofort mit seiner Arbeit, es erfolgt keine Rückfrage. Mit dem Befehl

Checkpoint-Computer -Description <Beschreibung> 

erstellen Sie einen Wiederherstellungspunkt. Allerdings können Sie auf diesem Weg immer nur alle 24 Stunden einen Wiederherstellungspunkt anlegen. Diese Wiederherstellungspunkte lassen sich später genauso in der grafischen Oberfläche verwalten wie alle anderen auch. Über die PowerShell haben Sie ferner die Möglichkeit, Systemwiederherstellungspunkte zeitgesteuert zu erstellen.

Daten sichern

Auch Datensicherungen lassen sich über die PowerShell steuern. Dazu müssen Sie unter Umständen in alten Versionen der PowerShell oder in PowerShell ISE zunächst die Befehle für die Datensicherung laden. Verwenden Sie dazu Add-PSSnapin Windows.Serverbackup. Mit Get-PSSnapin  überprüfen Sie, ob das Snap-in geladen ist.

Das verfügbare Modul für Windows Server trägt die Bezeichnung "WindowsServerbackup", muss aber nicht mehr geladen werden. Mit

Get-Command -Module WindowsServerbackup 

lassen Sie sich in Windows Server die verfügbaren Backup-Cmdlets der PowerShell anzeigen. Mit den drei folgenden Befehlen erhalten Sie eine ausführliche Hilfe und Beispiele der Cmdlets:

Get-Help <Cmdlet-Name> -Detailed 
Get-Help <Cmdlet-Name> -Examples 
Get-Help <Cmdlet-Name> -Full 

Um eine neue Sicherung über die PowerShell zu erstellen, müssen Sie zunächst einen Sicherungssatz anlegen, also eine Richtlinie, die steuert, welche Daten der Server sichern soll.

Virtuelle und physische Festplatten verwalten

Mit der Virtualisierung von Servern und Clients kamen auch die virtuellen Festplatten – kurz VHD. Das aktuelle Format im Microsoft-Umfeld heißt VHDX und bietet einige Vorteile gegenüber dem Vorgängerformat. Nutzen Sie in Ihrer Umgebung noch VHD-Dateien, können Sie diese in VHDX-Dateien mit dem Convert-VHD-Cmdlet umwandeln. Der Vorteil des Befehls liegt darin, nicht nur VHD-Dateien in VHDX-Dateien umwandeln zu können, sondern auch den umgekehrten Weg zu gehen. Das heißt, Sie können die virtuelle Platte bei Bedarf wieder zurückkonvertieren, etwa um sie an ein anderes System zu hängen. Die Syntax des Befehls ist sehr einfach aufgebaut:

Convert-VHD -Path <Pfad zur VHD(X)-Datei> -DestinationPath <Pfad zur Zieldatei> 

Eine weitere Option ist die Möglichkeit, den Typ der Festplatte zu ändern, zum Beispiel mit:

Convert-VHD -Path <Pfad der VHD/VHDX-Datei> -DestinationPath <Zielpfad und Datei> -VHDType Differencing -ParentPath <Übergeordnete Festplatte> 

Neben der Möglichkeit, das Format von Festplatten in der PowerShell umzuwandeln, können Sie auch die Größe von Festplatten anpassen:

Resize-VHD -Path c:\vm\owa.vhdx -SizeBytes 1TB 

Neben diesen Spezialaufgaben können Sie auch einfach mit dem New-VHD-Cmdlet neue Festplatten erstellen und mit dem Get-VHD-Cmdlet Informationen zu den Festplatten anzeigen. Virtuelle Festplatten lassen sich in der PowerShell auch direkt mit virtuellen Servern verbinden:

Add-VMHardDiskDrive -VMName <VM> -Path <VHDX-Datei> 

Natürlich können Sie virtuelle Festplatten auch direkt am Host anbinden, zum Beispiel um Daten auf die virtuelle Platte zu kopieren und diese erst dann auf dem virtuellen Server anzubinden:

mount-vhd <VHD-Datei>

Mit unmount-vhd  trennen Sie die virtuelle Platte wieder vom System.

Auch physische Festplatten lassen sich in der PowerShell verwalten. Alle Befehle, die dazu zur Verfügung stehen, erhalten Sie mit

Get-Command -Module Storage | Sort Noun, Verb 

Um zum Beispiel die physischen Festplatten abzufragen, hilft der Get-PhysicalDisk-Befehl. Die Ausgabe zeigt auch an, ob sich die Platte in einem neuen Speicherpool anordnen lässt. Das erkennen Sie an der Option "CanPool" über den Wert "True".

Wer noch genauere Informationen möchte, gibt Get-PhysicalDisk |fl  ein. Durch Eingabe von Spalten nach "|fl" lassen sich erweiterte Informationen angeben und unwichtige ausblenden. Ein Beispiel dafür ist

Get-PhysicalDisk |fl FriendlyName, BusType, CanPool, Manufacturer, Healthstatus 

Mit Get-Disk  lassen Sie sich ebenfalls alle Festplatten anzeigen, während Sie mit Get-Disk <Nummer> | Get-Partition  Informationen über die Partitionierung erhalten. Das Cmdlet

 Initialize-Disk -DiskNumber <Nummer> 

initialisiert Festplatten in der PowerShell. Mit dem Kommando

New-Partition -DiskNumber <Nummer> -UseMaximumSize -AssignDriveLetter 

erstellen Sie eine neue Partition (auch auf virtuellen Festplatten) Um die neue Partition anschließend zu formatieren, verwenden Sie

Format-Volume -DriveLetterlt <Buchstabe> -FileSystem NTFS 

Sie können in der PowerShell aber nicht nur Speicherpools, virtuelle Festplatten und Partitionen erstellen, sondern diese Bereiche auch verwalten und erweitern. Um zum Beispiel die Ausfallsicherheit der verschiedenen virtuellen Festplatten anzuzeigen, verwenden Sie Get-ResilencySetting.

Weitere Befehle sind:

  • Add-PhysicalDisk -StoragePoolFriendlyName <Speicherpool>, um eine neue Festplatte hinzuzufügen.
  • Remove-VirtualDisk, um virtuelle Festplatten zu löschen.
  • Remove-StoragePool, um einen kompletten Speicherpool zu entfernen.
  • Repair-VirtualDisk  für die Reparatur von Speicherpools.
Bild 4: Die PowerShell-Version liefert Informationen zu Druckern und Druckjobs.
Bild 4: Die PowerShell-Version liefert Informationen zu Druckern und Druckjobs.

Druckerverwaltung mit PowerShell

Mit den Cmdlets, die wir im Folgenden vorstellen, lassen Sie sich Informationen zu Druckjobs und Druckern anzeigen und verwalten diese. Um eine Liste der installierten Drucker samt Treiber und Status zu erhalten, verwenden Sie das Get-Printer-Cmdlet. Möchten Sie zum Beispiel eine Liste anzeigen, die den Standort, Namen und Status anzeigt, verwenden Sie

Get-Printer | fl Name, Location, PrinterStatus

Sie können natürlich auch hier wieder mit Filtern arbeiten. Wenn Sie zum Beispiel alle Drucker in einem bestimmten Standort auflisten wollen inklusive Status, dann erweitern Sie den Befehl folgendermaßen:

Get-Printer | where Location -LIKE "<Gebaeude1>" | select Name, PrinterStatus | fl 

Auf diesem Weg lassen Sie sich auch die Drucker anzeigen, die gerade offline sind:

Get-Printer | where PrinterStatus -LIKE "Offline | fl 

Neben der Möglichkeit, Informationen zu den Druckern anzuzeigen, können Sie auch Einstellungen anpassen. Dazu übergeben Sie einfach Informationen, die das Get-Printer-Cmdlet ausgibt, an seinen Set-Printer-Kollegen:

Get-Printer | where Name -LIKE "<*Buha*>" | Set-Printer -Location "<Gebaeude1>" 

Um die Einstellungen von Druckern anzupassen, dient das Set-PrinterConfiguration-Cmdlet. Es hilft zum Beispiel beim Einstellen der Papiergröße, denn im Gegensatz zur grafischen Oberfläche können Sie auf diesem Weg für alle Drucker auf einem Druckserver die Papiergröße gleichzeitig festlegen:

Get-Printer | Set-PrintConfiguration -PaperSize A4 

Zusätzlich haben Sie die Möglichkeit, Informationen zur Konfiguration anzuzeigen. Dazu verwenden Sie das Get-PrinterConfiguration-Cmdlet. Auch dieses können Sie mit dem Get-Printer-Befehl verknüpfen, um zum Beispiel die Papiergröße der Drucker auf dem Server mit einem Befehl zu ermitteln:

Get-Printer | Get-PrintConfiguration |ft PrinterName, PaperSize 

Natürlich können Sie auch direkt auf die Aufträge der einzelnen Drucker zugreifen. So halten Sie die Jobs an, setzen sie fort, löschen diese und mehr. Auf Wunsch können Sie auch für alle Drucker alle Aufträge anzeigen und diese filtern lassen:

Get-Printer | Get-PrintJob | fl 

Möchten Sie Druckaufträge löschen, verwenden Sie das Remove-PrintJob-Cmdlet. Auch hier haben Sie die Möglichkeit, die Printjobs einzelner Drucker zu filtern und zu löschen:

Remove-PrintJob -PrinterName 
"<Name des Druckers>" -ID 1 

Serverrollen und Features verwalten

Serverrollen und Features machen Server erst zu dem, was sie später im Netzwerk sein sollen, und auch sie lassen sich über die PowerShell installieren. Mit Get-WindowsFeature Hyper-V*  zeigen Sie zum Beispiel an, ob die Rolle "Hyper-V" und die Verwaltungstools bereits installiert sind. Unter Windows Server können Sie mit "-computername" die vorhandene Installation auch auf Remoteservern im Netzwerk überprüfen.

Um beispielsweise Hyper-V oder die Verwaltungstools zu installieren, nutzen Sie Install-WindowsFeature. Mit Install-Win-dowsFeature Hyper-V  installieren Sie die Serverrolle, mit der Option "-IncludeManagementTools" inklusive der Verwaltungstools. Soll der Server gleich noch automatisch neu starten, verwenden Sie die Option "-restart". Die Verwaltungstools alleine installieren Sie mit Install-WindowsFeature Hyper-V-Tools.

Um diesen Setupprozess auf anderen Servern zu wiederholen, können Sie eine XML-Steuerungsdatei verwenden, die Sie im Assistenten zum Installieren von neuen Rollen im letzten Fenster speichern. Um auf einem anderen Server dann die gleichen Rollen und Features einzurichten, nutzen Sie die PowerShell und geben die XML-Datei mit. Dabei nutzen Sie das Install-WindowsFeature-Cmdlet mit der Option "-ConfigurationFilePath", zum Beispiel

Install-WindowsFeature -ConfigurationFilePath C:\Daten\iis.xml
Bild 5: Ein erfolgreicher Test der Installation eines neuen Domänencontrollers über die PowerShell.
Bild 5: Ein erfolgreicher Test der Installation eines neuen Domänencontrollers über die PowerShell.

PowerShell-Cmdlets für den AD-Betrieb

Kommen wir zu einer zentralen Komponente im Unternehmensnetzwerk, dem Active Directory (AD). Um die zugehörigen Server vorzubereiten und die Voraussetzungen für den Betrieb des Verzeichnisdienstes sicherzustellen, bietet die PowerShell diverse Cmdlets an. So testen Sie Domänencontroller (DC) mit den sich durch ihre Namen erklärenden Befehlen

  • Test-ADDSDomainController-Installation
  • Test-ADDSDomainController-Uninstallation
  • Test-ADDSDomainInstallation
  • Test-ADDSForestInstallation
  • Test-ADDSReadOnlyDomainControllerAccountCreation

Das Test-ADDSDomainControllerInstallation-Cmdlet ermöglicht das Testen der Voraussetzungen für die Installation eines DCs. Für schreibgeschützte DCs testen Sie die Voraussetzungen mit dem Test-ADDSReadOnlyDomainControllerAccountCreation-Befehl. Über das Test-ADDSDomainInstallation-Cmdlet prüfen Sie die Voraussetzungen für die Installation einer neuen Domäne im AD und mit dem Test-ADDSForestInstallation-Kommando erfolgt das Gleiche für eine neue Gesamtstruktur.

Damit Sie die Tests ausführen können, müssen Sie an verschiedenen Stellen noch Kennwörter eingeben. Diese akzeptiert das entsprechende Cmdlet aber nur als sichere Eingabe. Ein Beispiel für den Befehl ist:

Test-ADDSDomainControllerInstallation -Domainname <DNS-Name der Domäne> -SafeModeAdministratorPassword (read-host -prompt Kennwort -assecurestring) 

Um einen neuen Domänencontroller zu installieren, verwenden Sie das Install-ADDSDomainController-Cmdlet. Damit der Befehl funktioniert, geben Sie den Namen der Domäne mit und konfigurieren das Kennwort für den Verzeichnisdienst-Wiederherstellungsmodus als SecureString. Dazu tippen Sie den folgenden Befehl ein:

Install-ADDSDomainController 
-Domainname <DNS-Name der Domäne> -SafeModeAdministratorPassword (read-host -prompt Kennwort -assecurestring) 

Möchten Sie einen DC herunterstufen, kommt das UnInstall-ADDSDomainController-Cmdlet zum Einsatz. Sie müssen mindestens noch das lokale Kennwort des Administrators über den Befehl festlegen. Dieses definieren Sie als SecureString in der PowerShell:

 UnInstall-ADDSDomainController 
-LocalAdministratorPassword 
(read-host -prompt "Kennwort" -assecurestring) 

Mithilfe von get-help UnInstall-ADDSDomainController  erhalten Sie weitere Informationen zu dem Befehl. Sie können Server in der PowerShell auch benennen, neu starten und in Domänen aufnehmen. Dazu verwenden Sie die nachfolgenden Cmdlets:

  • Rename-Computer -Name <Computername>
  • Add-Computer -DomainName <Domänenname>
  • Restart-Computer

Auch für die Einrichtung der Replikation können Sie die PowerShell verwenden. Eine Liste der verfügbaren Befehle erhalten Sie durch get-command *adreplication*. Den Status der Replikation erfahren Sie auch in der PowerShell:

Get-ADReplicationUpToDatenessVectorTable <Name des Servers> 

Eine Liste aller Server liefert Ihnen:

Get-ADReplicationUpToDatenessVectorTable * | sort Partner,Server | ft Partner,Server,UsnFilter 

Um die einzelnen Standorte und deren DCs anzuzeigen, helfen diese beiden Cmdlets:

 Get-ADReplicationSite -Filter * | ft 
<Name> Get-ADDomainController -Filter * | ft <Hostname,Site> 

Die Replikationsverbindungen zeigt Ihnen das Get-ADreplicationconnection-Cmdlet. Um ausführliche Informationen zu den einzelnen Standorten zu auszulesen, ist der Befehl Get-ADReplicationSite -Filter * hilfreich. Weitere interessante Cmdlets in diesem Bereich sind:

  • Get-ADReplicationPartnerMetadata
  • Get-ADReplicationFailure
  • Get-ADReplicationQueueOperation
PowerShell-eigene Laufwerke

Neben den bekannten Dateisystemlaufwerken wie C: und D: bietet die PowerShell auch Laufwerke, die die Registrierungsstrukturen "HKEY_LOCAL_MACHINE" (HKLM) und "HKEY_CURRENT_USER" (HKCU), den Speicher für digitale Signaturzertifikate auf Ihrem Computer (Cert:) und die Funktionen in der aktuellen Sitzung (Function:) darstellen. Diese bezeichnet die Shell als "Windows PowerShell-Laufwerke". Eine Liste rufen Sie mit dem Befehl Get-PSDrive  auf. Um zum Beispiel in der lokalen Registry zum Schlüssel "HKEY_ CURRENT_USER" zu wechseln, geben Sie in der PowerShell CD hkcu:  ein. Den Inhalt des Registry-Hives zeigen Sie mit Dir  an.

Desired State Configuration

Eine wichtige Funktion in der PowerShell ist die Desired State Configuration (DSC). Darüber speichern Sie die Konfiguration von Systemdiensten und -einstellungen in Konfigurationsdateien und verteilen sie auf Ihren Servern. Einer der größten Vorteile von DSC ist die Möglichkeit, eine einheitliche Sicherheitsvorlage mit Einstellungen vorzugeben und dann im Netzwerk zu verteilen.

Wenden Sie diese Sicherheitseinstellungen auf die Server an, erhalten Sie identisch konfigurierte Server mit den von Ihnen gewünschten Serverrollen. Unternehmen erreichen dadurch einen einheitlichen Sicherheitsstandard und können diesen auch leichter dokumentieren. Änderungen auf den Servern verteilen Sie über die Vorlagendatei auf den Servern.

In der Vorlagendatei zur Absicherung des Betriebssystems können Sie hinterlegen, dass bei der Ausführung der Richtlinie auf einem Server bestimmte Dateien kopiert, Dienste gestartet oder installiert und Programme ausgeführt werden. Unsichere und nicht notwendige Dienste lassen sich beenden und damit Server absichern. Das kann zum Beispiel für Webserver-Farmen sinnvoll sein. Auch Registry-Änderungen führen Sie über diesen Weg durch, genauso wie Anpassungen an Gruppen und lokalen Benutzerkonten. Natürlich können Sie auch Skripte ausführen, die ebenfalls bestimmte Systemeinstellungen setzen oder anpassen. Erkennt PowerShell DSC Änderungen am System, die von der Vorlage abweichen, lässt sich die Vorlage erneut anwenden und der Server dadurch wieder absichern.

Der erste Schritt bei der Verwendung von DSC besteht im Erstellen einer Konfigurationsvorlage. Auf Basis dieser Konfigurationsdatei generieren Sie eine MOF (Management Object File)-Datei mit den Sicherheitseinstellungen. Diese wenden Sie anschließend über die PowerShell auf den Zielservern an. Der nächste Schritt ist das Anlegen eines Konfigurations-Skripts mit der Endung "ps1". Alternativ verwenden Sie die PowerShell Integrated Script Engine (ISE).

Ein Skript für DSC beginnt immer mit dem Schlüsselwort "Configuration" und einem von Ihnen definierten Namen. Diesen Namen benötigen Sie beim Erstellen der MOF-Datei und bei deren Anwendung. Die Befehle schreiben Sie dann zwischen zwei geschweifte Klammern. Bei der Anzahl an Befehlen sind Sie nicht an Vorgaben gebunden. Sie können entweder mehrere kleine oder eine große Skriptdatei erstellen.

Ein Beispiel für eine Verwendung von DSC ist die Überprüfung, ob Dateien des Webservers im Verzeichnis "inetpub" gespeichert sind und ob auf dem Server der IIS installiert ist.

Ergänzend hierzu können Sie bestimmte Daten von einem Quell- auf die Zielserver kopieren und so sicherstellen, dass auf allen Webservern die von Ihnen gewünschten Dateien vorhanden sind. Eine Beispieldatei zeigt das Listing "IIS mit DSC prüfen".

Listing: IIS mit DSC prüfen

Configuration MeineWebsite
{
  Node ("s1.contoso.int", "s2.contoso.int")
  {
  #IIS-Installation sicherstellen
WindowsFeature IIS
{
Ensure = "Present"
Name = "Web-Server"
  }
  #Existenz Webdateien sicherstellen
File Beispieldatei
  {
  Ensure = "Present"
  Type = "Directory"
  Recurse= $true
  SourcePath = "\\dc01\Daten"
  Destinationpath = "C:\inetpub\wwwroot"
  }
  }
}

Alle Listings zum Download auf github.com/it-administrator-mag/

In diesem Beispiel legen Sie über die Option "Node" den Namen derjenigen Server fest, auf denen Sie die von Ihnen gewünschten Einstellungen und Sicherheitsoptionen umsetzen wollen. Haben Sie in der Konfigurationsdatei die von Ihnen gewünschten Einstellungen vorgegeben, speichern Sie diese als PS1-Datei ab.

Sie können die Inhalte jederzeit anpassen, aus der Datei ein neues MOF-File erstellen und diese dann erneut an Server verteilen. Haben Sie die Datei abgespeichert, starten Sie das Skript entweder durch Eingabe des Namens in der PowerShell oder über das grüne Abspielzeichen in der PowerShell ISE.

Bild 6: Zum Einsatz von DSC bedarf es zunächst einer Konfigurationsdatei mit verschiedenen Konfigurationsblöcken.
Bild 6: Zum Einsatz von DSC bedarf es zunächst einer Konfigurationsdatei mit verschiedenen Konfigurationsblöcken.

Um zu testen, ob später die Umsetzung grundsätzlich auf den Zielservern funktioniert, führen Sie das Skript auf einem Ihrer Zielserver aus. Es darf hierbei keine Fehlermeldung erscheinen. Sie erhalten an dieser Stelle ansonsten auch keine Rückmeldung, sondern in der PowerShell wird einfach nur ein neuer Konfigurationscontainer mit Ihren Einstellungen erstellt.

Haben Sie die Steuer- oder auch Konfigurationsdatei angelegt, besteht der nächste Schritt darin, die Einstellungen aus der Konfigurationsdatei in eine MOF-Datei zu überführen. Dazu verwenden Sie den Befehl in der Form <Name der Konfiguration> -MachineName <Name des Servers, auf den die Datei angewendet werden soll>, also beispielsweise

MeineWebsite -MachineName "s2.contoso.int"

Erstellen Sie die MOF-Datei auf einem Zielserver, genügt es, nur den Namen der Konfiguration auszuführen, also in diesem Beispiel "meinewebsite". Der nächste Schritt besteht darin, dass Sie die Sicherheitskonfigurationen, die Sie festgelegt haben, auf den Zielservern ausführen.

Dazu verwenden Sie das Start-DscConfiguration-Cmdlet, um die MOF-Datei mit Ihren vorgegebenen Einstellungen auf den Server anzuwenden:

Start-DscConfiguration -Wait -Verbose -Path <.\MeineWebsite>

Um sicherzustellen, dass die Sicherheitskonfiguration Ihres Servers noch den Vorgaben aus der MOF-Datei entspricht, überprüfen Sie mit Test-DscConfiguration, ob es Unterschiede zwischen der vorgegebenen und der aktuellen Kon- figuration gibt.

Erhalten Sie als Rückmeldung das Ergebnis "True", stimmt das Ergebnis mit der Konfiguration der MOF-Datei überein, das Ergebnis "False" zeigt Abweichungen an. In diesem Fall wenden Sie die MOF-Datei erneut an, um sicherzustellen, dass die von Ihnen gewünschte Konfiguration aktiv ist.

Fazit

Wer sich einmal mit dem grundlegenden Aufbau der PowerShell-Cmdlets vertraut gemacht hat, durchsteigt die Logik dahinter schnell. Kombiniert mit den vorhandenen Hilfen sowie der Ergänzung unvollständiger Kommandos via Tabulator sind erste erfolgreiche Gehversuche in Sachen Automatisierung einfach möglich. Danach folgen ganze Skripte, die Sie in PS1-Dateien zusammenfügen und auf Ihren Rechnern im Netzwerk ablaufen lassen.

(jp)

FAQs

PowerShell ist eine von Microsoft entwickelte Kommandozeilen-Shell und Skriptsprache zur Automatisierung und Administration von Windows-, Server- und Cloud-Umgebungen. Administratoren nutzen sie unter anderem zur Benutzerverwaltung, Softwarebereitstellung, Systemkonfiguration und zur Automatisierung wiederkehrender Aufgaben.

Mit dem Cmdlet Get-Command erhalten Sie eine Übersicht aller verfügbaren Befehle. Kennen Sie nur einen Teil des Namens, helfen Platzhalter wie *, beispielsweise mit Get-Command *service* oder Get-Command *mailbox*. Für ausführliche Informationen und Beispiele stehen zudem Get-Help und Help <Cmdlet> -Examples zur Verfügung.

PowerShell-Skripte werden in Dateien mit der Endung .ps1 gespeichert und über .\Skriptname.ps1 ausgeführt. Damit Skripte gestartet werden können, muss gegebenenfalls die Ausführungsrichtlinie mit Set-ExecutionPolicy angepasst werden.

Ja. Mit PowerShell Remoting administrieren Sie Server und Clients über das Netzwerk. Nach dem Aktivieren von Enable-PSRemoting lassen sich Sitzungen beispielsweise mit Enter-PSSession oder New-PSSession aufbauen und Systeme zentral verwalten.

PowerShell eignet sich für nahezu alle Administrationsaufgaben – von der Verwaltung von Active Directory, Windows Server und Hyper-V über Datei-, Netzwerk- und Firewallverwaltung bis hin zu Backup, Desired State Configuration (DSC), Druckerverwaltung sowie der Automatisierung komplexer Workflows mit Skripten.

PowerShell ermöglicht eine konsistente und reproduzierbare Verwaltung von IT-Systemen. Durch Skripte, Remoting und objektbasierte Befehlsausgaben lassen sich wiederkehrende Aufgaben automatisieren, Fehler reduzieren und auch große Windows- und Hybrid-Umgebungen effizient administrieren.

Hier geht es zur Themenseite