Inhaltsverzeichnis
PowerShell
siehe Wikieintrag zu Windows Terminal
GitHub: https://github.com/PowerShell/PowerShell.git
Installation:
> winget install --id Microsoft.PowerShell
Es gibt zwei verschiedene PowerShell Versionen:
- Windows PowerShell (bis v5): in Windows 10 integrierter Kommandozeileninterpreter sowie eine Skriptsprache, basiert auf dem .NET Framework und kann deutlich mehr als das sehr alte CMD
- PowerShell (ab v7), auch als PowerShell Core (v6) bekannt: open-source Kommandozeileninterpreter und Skriptsprache, basiert auf .NET (Core) und ist cross-platform
Beide Versionen sind sehr ähnlich, doch nur die neue cross-platform PowerShell wird noch weiterentwickelt und bietet somit mehr Funktionen. Diese wird leider nicht mit Windows 10 mitgeliefert, weshalb man die meisten Skripte kompatibel zur Version 5 schreiben muss, um portable zu sein.
Nice to know
Symlink für das Profil (profile.ps1) der neuen PowerShell zur alten Windows PowerShell erstellen:
> New-Item -ItemType Directory "$HOME/Documents/PowerShell" -Force > New-Item -ItemType File "$HOME/Documents/PowerShell/profile.ps1" > New-Item -ItemType SymbolicLink -Path "$HOME/Documents/WindowsPowerShell/profile.ps1" -Value "$HOME/Documents/PowerShell/profile.ps1" -Force
PowerShell Skripte auf dem System erlauben (als Admin ausführen):
> @("CurrentUser", "LocalMachine") | % { Set-ExecutionPolicy RemoteSigned -Scope $_ }
RemoteSigned bedeutet: alle Skripte, die nicht lokal geschrieben wurden, müssen signiert werden
Beenden der Shell mit Ctrl+D (wie in Bash)
Das PowerShell Profil profile.ps1 verhält sich ähnlich wie .profile / .bashrc / .zshrc unter Linux
> mkdir $HOME/Documents/PowerShell -Force; echo "Set-PSReadLineKeyHandler -Key ctrl+d -Function DeleteCharOrExit" >> $HOME/Documents/PowerShell/profile.ps1
Dies wird durch das Modul PSReadLine ermöglicht. Es erlaubt umfangreiche Konfiguration und holt endlich viele Vim/Emacs-Features zu PowerShell.
IPv6 auf EUI-64 (MAC basierend) stellen (legacy)
- Dies ist normalerweise nicht empfohlen, kann jedoch im Zusammenspiel mit Systemen, die modernes IPv6 nicht richtig verstehen (z.B. fritz.box Router kann IPv6 Portfreigaben nur mit EUI-64 Clients), äußerst praktisch sein.
- Man sollte dann jedoch unbedingt Temporary Addresses bzw. Privacy Extensions aktivieren!
In PowerShell (Admin):
> Set-NetIPv6Protocol -RandomizeIdentifiers Disabled > Set-NetIPv6Protocol -UseTemporaryAddresses Enabled
IPv6 auf zufällig (stable-privacy) stellen (modern)
- Die obige Konfiguration rückgängig machen.
- Temporary Addresses bzw. Privacy Extensions sind standardmäßig aktiviert und sind hier nur der Vollständigkeit halber angegeben!
In PowerShell (Admin):
> Set-NetIPv6Protocol -RandomizeIdentifiers Enabled > Set-NetIPv6Protocol -UseTemporaryAddresses Enabled
RAM
In Windows 10 anzeigen, wieviel RAM drin steckt (englisch & deutsch)
in CMD:
C:\Users\Manfred>systeminfo | findstr /C:"physi" Gesamter physischer Speicher: 32.540 MB Verfügbarer physischer Speicher: 18.658 MB
in PowerShell:
PS C:\Users\Manfred> systeminfo | sls "physi" Gesamter physischer Speicher: 32.540 MB Verfügbarer physischer Speicher: 18.770 MB
Skript signieren
Im folgenden wird PowerShell als Administrator benötigt!
Zertifikat erstellen
> $date = Get-Date -DisplayHint DateTime -Year 2100 -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0 -Millisecond 0 > $cert = New-SelfSignedCertificate -NotAfter $date -Type CodeSigningCert -CertStoreLocation Cert:/LocalMachine/My/ -DnsName "max.mustermann@example.de" > echo $cert
Zertifikat (Thumbprint) finden, was für CodeSignierung geeignet ist
Microsoft Management Console (mmc) öffnen (Suche/Win+R) > Datei > Snap-in hinzufügen > Zertifikate > Computer account > Lokaler Computer > OK > Zertifikat öffnen (Doppelklick) > Details > Thumbprint
oder in PowerShell
Zertifikate des lokalen Computers durchsuchen und nach Subject oder Thumbprint filtern
> ls -r Cert:/LocalMachine/ -CodeSigningCert | where {$_.Subject -like "*max.mustermann*"}
> ls -r Cert:/LocalMachine/ -CodeSigningCert | where {$_.Thumbprint -eq "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}
> ls -r Cert:/LocalMachine/ | where {$_.Subject -like "*max.mustermann*"}
> ls -r Cert:/LocalMachine/ | where {$_.Thumbprint -eq "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}
-CodeSigningCertbewirkt, dass nur Zertifikate angezeigt werden, mit denen Code signiert wird (z. B. Zertifikate für E-Mail oder SSL werden ausgeblendet)/LocalMachine/durch/CurrentUser/ersetzen, um nur aktuellen Benutzer zu durchsuchen (Zertifikat vertrauen funktioniert dann aber nur über die MMC GUI)- wichtige Unterordner von
/LocalMachine/und/CurrentUser/(mit dazugehörenden Namen aus MMC):My(Personal): Speicher für eigene ZertifikateCA(Intermediate Certification Authorities): Speicher für CA-ZertifikateRoot(Trusted Root Certification Authorities): Speicher für vertrauenswürdige Root-ZertifikateAuthRoot(Third-Party Certification Authorities): Speicher für Root-Zertifikate von Drittparteien
Zertifikat löschen
> ls -r Cert: | where {$_.Thumbprint -eq "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"} | rm
Zertifikat vertrauen
> $file = "$env:tmp/certificate.cer"
> $cert = $(ls -r Cert:/LocalMachine/CA/ | where {$_.Thumbprint -eq "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"})
> Export-Certificate -Type CERT -Cert $cert -FilePath $file
> ls $file
> Import-Certificate -CertStoreLocation Cert:/LocalMachine/AuthRoot/ -FilePath $file
> rm $file
PS Skript signieren
> $script = "$home/Documents/PowerShell/profile.ps1"
> $cert = $(ls -r Cert:/LocalMachine/My/ -CodeSigningCert | where {$_.Thumbprint -eq "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"})
> Set-AuthenticodeSignature -Certificate $cert -FilePath $script
