Profilskripte
Ein Profilskript ist ein Skript, das beim Starten der Powershell ausgeführt werden kann, um die Benutzerumgebung anzupassen.
Powershell kennt 6 Profilskripte, die nach Host und Benutzer unterschieden werden. Die Hosts, die Powershell kennt, sind die Powershell-Konsole, die ISE sowie weitere Hosts wie die Exchange Management Shell. Die Pfade für die Profilskripte lassen sich aus der automatischen Variable $Profile auslesen. $Profile ist ein String mit mehreren Noteproperties, in denen die einzelnen Konsolenskripte hinterlegt sind.
$profile
$profile | Select-Object -Property *
$profile | select *
> AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
> AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
> CurrentUserAllHosts : C:\Users\Holger\Documents\WindowsPowerShell\profile.ps1
> CurrentUserCurrentHost : C:\Users\Holger\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Notepad.exe $profile.AllUsersAllHosts # Profilskript mit Notepad öffnen
Wie Sie sehen können, bekommen Sie nur 4 Profilpfade ausgegeben. Die ISE-Profilpfade bekommen Sie nur zu sehen, wenn Sie sich die Variable $Profile aus der ISE heraus anzeigen lassen. CurrentUser bezieht sich auf den jeweils angemeldeten Benutzer. Der Profilpfad befindet sich im Benutzerprofil. AllUsers wird immer für alle Benutzer angewendet. Die Skripte liegen im Powershell-Ordner.
Da es sich bei den Profilskripten um normale Powershell-Skripte handelt, können Sie in den Skripten beliebigen Powershell-Code ausführen lassen. Ein hilfreiches Beispiel ist die Anpassung des Powershell Command-Promps, der immer den aktuellen Pfad anzeigt. Das kann vor allem bei tiefen Pfadverschachtelungen sehr unübersichtlich werden. Da der Prompt aber durch die Powershell-Funktion prompt erstellt wird, kann man diese ganz einfach überschreiben und den aktuellen Pfad in den Titel des Fensters schreiben:
Function Test-AdminPrivilege
{
[Security.Principal.WindowsPrincipal]$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
$currentUser.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
Function prompt {
If (Test-AdminPrivilege)
{
$Title = 'Admin:{0}' -f $executionContext.SessionState.Path.CurrentLocation
}
Else
{
[String]$Title = $executionContext.SessionState.Path.CurrentLocation
}
$Host.UI.RawUI.WindowTitle=$Title
"PS $('>' * ($nestedPromptLevel + 1)) "
}
Im Beispiel werden zwei Funktionen erstellt, Test-AdminPrivileges und Prompt. Test/Adminprivileges prüft, ob der Benutzer Administratorrechte hat, da diese Information im Titel des Fensters normalerweise angezeigt wird und nicht verloren gehen soll. Hierfür wir die statische Methode [Security.Principal.WindowsIdentity]::GetCurrent() verwendet.
In der Funktion Prompt wird ein Titel für das Fenster erzeugt und über das $Host-Objekt in den Titel geschrieben, zusammen mit dem aktuellen Pfad. Der Prompt wird dann nur noch durch PS > abgebildet.
Eine ausführliche Beschreibung zu Profilskripten finden Sie unter Understanding the Six PowerShell Profiles.
Function Test-AdminPrivilege
{
[Security.Principal.WindowsPrincipal]$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
$currentUser.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
Function prompt {
If (Test-AdminPrivilege)
{
$Title = 'Admin:{0}' -f $executionContext.SessionState.Path.CurrentLocation
}
Else
{
[String]$Title = $executionContext.SessionState.Path.CurrentLocation
}
$Host.UI.RawUI.WindowTitle=$Title
"PS $('>' * ($nestedPromptLevel + 1)) "
}