Benutzer-Werkzeuge

Webseiten-Werkzeuge


powershell

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
powershell [2023-12-27 23:26:59] – [Beenden der Shell mit Ctrl+D (wie in Bash)] manfredpowershell [2025-08-23 22:44:56] (aktuell) – [PowerShell] david
Zeile 1: Zeile 1:
 +====== PowerShell ======
 +
 +siehe Wikieintrag zu [[windows_terminal|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 [[dotnet|.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"}
 +
 +  * ''-CodeSigningCert'' bewirkt, 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 Zertifikate
 +    * ''CA'' (Intermediate Certification Authorities): Speicher für CA-Zertifikate
 +    * ''Root'' (Trusted Root Certification Authorities): Speicher für vertrauenswürdige Root-Zertifikate
 +    * ''AuthRoot'' (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
 +