Einstieg in die PowerShell - Scripting 101
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.
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.
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.
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.
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*.
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-VirtualDiskfür die Reparatur von Speicherpools.
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
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
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".
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.
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)
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.
