Skip to the main content.

ScriptRunner Blog

Windows-PowerShell verstehen

Inhaltsverzeichnis

Post Featured Image

Die PowerShell stellt mittlerweile ein zentrales Werkzeug für Microsoft-Umgebungen dar. Mit der PowerShell lassen sich Befehle direkt in einer Shell-Sitzung auf lokalen Rechnern, aber auch über das Netzwerk ausführen.

Dadurch können so gut wie alle Windows-Einstellungen gescriptet werden. Neben Windows unterstützen mittlerweile auch die meisten anderen Microsoft-Produkte die PowerShell. Aber nicht nur Microsoft-Produkte, auch viele Produkte von Drittherstellern bieten Erweiterungen für die PowerShell an. Selbst Clouddienste wie Microsoft Azure und Amazon Web Services (AWS) unterstützen die Steuerung mit der PowerShell. Dazu können Sie von lokalen Rechnern aus mit der PowerShell die verschiedenen Clouddienste steuern.


 

PowerShell Core versus PowerShell

Microsoft bietet mit der PowerShell Core eine neue Version der PowerShell an, die auch auf Linux und MacOS installiert werden kann. Sie können also mit der PowerShell sehr umfassend im Netzwerk die verschiedenen Betriebssysteme und Serveranwendungen steuern. PowerShell Core ist Opensource, das heißt die Software muss nicht gekauft werden.  Der Download erfolgt über das PowerShell GitHub repository.

Installieren lässt sich PowerShell Core auf Windows-Rechnern ab Windows 7. PowerShell Core kann aber auch in Docker-Containern verwendet werden. Wie bei der herkömmlichen PowerShell in Windows lassen sich in der PowerShell Core Befehle mit dem get-command Cmdlet anzeigen.

Die PowerShell kann über den Befehl powershell in SSH-Sitzungen gestartet werden. Beim Einsatz von PowerShell Core wird der Befehl pwsh verwendet. PowerShell-Cmdlets sind in PowerShell-Module zusammengefasst. Eine Liste aller Module lässt sich mit dem Befehl Get-Module -ListAvailable anzeigen.

Der Quelltext-Editor Visual Studio Code (VSCode) erlaubt die Entwicklung von plattformübergreifenden Apps und Anwendungen. Visual Studion Code eignet sich für die Entwicklung von Webanwendungen, kann aber auch als integrierte Entwicklungsumgebung für die PowerShell genutzt werden. Dazu wird die PowerShell Extension für VS-Code benötigt.

 

PowerShell starten

Die PowerShell starten Sie entweder über die entsprechende Verknüpfung im Startmenü oder durch Eingabe von powershell in einem Eingabeaufforderungsfenster, PowerShell Core wird mit pwsh gestartet.  Mit dem Befehl ise starten Sie die PowerShell Integrated Scripting Environment (ISE). Dabei handelt es sich um die Entwicklungsumgebung der PowerShell in Windows, mit der Sie Scripte in der PowerShell erstellen und testen können.

Der Vorteil der PowerShell ISE ist, dass diese beim Eingeben von Befehlen bereits Vorschläge für Cmdlets unterbreitet, die Sie auswählen können. Die Technik wird auch als IntelliSense bezeichnet. Außerdem sind die Befehle farblich hervorgehoben, sodass sich die einzelnen Optionen besser unterscheiden lassen. Geben Sie im oberen Bereich Befehle ein, werden diese nicht sofort ausgeführt, sondern wie in einem normalen Script zunächst aufgelistet. Sind Sie fertig mit der Eingabe der Befehle, können Sie deren Ausführung starten, indem Sie auf das grüne Abspielsymbol mit der QuickInfo Skript ausführen klicken.

Das Cmdlet Show-Command blendet in der herkömmlichen PowerShell ein neues Fenster mit allen Befehlen ein, die in der PowerShell verfügbar sind. Dabei wird ein Teil des PowerShell Integrated Scripting Environment (ISE)-Fensters genutzt. Sie können im Fenster nach Befehlen suchen und sich eine Hilfe zum Befehl sowie Beispiele anzeigen lassen.

PowerShell Screenshot

Mit dem Cmdlt Show-Command rufen Sie ein Dialog-Fenster auf, in dem Ihnen alle verfügbaren PowerShell Cmdlets zu Auswahl stehen.

Die PowerShell blendet alle verfügbaren Befehle ein.

