PSReadline von Powershell speichert alle Kommandozeileneingaben von der Powershell in der Datei ConsoleHost_history.txt. Mittels
notepad (Get-PSReadLineOption).HistorySavePath
kann man ganz einfach in die gesammelten Eingaben Einblick erhalten. Dies ist manchmal sinnvoll um bestimmte Dinge nachvollziehen zu können.
Wenn man viel Zeit in der Powershell verbringt sammeln sich da viele Daten über die Zeit an. Da nie klar ist, wann eine Sitzung begann oder in welchem Kontext man sich bewegte, hier eine kleine Funktion die man aufrufen kann um den nötigen Kontext herstellen zu können:
Function HistoryDirDateTimeSyncPoint {Add-Content -path (Get-PSReadlineOption).HistorySavePath "`r`n# $env:COMPUTERNAME `"$pwd`" $(Get-Date)"}
Nun muss man nur
PS> HistoryDirDateTimeSyncPoint
aufrufen und bekommt diesen Eintrag
HistoryDirDateTimeSyncPoint
# COMPUTERNAME "C:\Users\Benutzer" 05/05/2024 18:13:30
Es wird also eine Leerzeile angefügt um optisch zu den vorhergehenden Eingaben einen Abstand zu bekommen und danach werden der Computername, der aktuelle Pfad und Datum mit Uhrzeit als Kommentarzeile eingetragen.
Obige Funktion ist in Windows Powershell 5 genauso wie in Powershell 7 verwendbar. Bei Powershell 7 funktioniert es auch unter MacOS und Linux.
Evtl. macht aber ein weiterer Parameter noch mehr Freude und zwar ob zum Zeitpunkt des Aufrufs Admin- oder Rootrechte aktiv waren. Dazu bauen wir uns diese Funktion:
Function Test-AdminOrRoot {
$root = $false
If ($PSVersionTable.Platform) {
# Information verfügbar
If ($PSVersionTable.Platform -eq ‚Win32NT‘) {
# Windows
$root = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
} else {
# Linux oder Mac
$id = id -u
If ($id -eq 0) {
$root = $true
} # else 501
}
} else {
# Information nicht verfügbar, kann nur Windows sein
$root = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
}
return $root
}
Diese bauen wir nun in die andere Funktion mit ein:
Function HistoryDirDateTimeSyncPoint {
Function Test-AdminOrRoot {
$root = $false
If ($PSVersionTable.Platform) {
# Information verfügbar
If ($PSVersionTable.Platform -eq ‚Win32NT‘) {
# Windows
$root = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
} else {
# Linux oder Mac
$id = id -u
If ($id -eq 0) {
$root = $true
} # else 501
}
} else {
# Information nicht verfügbar, kann nur Windows sein
$root = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
}
return $root
}Add-Content -path (Get-PSReadlineOption).HistorySavePath "`r`n# Admin/Root:$(Test-AdminOrRoot) $env:COMPUTERNAME `"$pwd`" $(Get-Date)"
}
Im MacOS Terminal kann man dann das Ergebnis mittels
open (Get-PSReadLineOption).HistorySavePath
bewundern und stellt sich ungefähr so dar:
HistoryDirDateTimeSyncPoint
# Admin/Root:True "/private/var/root" 05/05/2024 20:19:27
bzw. mit normalen Rechten:
HistoryDirDateTimeSyncPoint
# Admin/Root:False "/Users/Benutzername" 05/05/2024 20:18:11