michi.wtr
Goto Top

PowerShell Script: Einzelnen Befehl als Admin ausführen

Hi zusammen,

gibt es eine Möglichkeit, einen einzelnen Command in einem PowerShell Script als Admin auszuführen?
Ich habe bereits eine Möglichkeit gefunden das ganze Skript auf Adminrechte anzuheben indem ich auf diese am Anfang prüfe und ggf. einen neuen Host mit Adminrechten starte und ihm mein Skript übergebe.

Allerdings müsste es doch bestimmt eine Möglichkeit geben, einen einzelnen Command auch als Admin auszuführen. Ich habe bereits von jemandem erfahren dies solle mit Invoke-Command möglich sein, da dieser Befehl wohl die höchstmöglichen Rechte von dem User einnimmt, mit dem man diesen startet.
So zumindest die Theorie, allerdings vermute ich, dass dies wohl nicht ganz stimmt, denn sonst würde es auch keinen Parameter -RunAsAdmin im Cmdlet Invoke-Command geben, oder?

Invoke-Command -ScriptBlock {Stop-Service -Name w32Time -Force}

Dieser Befehl führt lediglich zu einem Error: Der Dienst [...] kann nicht auf dem Computer . geöffnet werden.
Starte ich denselben jedoch auf einem Host mit Adminrechten, so funktioniert alles einwandfrei...

Invoke-Command -ScriptBlock {Stop-Service -Name w32Time -Force} -RunAsAdmin

Dieser Befehl fordert mich auf, den Parameter -ContainerId mit anzugeben, von dem ich aber leider keine Ahnung habe und aus dem Helpfile nur hervorgeht: Specifies an array of container IDs. Im Netz habe ich dazu nicht wirklich etwas gefunden und habe es auch nicht wirklich weiter verfolgt, da ich nachgelesen hatte, dies hätte etwas mit Remote Ausführung auf einem Server zu tun.

Content-Key: 4862253225

Url: https://administrator.de/contentid/4862253225

Ausgedruckt am: 24.04.2024 um 02:04 Uhr

Mitglied: 4863114660
Lösung 4863114660 05.12.2022 aktualisiert um 10:47:31 Uhr
Goto Top
Moin.
Start-Process erledigt das für dich mit dem Parameter "-verb runas" wenn der User selbst schon Admin ist:
start-process powershell -ArgumentList '-EP Bypass',"-C `"Stop-Service -Name w32Time -Force`"" -verb runas  
bzw. wenn der User der aktuellen Instanz selbst kein Admin ist dann halt verschachtelt mit Credential-Angabe aufgerufen
start-process powershell -ArgumentList '-EP Bypass',"-C `"start-process powershell -verb runas -Argumentlist '-C Stop-Service -Name w32Time -Force'`"" -Credential (Get-Credential)  
Gruß S.
Mitglied: TK1987
Lösung TK1987 05.12.2022 aktualisiert um 10:41:52 Uhr
Goto Top
Moin,

wenn die Konsole nicht schon als Admin gestartet wurde, benötigst du immer eine neue Instanz.
Start -Verb RunAs powershell -ArgumentList "stop-service -Name w32Time -force"  

um die Ausführung in der aktuellen Instanz zu prüfen, benötigst du zusätzlich den PassThru-Parameter, z.B. so:
$Process = Start -PassThru -Verb RunAs powershell -ArgumentList "stop-service -Name w32Time -force"  
$Process.WaitForExit()
if ($Process.ExitCode) {write-host -f red "Fehler"} else {write-host -f green "w32Time wurde erfolgreich beendet. "  

Gruß Thomas
Mitglied: 3063370895
3063370895 05.12.2022 aktualisiert um 10:42:37 Uhr
Goto Top
Moin,

-RunAsAdministrator wird in Verbindung mit -ContainerID für Windows Server Container verwendet.

Wie schlepper schreibt, kannst du mit Start-Process einen Teil deines Skriptes als Admin ausführen.
Mitglied: michi.wtr
michi.wtr 05.12.2022 um 10:56:19 Uhr
Goto Top
Super vielen Dank face-smile ja dann hatte ich nen Denkfehler, das mit start-process hatte ich auch schon gemacht, dachte nur ich könnte eventuell die Rechte desselben Hosts anheben.
Mitglied: TK1987
TK1987 05.12.2022 um 11:22:24 Uhr
Goto Top
Zitat von @michi.wtr:
... dachte nur ich könnte eventuell die Rechte desselben Hosts anheben.
Zum Glück ist dem nicht so. Sonst könnte ja jeder Schadcode, der nur mit eingeschränkten Rechten gestartet wurde, automatisch immer die höchsten Rechte des Users annehmen.

Gruß Thomas