Ich habe ein Powershell-Wartungsskript, das folgendermaßen funktioniert:
kill explorer
do things
restart explorer
Dieses Skript wird im erhöhten Modus ausgeführt, aber ich müsste den Explorer ohne Administratorrechte neu starten. Irgendeine Idee?
Danke
Antwort1
Soweit ich weiß, ist es nicht möglich, einen nicht erhöhten Prozess (also mit einem Standardtoken mit niedrigen Berechtigungen) direkt von einem erhöhten Prozess aus zu starten. Dies ist keine PowerShell-Beschränkung, sondern die Funktionsweise der Benutzerkontensteuerung in Windows.
Aushttp://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx:
Eine häufig gestellte Frage ist, wie man eine nicht erhöhte Anwendung von einem erhöhten Prozess aus startet, oder, grundlegender, wie man einen Prozess mit meinem nicht erhöhten Token startet, wenn ich erhöhte Rechte ausführe. Da es hierfür keine direkte Möglichkeit gibt, kann die Situation normalerweise vermieden werden, indem man die ursprüngliche Anwendung als Standardbenutzer startet und nur die Teile der Anwendung erhöht, die Administratorrechte erfordern. Auf diese Weise gibt es immer einen nicht erhöhten Prozess, der verwendet werden kann, um zusätzliche Anwendungen als aktuell angemeldeter Desktopbenutzer zu starten. Manchmal muss jedoch ein erhöhter Prozess eine andere Anwendung ohne erhöhte Rechte zum Laufen bringen. Dies kann mithilfe des Taskplaners in Windows Vista® erreicht werden. Der erhöhte Prozess kann eine Aufgabe registrieren, die als aktuell angemeldeter Desktopbenutzer ausgeführt wird.
In diesem Artikel werden zwei mögliche Lösungen erwähnt:
Führen Sie so viel wie möglich von Ihrem Skript im nicht erhöhten Modus aus und erhöhen Sie nur die Rechte für die Teile, die dies benötigen. Mit anderen Worten: Beenden und starten Sie den Explorer im nicht erhöhten Skript neu und führen Sie ein zweites Skript im erhöhten Modus aus, um „Dinge zu erledigen“:
Stop-Process -ProcessName explorer Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1" Start-Process explorer.exe
Das
Runas
Verb bewirkt, dass der zweite PowerShell-Prozess im erhöhten Modus gestartet wird. Dies löst jedoch eine UAC-Eingabeaufforderung aus. Wenn dieses Skript also vollständig automatisiert ausgeführt werden soll, ist dies keine gute Lösung.Erstellen Sie eine geplante Aufgabe, um den Explorer zu starten, wenn die erhöhten Operationen abgeschlossen sind, führen Sie die Aufgabe aus und löschen Sie sie. Sie können verwenden
schtasks.exe
um dies zu tun:schtasks /Create /TN "foobar" /TR explorer.exe /SC OnLogon schtasks /Run /TN "foobar" schtasks /Delete /TN "foobar" /F
Achten Sie einfach darauf, einen Namen für die Aufgabe zu wählen, der nicht mit einem anderen Namen in Konflikt gerät.
Sie können die beiden oben genannten Methoden auch kombinieren, um eine geplante Aufgabe zu erstellen, die das zweite PowerShell-Skript im erhöhten Modus und den Rest ohne erhöhte Rechte ausführt. Dies hat den Vorteil, dass keine UAC-Eingabeaufforderung ausgegeben wird, birgt jedoch das Sicherheitsrisiko, dass jeder, der Schreibzugriff auf das Skript hat, praktisch alles auf Ihrem Computer tun kann. Je nachdem, wie genau Sie Ihr aktuelles Skript ausführen und erhöhen, kann dies jedoch ein strittiges Problem sein.
Eine dritte Möglichkeit, wenn Ihr Skript nur von Ihnen ausgeführt wird, besteht darin, es so zu konfigurieren, dass der neue Prozess explorer.exe mit Ihren Anmeldeinformationen gestartet wird:
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (ConvertTo-SecureString -String "password" -AsPlainText -Force))
Start-Process explorer.exe -Credential $Cred
Der Nachteil hierbei ist, dass Ihr Passwort im Klartext im Skript gespeichert wird. Sie können es auch verschlüsselt in einer separaten Datei speichern, indem Sie Folgendes in eine PowerShell-Eingabeaufforderung eingeben:
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File C:\pw_encrypted.txt
Geben Sie dann Ihr Passwort ein (es wird in der PS-Eingabeaufforderung als Sternchen angezeigt) und drücken Sie die Eingabetaste. Jetzt können Sie es wie folgt in Ihrem Skript verwenden:
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (Get-Content C:\pw_encrypted.txt | ConvertTo-SecureString))
Start-Process explorer.exe -Credential $Cred
Antwort2
Das einzige, was mir einfällt, ist, den Taskplaner zu verwenden, um den Explorer neu zu starten. Start-Prozess oder eine andere Methode scheint den erhöhten Status beizubehalten.