c't 17/10
PowerShell-Skript mit Admin-Rechten
WindowsPrincipal, genauer: deren Methode IsInRole(). Bei fehlenden Rechten bastelt sich das Skript ein ProcessStartInfo-Objekt zusammen: Das zu startende Programm ist die PowerShell, die ja gerade schon läuft und deren Pfad man deshalb über Process.GetCurrentProcess() herausbekommt. Als Argumente braucht sie den Namen des gerade laufenden Skripts ($MyInvocation.MyCommand.Path) sowie alles, was dieses seinerseits an Argumenten übergeben bekommen hat. Das Verb runas sorgt schließlich für volle Rechte.
(hos)1 $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
2 $princ = New-Object System.Security.Principal.WindowsPrincipal($identity)
3 if(!$princ.IsInRole( `
4 [System.Security.Principal.WindowsBuiltInRole]::Administrator))
5 {
6 $powershell = [System.Diagnostics.Process]::GetCurrentProcess()
7 $psi = New-Object System.Diagnostics.ProcessStartInfo $powerShell.Path
8 $script = $MyInvocation.MyCommand.Path
9 $prm = $script
10 foreach($a in $args) {
11 $prm += ' ' + $a
12 }
13 $psi.Arguments = $prm
14 $psi.Verb = "runas"
15 [System.Diagnostics.Process]::Start($psi) | Out-Null
16 return;
17 }
Wenn ein PowerShell-Skript Administratorrechte braucht, kann es sich die mit einem Neustart seiner selbst verschaffen.