Zum Schutz von Windows enthält die PowerShell verschiedene Sicherheitsfeatures, zu denen auch die Ausführungsrichtlinie zählt. Die Ausführungsrichtlinie bestimmt, ob Scripts ausgeführt werden dürfen, und ob diese digital signiert sein müssen. Standardmäßig blockiert die PowerShell Scripts in der PowerShell, die nicht signiert sind. Sie können die Ausführungsrichtlinie mit dem Cmdlet Set-ExecutionPolicy ändern und mit Get-ExecutionPolicy die Einstellungen anzeigen. Dabei stehen folgende Einstellungen zur Verfügung:

  • Restricted – Keine Scripts erlaubt.
  • AllSigned – Nur signierte Scripts sind erlaubt.
  • RemoteSigned – Bei dieser Einstellung müssen Sie Scripts durch eine Zertifizierungsstelle signieren lassen. Diese Einstellung ist die Standardeinstellung in Windows Server 2016/2019.
  • Unrestricted – Mit dieser Einstellung funktionieren alle Scripts.

 

Einstieg in die PowerShell

Geben Sie Get-Command ein, sehen Sie alle Befehle, welche die PowerShell zur Verfügung stellt. Die wenigsten Anwender kennen alle Cmdlets und deren verschiedenen Optionen, die Microsoft zur Verfügung stellt. Über Get-Command  > C:\\befehle.txt lenken Sie alle Befehle in die Datei C:\\befehle.txt um.

Mit dem Befehl Update-Help lassen Sie die Hilfedateien der PowerShell über eine bestehende Internetverbindung aktualisieren. Wenn Sie für das Cmdlet Get-Help die Option -Online verwenden, zum Beispiel mit Get-Help Get-Command -Online, öffnet sich ein Browserfenster mit einer ausführlichen Hilfe zum Befehl.

Für nahezu alle Cmdlets gilt, dass diese in vier Arten vorliegen: Es gibt Cmdlets mit dem Präfix New-, um etwas zu erstellen, zum Beispiel New-Item. Das gleiche Cmdlet gibt es dann immer noch mit Remove-, um etwas zu löschen, zum Beispiel Remove-Item. Wollen Sie das Objekt anpassen, gibt es das Präfix Set- zum Beispiel Set-Item. Zuetzt gibt es noch das Cmdlet Get-, zum Beispiel Get-Item, um Informationen zum Objekt abzurufen. PowerShell Cmdlets sollen also aus einem der „erlaubten“ Verben und einem Substantiv im Singular bestehen, getrennt mit einem Bindestrich. Die Liste der erlaubten Verben erhält man mit Get-Verb. Es sollte die Camel Case-Schreibweise verwendet werden.

 

Computer mit der PowerShell überwachen und verwalten

Die PowerShell bietet eine ausführliche Hilfe an. Haben Sie nur den Teil eines Befehls in Erinnerung, können Sie mit dem Platzhalter * arbeiten. Der Befehl Get-Command *computer zeigt zum Beispiel alle Cmdlets an, deren Namen mit „computer“ endet. Ist der gesuchte Befehl nicht dabei, können Sie auch mehrere Platzhalter verwenden, zum Beispiel den Befehl Get-Command *computer*“. Dieser Befehl zeigt alle Befehle an, in denen an einer beliebigen Stelle das Wort „computer“ vorkommt. Sie können in der PowerShell auch mit den physischen Laufwerken auf dem PC arbeiten. Um zum Beispiel die physischen Festplatten abzufragen, hilft der Befehl Get-PhysicalDisk.

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. Das funktioniert mit allen Get-Cmdlets. Mit Get-Disk lassen Sie sich ebenfalls alle Festplatten anzeigen. Die Partitionierung lassen Sie mit Get-Disk | Get-Partition anzeigen.

Eine häufige Administrationsaufgabe ist die Verwaltung der laufenden Prozesse auf einem Computer. Auch dazu können Sie die PowerShell verwenden. Über den Befehl Get-Process können Sie sich alle laufenden Prozesse eines Computers anzeigen. Wollen Sie aber zum Beispiel nur alle Prozesse mit dem Anfangsbuchstaben „S“ angezeigt bekommen, geben Sie den Befehl Get-Process s* ein. Sollen die Prozesse zusätzlich noch sortiert werden, zum Beispiel absteigend nach der CPU-Zeit, geben Sie Get-Process s* gefolgt von dem Pipe-Operator |Sort-Object cpu -Descending ein. Bei diesem Vorgang wird das Ergebnis eines Cmdlets an ein weiteres Cmdlet weitergegeben, dass die Verarbeitung weiterführt.

