PowerShell
- Powershell 5 - alte original MS Powershell (in Windows Desktop und Server, im Startmenue oder Aufruf "powershell")
- Powershell 7.1 - aktuelle quelloffene Powershell Core, muß nachgeladen werden im MS Store oder bei Github, Aufruf mit "pwsh".
basiert auf (quelloffener) .NET Plattform
läuft unter MacOS, Linux und Windows
als Script-Editor/Debugger dient MS Visual Studio Code
Powershell (5) ISE als Admin starten! (aus der Powershell heraus: "ise")
- Script-Ausführung dauerhaft aktivieren: Set-ExecutionPolicy RemoteSigned
(nur noch PS1 aus dem Internet oder ohne vertraute Signatur werden geblockt)
Mehr Infos mit help about_Execution_Policies (Bypass / Restricted)
- Script remote ausführen: Enable-PSRemoting
- $PSVersionTable - Version
- update-help -> zuerst ausführen! (aktualisiert die Hilfe, dauert Minuten)
- get-help -> Hilfe allgemein
- help Befehl -> Hilfe zum Befehl
- help Befehl -detailed -> detaillierte Hilfe zum Befehl
- help about_* -> Hilfe zum PS-Konzept
- get-command -> Liste aller Befehle
- # - Kommentarzeile
- <# ... #> - Kommentarblock, auch mehrzeilig
- get-(befehl) -example -> zeigt Beispiele
- Get-Module -listavailable - zeigt alle installierten Module
In der Powershell lassen sich alle externen .exe-Kommandos wie robocopy oder bcdedit, netsh, notepad usw. aufrufen.
Die meisten CMD-Befehle wie cd, md, dir, del funktionieren auch.
Viele weitere PS-Module in der MS PowerShell Gallery.
Ausgabebefehle:
- Write-Host - (auch farbig oder mit formatierten Arrays möglich)
- Write-Output (echo) - einfache Ausgabe
- Write-Error - gibt Fehlermeldungen aus
Add-On Menue / Webseite mit AddOns öffnen: praktische AddOns!
- MS Script Browser: durchsucht Poswershell Scripte nach Stichworten
Beispiele:
- Get-Prozess - Liste aller Prozesse. (Parameter "*edge" schränkt auf Edge-Prozesse ein)
- Get-Member - liefert Bestandteile eines vorher genannten Objektes.
- Get-Prozess firefox | Get-Member - liefert alle verfügbaren Attribute
Format-List oder Format-Table - liefert formatierte Felder des vorher genannten Objektes - Get-Process firefox | Format-List Name, WorkingSet - liefert Speicherverbrauch aller Firefox-Instanzen
- Get-Process firefox | Measure WorkingSet -Sum - liefert die Summe des Speicherverbrauch aller Firefox-Instanzen
- Get-Service (gsv) - Liste aller installierten Services. (mit Status)
Where - Filter, kann mit "?" abgekürzt werden
-eq prüft auf Gleichheit (ne - ungleich, -gt - größer als, -lt - kleiner als, -ge -größer/gleich, -le - kleiner/gleich) - Get-Service | Where Status -eq Running - alle laufenden Dienste
- Get-Service veeam* | Stop-Service - stoppt alle Dienste, die mit Veeam beginnen
Sort-Objekt (sort) - sortiert das übergebene Objekt
dir | sort Length -descending - Get-Date - Datum mit allen Objekten (Tag, Monat, Stunde, Tag des Jahres, Tag der Woche...)
New-Timespan - zum Berechnen von Tagesdifferenzen - Get-AD... Feature installieren
• Get-WindowsCapability -Name RSAT.ActiveDirectory* -Online | Add-WindowsCapability -Online
• Install-WindowsFeature -Name “RSAT-AD-PowerShell” -IncludeAllSubFeature - Get-Aduser -Filter * -Properties Name, PasswordNeverExpires | Where-Object {$_.PasswordNeverExpires -like "True"} | Format-Table - liste aller AD-User, deren Kennworte nie ablaufen
- Get-Aduser -Filter * -Properties LastLogonDate | Where-Object {$_.LastLogonDate -ne $null -and $_.LastLogonDate -lt (Get-Date).AddDays(-180)} | Sort-Object LastLogonDate - listet AD-User, die länger als 180 Tage nicht angemeldet waren
- Get-VM ... HyperV Modul installieren
•Install-WindowsFeature -Name Hyper-V-PowerShell
Variablen müssen nicht definiert werden.
Groß- und Kleinbuchstaben werden nicht unterschieden.
Jedes PS-Fenster hat seine eigenen Variablen, die beim Schließen des Fensters gelöscht werden.
$antwort = 5 * 3
$1woche = (Get-Date) - (New-TimeSpan -Days 7)
$kannweg = dir *.log | WHERE LastWriteTime -lt $1woche
Liefert Liste aller Log-Dateien > 1 Woche
Die Variable kann wieder in eine Filter-Pipeline übergeben werden.
$platz = $kannweg | measure Length -Sum
Berechnung mit der Eigenschaft "Sum" des Objektes "$platz".
$MByte = $platz.Sum / (1024*1024)
Mit dieser Methode kann auf alle Objekte zugegriffen werden.
$Jahr = (Get-Date).Year
Remove-Item (del) - löscht Datei
$kannweg | Remove-Item - löscht die oben definierte Liste in $kannweg
ForEach.Object (foreach oder %) - Schleife
$kannweg | % { move $_ e:\temp\test } - verschiebt Dateien aus "$kannweg" nach e:\temp\test
{} - umschließt Script-Block
Ruft nacheinander für jeden Eintrag von "$kannweg" den Script-Block auf.
Zuvor speichert es den aktuellen Eintrag von $kannweg in die Variable "$_", die als Platzhalter genutzt werden kann.
Auch WHERE nimmt Script-Block entgegen.
Get-Process | where {$_.Company -match 'Microsoft'} oder
Get-Process | where {$_.Company -match 'Microsoft' -and $_.WS -ge 10*1024*1024} - liefert Prozesse vom MS > 10MB
Die Powershell bildet REG-Schlüssel, Zertifikatsspeicher, Umgebungsvariablen als PSDrives ab.
Get-PSDrive - Liste aller PSDrives.
cd "HKCU:\Control Panel\Desktop\" - wechselt in den REG-Schlüssel, Anzeige mit "dir"
Get-Item-Property (gp) - liest Eigenschaften des angegebenen Objektes
gp . WallPaper - liefert Dateinamen des Bildschirmschoners.
Set-Item-Property (sp) - schreibt Eigenschaften des angegebenen Objektes
Remove-Item-Property (rp) - löscht Eigenschaften des angegebenen Objektes
help Registry - liefert Liste aller zur REG-Bearbeitung interessanten Befehle
get-childitem -path hklm:\software - Softwareliste
(get-childitem -path hklm:\software).Property - Softwareliste gefiltert
cd "Env:" - wechselt in Umgebungsvariablen. Hier geht wieder dir, gp, sp, rp...
$env:path - Inhalt von Umgebungsvariable %PATH%
$env:temp - Inhalt von Umgebungsvariable %TEMP%
Kontrollstrukturen:
(While, Do-While, Do-Until, For, Foreach)
if (Bedingung)
{ Befehle }
elseif (Bedingung)
{ Befehle }
else
{ Befehle }
IF (Test-Path "$env:TEMP\error.log") ... - prüft die Existenz eines Datei- oder Ordnernamens
Funktionen:
function NAME
{ bla, bla }
Aufruf einfach mit "NAME".
Funktionen können Parameter übergeben bekommen, für die man Defaults setzen kann.
Rückgabewerte per "return WERT" - beendet Schleife und Funktion sofort
function LogsLöschen($Ordner = ".", $Alter = 7)
{
$datum = (Get-Date) - (New-TimeSpan -Days $Alter)
dir "$Ordner\*.log" | ? LastWriteTime -lt $datum | Remove-Item
}
Aufruf ist möglich mit oder ohne Parameter, auch nur Parameter2 (Bsp. 4):
LogsLoeschen
LogsLoeschen Temp
LogsLoeschen Temp 30
LogsLoeschen -Alter 14
Beispielfunktion mit Array/Liste und Return, formatiert Zahlen übersichtlich und mit Einheit.
- return "{0:f2} - erstes Argument (0) wird als Gleitkommazahl mit 2 Nachkommastellen ausgegeben
- -f $Wert, $units[$unit] - formatierte Ausgabe
function BinFormat($Wert)
{
$units = "", "Kilo", "Mega", "Giga", "Tera", "Peta", "Exa", "Zetta", "Yotta"
$unit = 0
while($Wert -ge 1024 -and $unit -lt $units.Length - 1)
{
$Wert = $Wert / 1024
$unit++
}
return "{0:f2} {1}" -f $Wert, $units[$unit]
}
Externe PS-Scripts lassen sich einbinden mit ". MeineFunktionen.ps1".
Alle beim PS-Start per Default ausgeführtenScripts erfährt man mit:
$profile | fl * -Force
Dabei gibt es Scripts für AllUser und CurrentUser, die entsprechend ergänzt werden können.
"CurrentHost" ist nur die aktuelle PS-Sitzung.
Beispielscript mit .NET Framework Einbindung.
Wenn der aktuelle User ein Admin ist, färbe Fenster rot.
function BinIchAdmin() {
$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$princ = New-Object System.Security.Principal.WindowsPrincipal($identity)
return $princ.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
} & {
$ui = (Get-Host).UI.RawUI
if(BinIchAdmin) {
$ui.BackgroundColor = "DarkRed"
Clear-Host
}
}
Reguläre Ausdrücke
Bsp.: Liest Datei test.log und gibt nur Zeilen aus, in denen "Error" steht.
Select-String test.log 'Error'
Bsp2: Suchmuster "Error" oder "Warning". (Pipe steht für ODER)
Select-String test.log 'Error|Warning'
Bsp3: Aufruf geht auch mit Wildcards (*.log) und liest dann alle betroffenen Dateien.
Der Vergleichsoperator -match dient zum filtern.
Beispiel:
- "DIR" landet über die Pipe bei WHERE
- "-match" liefert nur WAHR, wenn der folgende Ausdruck passt
- "." (Punkt) steht normalerweise für ein beliebiges Zeichen, ähnlich Fragezeichen in Dateimasken (soll er hier aber nicht)
- "\" Escape-Zeichen sorgt dafür, dass das folgende Zeichen (Punkt) für sich selbst steht
- abschließendes "$" pinnt den Such-String an das Ende des durchsuchten Textes.
(beginnt der RegEx mit "^", wird die Zeichenfolge am Anfang des Textes gesucht)
Das Beispiel sucht also Dateinamen, die mit ".txt" enden.
dir | Where Name -match '\.txt$'
RegEx Syntax kennt auch Zeichenklassen:
'[0-9]' - beliebige Ziffer
'[a-z]' - beliebigen Buchstaben (KEINE Umlaute!)
'[a-z0-9_]' - alle Ziffern, Buchstaben und der Tiefstrich
'h[aiu]t' - findet "hat", "hit" und "hut", aber nicht "haut"
'[^a-z]' - alle Zeichen ausser a-z
'\d' - Dezimalziffern
'\w' - Wortzeichen, also Zahlen, Umlaute und Buchstaben
'\s' - Wortzwischenräume (Leerzeichen, Tab, Umbruch)
Großschreibung kehrt Bedeutung um, also '\D' - alles ausser Ziffern
'.' - beliebige Zeichen
Weitere Syntax und Beispiele in CT 08/2018 S. 172ff.
Paketmanagement
- zuerst Modul (als Admin) aktualisieren:
Install-Module PackageManagement -Force
Install-PackageProvider NuGet -Force
Install-PackageProvider PowerShellGet -Force
- Übersicht aller Funktionen:
(gcm) Get-Command -Module PowerShellGet
- gewünschtes Modul installieren: Install-Module ... (-Scope CurrentUser installiert in Userprofil)
- GUI zur Modulsuche und Auswahl:
Find-Module -Tag Utilities | Out-Gridview -PassThru | Install-Module -Scope CurrentUser
Beispiel: eigenen Host, IP, Username ermitteln
- Comutername über Enviroment-Variable: "$env:computername" oder "get-childitem -path env:computername"
- IP ermitteln: hier
- Username: $Env:USERNAME
Computerinfo ermitteln:
(ausführlich Windows, Sprache, 32/64-bit, WoL, BIOS, Hardware)
Powershell: get-computerinfo
einschränken auf Windows Versionsinformation:
Powershell: get-computerinfo | select windows* (oder OsVersion)
Quellen und Links:
- administrator.de : Links und Leitfäden
- CT 2/2018 S.166 ff, CT 6/2018 S.168 ff, CT 8/2018 S.172 ff, CT 12/2018 S. 174 ff, CT 25/2021 S. 178 ff.
- Powershell Leitfaden für Anfänger: https://docs.microsoft.com/de-de/powershell/scripting/learn/ps101/01-getting-started?view=powershell-7
Powershell ISE starten, ggf. Script-Ausführung aktivieren.
Benutzer ermitteln:
• unformatierte Langform (lokal):
Get-CimInstance -ClassName Win32_ComputerSystem -Property UserName
Get-CimInstance -ClassName Win32_ComputerSystem -Property UserName | Format-Table -Property UserName
• Kurzform (lokal)
Benutzername ohne Domain: $env:UserName
• Lokal und Remote:
qwinsta /server:remotePC
AD Gruppen auslesen:
get-adgroup
Check ob User in einer Gruppe ist:
$user = $env:username
$group = "DeineSoftwaregruppe"
$members = Get-ADGroupMember -Identity $group -Recursive | Select -ExpandProperty Name
If ($members -contains $user) {
Softwareinstallation, weil User ist in Gruppe
Am Ende: Remove-ADGroupMember -Identity DeineSoftwaregruppe -Members $user
} Else {
User ist nicht in Gruppe, tue XY
}
User zu Gruppe hinzu fügen:
PS:Add-ADGroupMember -Identity Gruppenname -Members Username
CMD:
net localgroup /add administrators Domain\adminuser
net localgroup /add administratoren Domain\adminuser
Gruppe entfernen:
Remove-ADGroupMember
Letzte angemeldete User auslesen:
get-eventlog -newest 10 -logname security | Format-List
Support-Admin Konto auktivieren, Remotesitzung, anschließend Konto deaktivieren:
- mittels PS-Script: GenerateRandomPassword.ps1
- lokalen Admin anlegen, Konto deaktivieren
- per Script Konto aktivieren, Zufallspasswort setzen, RDP anmelden, Konto wieder deaktivieren
Quelle: https://administrator.de/tutorial/sicherer-umgang-mit-supportkonten-262066.html
@echo off
set /p target=Auf welchen PC willst Du?: %=%
for /f %%a in ('powershell \\server\share\GenerateRandomPassword.ps1') do net user admin%target% %%a /domain /active /workstations:%computername%,%target% & cmdkey /add:TERMSRV/%target% /user:netbiosdomainname\admin%target% /pass:%%a
start /wait mstsc /v:%target%
pause
net user admin%target% /active:no /domain
PowerShell Remoting
https://docs.microsoft.com/de-de/powershell/scripting/learn/remoting/running-remote-commands?view=powershell-7
Windows Remoteverwaltung konfigurieren:
WINRM QUICKCONFIG - Firewall: Port 5985, Dienststart...
Inaktive Benutzerkonten per Powershell finden.
Bsp: Nutzer haben sich > 90 Tage nicht angemeldet
Search-ADAccount -AccountInactive -UsersOnly -TimeSpan 90.00:00:00 |
Where {$_.Enabled -eq “True”} |
Sort -property LastLogonDate -desc |
ft UserPrincipalName, LastLogonDate -autosize
Powershell: IP ermitteln
Powershell ISE starten, ggf. Script-Ausführung aktivieren.
• Host testen und IP zum Name ermitteln:
$ip = (Test-Connection 'A039N015' -Count 1).IPV4Address.IPAddressToString
Write-Host "Die IP-Adresse ist $ip"
• nur IP zu Name aus DNS ermitteln (ohne Test):
[System.Net.Dns]::Resolve('A039N015').AddressList.IPAddressToString
• ausführliches Beispiel:
<#
Name
Get-IPv4
Beschreibung
Ermittelt die IPv4, zugehörige MAC-Adresse sowie den Adapternamen
Benötigt
PowerShell 3.0 (Windows6.1-KB2506143-x64)
Version, Datum, Beschreibung, Autor
1.0 | 23.01.2017 | Initiale Version | Stefan Rehwald
1.1 | 11.07.2017 | Clear-Variable hinzugefügt | Stefan Rehwald
#>
function Get-IPv4 ()
{
$IPRaw = ipconfig /all
$i=0
Foreach($Row in $IPRaw)
{
#Get IPv4 (all), MAC and Adaptername
If($Row -like "*IPv4*")
{
#MAC
$j=$i
do
{
$j--
}while ($IPRaw[$j] -notlike "*Phy*")
$v4_MAC = $IPRaw[$j].Trim()
#Adaptername
$j=$i
do
{
$j--
}while ($IPRaw[$j] -notlike "")
$v4_Adaptername = $IPRaw[$j-1]
#Data
$v4_IPv4 = $Row.Split(":")[1].trim()
$v4_MAC = $v4_MAC.Split(":")[1].trim()
$v4_Adaptername = $v4_Adaptername.Replace(":","")
$IPData =@($v4_IPv4,$v4_MAC,$v4_Adaptername)
#LOG
Write-Host "$($v4_IPv4);$($v4_MAC);$($v4_Adaptername)" -F Green
#Clearing
Clear-Variable v4_*
}
$j=0
$i++
}
}
Get-Ipv4
<# Ausgabe #>
# 172.29.0.241(Bevorzugt);E4-B3-18-E6-B1-58;Drahtlos-LAN-Adapter Drahtlosnetzwerkverbindung
# 192.168.1.1(Bevorzugt);C8-5B-76-2B-28-7C;Ethernet-Adapter LAN-Verbindung
Einfache Ausgabe der IP, ermittelt aus dem Hostname:
$IPClient = Test-Connection $env:COMPUTERNAME -Count 1
#IPv4
$IPClient.IPV4Address.IPAddressToString
#IPv6
$IPClient.IPV6Address.IPAddressToString
<# Ausgabe #>
#IPv4
# 192.168.1.1
#IPv6
# fe80::e6:bfe9:cc2c:7e1d%13
So gehts auch:
Get-Wmiobject Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true" | select Description,IPAddress
Powershell: MySQL Zugriff
MySQL Connector/NET für Windows (ggf. Oracle Anmeldung)
https://dev.mysql.com/downloads/connector/net/
alternativ: Install-Module MySQLCmdlets
von Uwe Backend-Admin

Kommentare
Einen Kommentar schreiben