Skript als Admin via Kontextmenü
Powershell Skripte haben in der Handhabung einen kleinen Nachteil gegenüber Batch-Skripten: Sie lassen sich nicht einfach über das (Rechtsklick-)Kontextmenü als Administrator starten.
 
Kontextmenüeintrag für ein bestimmtes Skript
Erstellt von der Skriptdatei eine Verknüpfung via Rechtsklick -> Senden an -> Desktop und öffnet die Eigenschaften dieser Verknüpfung. Unter Ziel wird der Pfad zur .ps1 Datei angegeben. Verändert das Ziel folgendermaßen:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -NoExit "[Pfad]"
Optional kann über „Anderes Symbol…“ -> C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -> das Powershell-Icon mit UAC-Icon eingestellt werden. Somit ist die Verknüpfung visuell als eine Admin-fähige Verküpfung gekennzeichnet:
 
Kontextmenüeintrag für jedes Skript
Noch besser: Der Kontextmenü-Eintrag „Als Administrator ausführen“ bei jeder Powershell-Datei, ohne Verknüpfung. Hierzu müssen in der Registry Änderungen gemacht werden, die sich am einfachsten über Batch Skripte ausführen lassen:
Kontextmenüeintrag hinzufügen:
:: Add value for UAC shield icon: REG ADD "HKCR\Microsoft.PowerShellScript.1\Shell\runas" /v HasLUAShield /t REG_SZ /d "" /f :: Add value to create context menu item: REG ADD "HKCR\Microsoft.PowerShellScript.1\Shell\runas\command" /ve /t REG_EXPAND_SZ /d "\"%%SYSTEMROOT%%\System32\WindowsPowerShell\v1.0\powershell.exe\" -executionpolicy bypass -nologo -file \"%%1\"" /f
(Hinweise: Der Code MUSS mit Adminrechten in der CMD ausgeführt werden – entweder von Hand oder in einem .bat Skript zwischenlagern.)
 
 
Kontextmenüeintrag wieder entfernen:
REG DELETE "HKCR\Microsoft.PowerShellScript.1\Shell\runas" /f

Als Powershell Befehl
#--------------------------------------Funktionen-------------------------------------------- function New-Item-RegKey-Recurse ($subkey) { IF ((Split-Path -Path $subkey -Qualifier) -eq "Registry::") { IF (Test-Path $subkey) { return $true } ELSE { IF (New-Item-RegKey-Recurse (Split-Path -Path $subkey)) {New-Item -Path $subkey}; return $false } } } # functions #--------------------------------------Hauptteil-------------------------------------------- #Add value for UAC shield icon: $key = "Registry::HKCR\Microsoft.PowerShellScript.1\Shell\runas" New-Item-RegKey-Recurse ($key) | Out-Null $valuename = "HasLUAShield" New-ItemProperty -Type String -Path $key -Name $valuename -value "" #Add value to create context menu item: $key = "Registry::HKCR\Microsoft.PowerShellScript.1\Shell\runas\command" New-Item-RegKey-Recurse ($key) | Out-Null $valuename = "(Default)" $Value = "`"`%SYSTEMROOT`%\System32\WindowsPowerShell\v1.0\powershell.exe`" -executionpolicy bypass -nologo -file `"`%1`"" New-ItemProperty -Type ExpandString -Path $key -Name $valuename -value $ValueGerade mal ausprobiert -> funktioniert!
Ich musste das Powershell Skript allerdings als Administrator ausführen, damit die Registry Änderungen geschrieben werden. Muss man also wissen, wie das geht. Klein bisschen ein Teufelskreis 😉
Während das hier klappt:
REG ADD „HKCR\Microsoft.PowerShellScript.1\Shell\runas“ /v HasLUAShield /t REG_SZ /d „“ /f
wird der 2.Teil leider mit einem „FEHLER: Ungültige Syntax.“ bedacht:
REG ADD „HKCR\Microsoft.PowerShellScript.1\Shell\runas\command“ /ve /t REG_EXPAND_SZ /d „\“%%SYSTEMROOT%%\System32\WindowsPowerShell\v1.0\powershell.exe\“ -executionpolicy bypass -nologo -file \“%%1\““ /f
Woran liegts? (Windows 10 Pro 20H2)
(Der Code von Ralf Lauerwald funktioniert jedoch)
Den letzten Teil mit folgender Zeile ersetzen:
REG ADD „HKCR\Microsoft.PowerShellScript.1\Shell\runas\command“ /ve /t REG_EXPAND_SZ /d ‚“%%SYSTEMROOT%%\System32\WindowsPowerShell\v1.0\powershell.exe“ -executionpolicy bypass -nologo -file „%%1″‚ /f
Hintergrund, das Escapen von Quotes funktioniert in PowerShell anders