PowerShell-Skript mit Admin-Rechten

Kann man ein PowerShell-Skript unter Windows 7 grundsätzlich als Administrator ausführen? Über das Kontextmenü finde ich keine entsprechende Option und dem normalen User möchte ich nicht den Umweg über die Powershell ISE zumuten.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Hajo Schulz

Kann man ein PowerShell-Skript unter Windows 7 grundsätzlich als Administrator ausführen? Über das Kontextmenü finde ich keine entsprechende Option und dem normalen User möchte ich nicht den Umweg über die Powershell ISE zumuten.

Eine Methode, einem Skript ein Attribut mitzugeben, das es als „braucht Administratorrechte“ kennzeichnet, kennen wir nicht. Aber Sie können in Ihrem Skript zunächst prüfen, ob es volle Rechte hat. Wenn nicht, kann es sich selbst mit Administratorrechten neu starten. Dazu fügen Sie Ihrem Skript am Anfang nebenstehende Programmzeilen hinzu.

Die Prüfung, ob das Skript Admin-Rechte hat, übernimmt die .NET-Klasse 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.

www.ct.de/1017144

 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. (hos)