Mit Get-Cmdlets lassen Sie sich Informationen zu Objekten anzeigen. Die Eingabe |fl formatiert die Ausgabe. Dabei handelt es sich um das Cmdlet Format-List, welches das Ergebnis eines Cmdlets formatiert und in der PowerShell anzeigt. Wollen Sie nicht alle Informationen, sondern nur einzelne Parameter anzeigen, können Sie diese nach |fl Komma getrennt anordnen. Dazu geben Sie einfach eine der Spalten an, die Sie mit dem Get-Cmdlet abgefragt haben.

Neben diesen Cmdlets gibt es natürlich noch viele andere, zum Beispiel Start- und Stop- oder Export- und Import-Cmdlets. Dienste können Sie zum Beispiel in der PowerShell mit Start-Service, Stop-Service, Get-Service und Set-Service starten und beenden.

 

Die PowerShell über das Netzwerk nutzen

Über den Menübefehl Datei/Neue Remote-PowerShell-Registerkarte können Sie in der PowerShell ISE eine PowerShell-Sitzung zu einem anderen Computer im Netzwerk aufbauen.

PowerShell Screenshot

Die Funktion „Neue Remote-PowerShell-Registerkarte“ finden Sie unter dem Menüpunkt „Datei“ in der PowerShell-Konsole

 

In der PowerShell ISE eine Remoteverbindung öffnen

Damit dies funktioniert, müssen Sie auf dem Zielcomputer die Remoteverwaltung aktivieren, zum Beispiel über die Eingabeaufforderung mit winrm quickconfig. Mit Enable-PSRemoting -force kann die Remoteverwaltung in der PowerShell ebenfalls aktiviert werden. Der Befehl aktiviert auch die Ausnahmen in der Windows Defender-Firewall. Mit Disable-PSRemoting -Force können Sie die Remoteverwaltung eines Computers über die PowerShell wieder deaktivieren. Sie müssen für solche administrativen Befehle die PowerShell mit Administratorrechten starten, zum Beispiel über das Kontextmenü des PowerShell-Icons im Startmenü. In Remote-PowerShell-Sitzungen können Sie die gleichen Cmdlets verwenden, die auch auf dem lokalen Computer genutzt werden können.

Es gibt auch Cmdlets, die Sie lokal starten, die aber Befehle auf Remote-Computern ausführen ohne, dass Sie vorher eine RemotePowerShell-Sitzung aufgebaut haben.  Allerdings erlauben nicht alle Cmdlets eine Remoteverwaltung. Sie sehen 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 dieser Cmdlets anzeigen. Wollen Sie von einer lokalen PowerShell-Sitzung über das Netzwerk Programme auf einem Remotecomputer starten, verwenden Sie zum Beispiel folgenden Befehl:

Invoke-Command -ComputerName -ScriptBlock { } -credential

Lesen Sie unseren Artikel Erste Schritte mit PowerShell-Remoting für mehr Details und eine Schritt-für-Schritt-Anleitung.

 

Scripts mit der PowerShell ISE erstellen

Wenn Sie immer wieder bestimmte Befehlsfolgen ausführen oder ein PowerShell-Script für eine komplexe Aufgabe entwickeln, empfiehlt es sich, die Befehle nicht einzeln einzugeben, sondern in einer Datei zu speichern. Die Dateierweiterung für Windows PowerShell-Scripts lautet .ps1 (das dritte Zeichen der Dateierweiterung ist die Zahl 1).  Sie müssen zum Starten eines Scriptes immer einen vollqualifizierten Pfad zu der Scriptdatei angeben, auch wenn sich das Script im aktuellen Ordner befindet. Wollen Sie zum Beispiel das Script test.ps1 im aktuellen Ordner starten, müssen Sie .test.ps1 eingeben. Auch das Menü „Datei“ spielt eine Rolle. Denn hier laden Sie PowerShell-Scripte in die ISE. Die PowerShell zeigt jedes geöffnete Script in der ISE als eigene Registerkarte an. Die ISE gliedert sich in der Standardansicht in zwei Bereiche: den Script Pane, (dem Quelltexteditor) oben und der PowerShell Console unten. Sind Sie fertig mit der Eingabe der Befehle, können Sie deren Ausführung starten, indem Sie auf das grüne Abspielsymbol mit der QuickInfo „Skript ausführen“ klicken.

Über den Menüpunkt „Ansicht“ können Sie die verschiedenen Bereiche des ISE an Ihre Bedürfnisse anpassen und die Anordnung ändern. So lässt sich zum Beispiel der Bereich zum Erstellen von Scripts an der rechten Seite anordnen. Scripte sind generell recht einfach aufgebaut. Sie müssen die einzelnen Befehle nur untereinanderschreiben. Dazu können Sie entweder die PowerShell ISE oder einen anderen Editor verwenden.

