Dieser Artikel ist nur ein kleiner Überblick der mächtigen PowerShell. Die PowerShell wurde von Microsoft entwickelt um administrative Aufgaben effizienter erledigen zu können und um eine zentrale, einheitliche Schnittstelle zu bieten. Für viele neue Microsoft Produkte ist die PowerShell unabdingbar (z.B. Microsoft Exchange 2010).
Allgemeines
Die PowerShell besteht aus kleinen Einheiten die sich Cmdlets nennen. Die Kommandos sind alle nach dem Schema Verb-Substantiv aufgebaut, z.B. get-help. Groß-/Kleinschreibung spielt keine Rolle. Für bestimmte Kommandos und Cmdlets gibt es Aliase.
Wichtige Kommandos
Kommando/Cmdlet | Beschreibung |
get-help | Zeigt die Hilfe an |
get-help <Kommando/Cmdlet> | Zeigt die Hilfe zu einem Kommando/Cmdlet an |
get-variable | Zeigt alle gesetzten Variablen an |
get-alias | Zeit alle gesetzten Aliase an |
get-module -ListAvailable | Zeigt vorhandene Module an |
import-module <modulname> | Importiert das Modul in die aktuelle Sitzung (z.B. import-module activedirectory) |
get-command | Zeigt die verfügbaren Kommandos / Cmdlets an |
sort-object | Sortieren einer Datenmenge |
select-object | Einen bestimmten Bereich selektieren (z.B. select-object -First 3) |
export-csv | Datenmenge in CSV exportieren |
get-psdrive | Zeigt PowerShell Laufwerke an |
invoke-command | Kommandos Remote auf anderen Server ausführen |
enable-psremoting | Aktiviert Remote Power Shell |
new-pssession | Baut eine Verbindung zu einem Remote Power Shell Server auf |
enter-pssession | Geht in die Remote Verbindung rein |
exit-pssession | Verlässt die Remote Session |
get-credential | Frägt über einen Popup Anmeldeinformationen ab wenn man nicht die Sitzungsanmeldeinformationen verwenden will |
get-aduser <username> | Frägt aus dem AD Informationen über einen User ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
get-adobject <filter> | Frägt ein Objekt aus dem AD ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
get-adcomputer <computer> | Frägt aus dem AD Computerinformationen ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
set-adaccountpassword | Setzt Passwort für einen User (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
Vergleichs- und Verknüpfungsoperatoren
Operator | Beschreibung |
-eq | (equal) gleich |
-ne | (not equal) nicht gleich |
-gt | (greater than) größer als |
-lt | (less than) kleiner als |
-ge | (greater equal) größer gleich |
-le | (less equal) kleiner gleich |
-like | wie .z.B. „a*“ |
-notlike | nicht wie z.B. „a*“ |
-match | „^ABC“ (Regex) |
-AND | und |
-OR | oder |
-NOT | nicht |
Beispiel: get-service
get-service gibt den Status der Prozesse zurück.
Will man jetzt z.B. nur Dienste sehen die sich im Status „Running“ befinden so kann man das Ergebnis an ein anderes Kommando pipen.
get-service | where-object {$_.status -eq "running"}
Das Resultat:
Alternativ für where-object gibt es einen Alias der „?“ heißt. Also wäre auch folgender Befehl möglich:
get-service | ? {$_.status -eq "running"}
Das ganze lässt sich mit einem Verbindungsoperator noch erweitern:
get-service | ? {($_.name -like "A*") -AND ($_.status -like "run*")}
Als Resultat bekommen wir alle Prozesse die mit A…. beginnen und laufen.
Jetzt können wir uns noch alle Prozesse mit A ausgeben lassen und diese absteigend sortieren.
get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending
Die Ausgabe können wir jetzt noch auf 3 Resultate beschränken:
get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending | select-object -First 3
Das können wir jetzt noch in eine CSV Datei exportieren:
get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending | select-object -First 3 | export-csv -path export.csv
Inhalt export.csv:
#TYPE System.ServiceProcess.ServiceController "Name","RequiredServices","CanPauseAndContinue","CanShutdown","CanStop","DisplayName","DependentServices","MachineName","ServiceName","ServicesDependedOn","ServiceHandle","Status","ServiceType","Site","Container" "AudioEndpointBuilder","System.ServiceProcess.ServiceController[]","False","False","True","Windows Audio Endpoint Builder","System.ServiceProcess.ServiceController[]",".","AudioEndpointBuilder","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Running","Win32ShareProcess",, "AudioSrv","System.ServiceProcess.ServiceController[]","False","False","True","Windows Audio","System.ServiceProcess.ServiceController[]",".","AudioSrv","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Running","Win32ShareProcess",, "AppMgmt","System.ServiceProcess.ServiceController[]","False","False","False","Application Management","System.ServiceProcess.ServiceController[]",".","AppMgmt","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Stopped","Win32ShareProcess",,
PowerShell Drives
In der PowerShell kann man auf verschiedene Daten über das Filesystem zugreifen. Darunter sind unter anderem der Certificate Store und die Registry.
get-psdrive cd HKLM: cd .\SOFTWARE dir
Remote PowerShell
In der PowerShell ist es möglich einen RemoteAccess zu aktivieren. Einmal aktiviert bleibt er auch aktiviert, er lässt sich aber wieder abschalten. Der PowerShell Remote Service läuft auf 2 TCP Ports. TCP/5985 ohne SSL und TCP/5986 mit SSL.
Aktivieren der Remote Shell:
enable-psremoting
Die beide Abfragen mit „Y“ bestätigen, eine automatische Firewallregel wird installiert.
Es gibt 2 Möglichkeiten mit der Remote PowerShell zu arbeiten.
1. Wir können ein Kommandosatz übermitteln und das Ergebnis verarbeiten
invoke-command -computername romulus.thoma.local -scriptblock {get-service}
2. Wir können uns eine vollständige Remote Shell öffnen
new-pssession -computername romulus
Nach dem Verbindungsaufbau muss man in die Session einsteigen
enter-pssession 1
Am Beginn der Zeile steht jetzt der Hostname der Remotemaschine. Um die Remotemaschine zu verlassen benötigt man folgendes Kommando:
exit-pssession
Die Sessions verschwinden nach 15 Minuten von alleine, wer nicht warten will kann mit
remove-pssession 1
die Session löschen.
Mit anderen Credentials Remote anmelden
Es gibt 2 verschiedene Möglichkeiten Credentials mitzugeben.
1. Im Script
Windows benötigt gehashte Passwörter für die Anmeldung.
$secpasswd = Convert-To-SecureString "1q2w3e4r%T" -AsPlainText -Force $username="max" $mycreds = new-object system.management.automation.pscredential ($username, $secpasswd) invoke-command -credential $mycreds -computername romulus.thoma.local -scriptblock {get-service}
2. Per Popup
$mycreds = get-credential invoke-command -credential $mycreds -computername romulus.thoma.local -scriptblock {get-service}