Manchmal steht man vor der Aufgabe, dass man von einer PowerShell aus ein Script mit anderen Berechtigungen laufen lassen möchte als der Anwender hat in dessen Benutzerkontext das aktuelle PowerShell-Fenster ausgeführt wird. Ein Beispiel ist z.B. der Befehl Get-VM, der ohne Optionen alle virtuellen Maschinen auflistet die auf dem lokalen Rechner laufen. Führt man Get-VM ohne die entsprechenden Berechtigungen aus bekommt man keine Rückgabedaten:
Man muss diesen Befehl mit den richtigen Berechtigungen ausführen. Dazu schreibt man den Befehl zunächst in eine Script-Datei (Get-VM ist natürlich nur ein Beispiel – man kann beliebig komplexe Scripte so ausführen). Um nun in der PowerShell einen anderen Benutzerkontext zu bekommen muss man zunächst mal ein Objekt für das Kennwort erzeugen:
$secpassword = ConvertTo-SecureString "MySecretPassword" -AsPlainText –Force
Dieses Kennwort-Objekt kann man dann dazu verwenden um einen Credential-Objekt zu erzeugen:
$mycreds = New-Object System.Management.Automation.PSCredential ("AdminAccount", $secpassword)
Mit dem Credential-Objekt kann man dann über Start-Process eine neue PowerShell starten in der man dann das Script ausführt. Wichtig ist, dass man den kompletten Pfad des Scriptes übergibt
Start-Process powershell.exe -Credential $mycreds -NoNewWindow -ArgumentList "-noexit -command C:\temp\get-vm.ps1"
In meinem kleinen Beispiel sieht das dann so aus:
Neben dem PowerShell-Fenster im Hintergrund, das den Prozess startet wird das PowerShell-Fenster im Vordergrund gestartet in dem das Script mit erhöhten Rechten ausgeführt wird.