Powershell Quick-Tip: Skriptteile als anderer Benutzer ausführen

Manchmal ist man in der misslichen Lage gewisse Teile eines PowerShell-Skripts als anderer Benutzer ausführen zu müssen. Kennt man die normale Kommandozeile denkt man direkt an den Run-As Befehl. Wie man das entsprechende PowerShell-Pendant verwendet, werde ich im Folgenden erklären.

Das Szenario

Wir haben ein Skript, dass zuerst Attribute eines Benutzers per LDAP aus dem AD auslesen soll und diese, wenn nötig, wieder setzt. Da es hierbei um Attribute des aktuell angemeldeten Benutzers geht, muss der erste Teil als der aktuelle Benutzer ausgeführt werden. Da dieser Benutzer aber keine Rechte hat die Attribute zu ändern, muss das Setzen als Administrator ausgeführt werden.

Run-As in der PowerShell

Das aus der CMD bekannte Kommando Run-as gibt es in der PowerShell leider nicht. Hier verwendet man am besten Start-Process mit dem Parameter -Credential. In unserem Fall rufen wir einfach eine neue PowerShell auf und übergeben den Skriptteil als Argument. Die Anmeldedaten bekommt man über Get-Credential:

Start-Process powershell.exe -Credential Get-Credential -ArgumentList "Skript.ps1"

Die Lösung

Wir teilen unser Skript in 2 Teile:

  • Das Skript Teil_A.ps1 führt die Abfrage der Attribute aus, führt dann das Skript Teil_B.ps1 aus und übergibt diesem den aktuellen Benutzer als String.

  • Das Skript Teil_B.ps1 bekommt den Benutzer übergeben und führt die Änderung der Attribute aus.

Teil_A.ps1 sieht also wie folgt aus:

... $currentUserRead = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name $tempUser = $currentUserRead.Split("\") $user = $tempUser[1] Start-Process powershell.exe -Credential Get-Credential -ArgumentList "Teil_B.ps1 $user" ...

 

Teil_B.ps1 sieht wie folgt aus:

param([String]$user) ...