Sie können PowerShell Scripte während der Ausführung bearbeiten und so Fehler beheben. Laden Sie ein Script über „Datei/Öffnen“, so sehen Sie im Befehlsfenster dessen Bestandteile. Um eine Pause (Haltepunkt) im Script festzulegen, markieren Sie eine Zeile im Script, und wählen den Menüpunkt „Debuggen/Haltepunkt umschalten“.

 

PowerShell Direct – Virtuelle Betriebssysteme steuern

Mit PowerShell Direct können Sie auf Windows-Servern und auf Rechnern mit Windows 10 über PowerShell-Sitzungen auf einem Hyper-V-Host auf VMs des Hosts zugreifen und Aktionen durchführen. Dazu muss auf dem Host aber Windows Server 2016/2019 installiert sein. Auch in den VMs ist Windows 10 oder Windows Server 2016/2019 notwendig. Um eine Sitzung zu starten, geben Sie in der PowerShell-Sitzung auf dem Host einen der folgenden Befehle ein:

Enter-PSSession -VMName
Invoke-Command -VMName -ScriptBlock { Commands }

Für die erfolgreiche Verbindung müssen Sie sich an der Sitzung erst authentifizieren. Wollen Sie sich mit einem anderen Benutzer authentifizieren, verwenden Sie Enter-PSSession -VMName -Credential . Mit Exit-Session beenden Sie diese Sitzung wieder. Sie können in Windows auch Sitzungen unterbrechen und erneut aufbauen. Bei unterbrochenen Sitzungen laufen die Cmdlets in der Sitzung weiter. Dazu nutzen Sie die Cmdlets Disconnect-PSSession, Connect-PSSession und Receive-PSSession.

 

Netzwerkeinstellungen mit der PowerShell steuern

Die PowerShell kann auch zur Konfiguration der Netzwerkeinstellungen genutzt werden. Dazu stehen Cmdlets wie New-NetIPAddress und Get-NetIPConfiguration zur Verfügung. Ein Beispiel für die Einrichtung ist:

New-NetIPAddress -InterfaceIndex 12 -IPAddress 192.168.178.2 -PrefixLength 24 -DefaultGateway 192.168.178.1

DNS-Server tragen Sie mit Set-DNSClientServerAddress -InterfaceIndex 12 -ServerAddresses 192.168.178.4 ein. Mehrere DNS-Server trennen Sie jeweils mit einem Komma. Das Cmdlet Set-DnsClientServerAddress -InterfaceIndex 12 -ResetServer wechselt zu DHCP. Achten Sie darauf, jeweils die korrekte Indexnummer für den Netzwerkadapter zu verwenden. Diesen erhalten Sie mit Get-NetIPConfiguration. Sie können Server auch in der PowerShell benennen, neu starten und in Domänen aufnehmen. Dazu verwenden Sie die Cmdlets

Rename-Computer -Name [Computername]
Add-Computer -DomainName [Domänenname]
Restart-Computer

Das Cmdlet Test-Connection kann Netzwerkverbindungen testen.  Test-Connection kann auch mehrere Rechner auf einmal testen. Dazu geben Sie den Befehl ein, gefolgt von einer Liste der Rechner, die Sie überprüfen wollen. Wollen Sie den Befehl in eine Zeile schreiben, zum Beispiel für Scripte, verwenden Sie die Syntax:

Test-Connection -Source , -ComputerName , Ziel2>

Mit dem Befehl können Sie von mehreren Quell-Computern aus mehrere Ziel-Computer scannen lassen. Sie können aber auch nur einen Rechner testen, indem Sie Test-Connection eingeben.

Wollen Sie eine Namensauflösung für einen Server mit allen notwendigen Host-Einträgen, TTL und IP-Adressen durchführen, geben Sie resolve-dnsname ein.

Resolve-DnsName -type all zeigt Informationen zur DNS-Zone an.

Um den Namen eines Computers auf Basis der IP-Adresse aufzulösen, verwenden Sie Resolve-DnsName. Anschließend zeigt die PowerShell die gefundenen Rechner sowie die dazugehörige Reverse-Lookup-Zone an.

Resolve-DnsName kann auch DNS-Namen über das Internet auflösen lassen, zum Beispiel mit Resolve-DnsName www.google.de. Wollen Sie nur die IPv4-Adressen anzeigen, nutzen Sie (Resolve-DnsName www.google.de).ip4address.

 

 

Zusammenhängende Posts

5 min read

Microsoft Exchange mit PowerShell managen

2 min read

VMUG Webcast: VMware Management meistern mit PowerCLI

Über den Autor: