Führen Sie das PowerShell-Skript als anderer Benutzer und mit erhöhten Rechten aus

Führen Sie das PowerShell-Skript als anderer Benutzer und mit erhöhten Rechten aus

Ich weiß, dass dies wie eine doppelte Frage aussieht, aber ich habe die Lösungen ausprobiert und sie haben bei mir nicht funktioniert.

Wir müssen ein Skript mit unseren Domänenkonten ausführen, es aber auch mit erhöhten Rechten ausführen. Auf den meisten Geräten ist das kein Problem, da die Verknüpfung als Administrator ausgeführt wird und uns zur Eingabe von Anmeldeinformationen auffordert. Wenn der Benutzer jedoch ein lokaler Administrator ist, werden wir nicht zur Eingabe von Anmeldeinformationen aufgefordert (nur eine Ja/Nein-UAC-Eingabeaufforderung).

Ich bin verwirrt, warum das nicht funktioniert:

# Get identity of script user
$identity = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()

# Elevate the script if not already
if ($identity.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host -F Green 'ELEVATED'
} else {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Exit
}

# Ensure the script has domain privileges
if ($identity.IsInRole('[domain]\[admin group]')) {
    Write-Host -F Green 'DOMAIN ADMIN'
} else {
    Start-Process PowerShell -Verb RunAsUser "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Pause # required, otherwise the Exit below closes the UAC prompt
    Exit
}
Pause

Wenn das selbst erhöhte Skript ausgeführt wird, während Benutzer- und Domänenanmeldeinformationen eingegeben werden, verliert es die Erhöhung, d. h. wenn Start-Process -Verb RunAsUser powershelles von einer erhöhten PowerShell-Instanz ausgeführt wird, ist es selbst nicht erhöht.

Ich habe auch Folgendes versucht:

Start-Process powershell -verb RunAs -argumentlist "Start-Process powershell.exe -Verb RunAsUser `"& path\to\script.ps1`""

Dies schlägt fehl, da der Domänenadministrator keinen Zugriff auf das Skriptverzeichnis hat, es sei denn, er verfügt über erhöhte Rechte.

Antwort1

Automatisieren Sie etwas oder führen Sie nur gelegentlich ein Skript aus? Befindet sich das Skriptverzeichnis lokal oder im Netzwerk?

Wie Sie bemerkt haben, runasändert das Starten einer neuen Instanz von Powershell weder den Benutzer, noch runasuserwird der Prozess erhöht. Sie müssen beides in umgekehrter Reihenfolge tun. Wenn Sie als lokaler Administrator angemeldet sind, starten Sie Powershell mit RunAsUser oder über:

  • Umschalt+Rechtsklick > Als anderer Benutzer ausführen > Domänenadministrator

Führen Sie dann Ihre Runas aus, um von dort aus (als Domänenadministrator) die Rechte zu erhöhen:

Start-Process PowerShell -Verb RunAs

Mit können Sie überprüfen, als welcher Benutzer Sie derzeit ausgeführt werden whoami. Das Ergebnis sollte Ihr Domänenkonto sein, auch mit erhöhten Rechten.

ODER

Wenn Sie einen PC remote verwalten und bereits Powershell verwenden, stellen Sie die Verbindung stattdessen mithilfe von Powershell her, da die Sitzung immer mit erhöhten Rechten versehen wird:

Enter-PSSession MyPCName -credential (get-credential -username domain\MyAdmin)
# remote session:
[MyPCName]: PS C:\WINDOWS\system32>

Ich muss außerdem empfehlen, wenn möglich nie das lokale Administratorkonto zu verwenden.

Antwort2

Ein alternatives Tool ist das kostenlose sysinternals-Tool PsExec.

Der Befehl würde folgendermaßen aussehen:

psexec -u domain\user -h -i command [arguments]

Die Parameter sind:

  • -i: Führen Sie das Programm so aus, dass es mit dem Desktop der angegebenen Sitzung auf dem Remote-System interagiert. Wenn keine Sitzung angegeben ist, wird der Prozess in der Konsolensitzung ausgeführt.
  • -h: Wenn das Zielsystem Vista oder höher ist, wird der Prozess mit dem erhöhten Token des Kontos ausgeführt, sofern verfügbar.

Eine unsichere Praxis besteht auch darin, das Passwort anzugeben:

-p: Gibt ein optionales Passwort für den Benutzernamen an. Wenn Sie dies weglassen, werden Sie aufgefordert, ein verstecktes Passwort einzugeben.

Antwort3

Eine einfache Lösung besteht darin, zunächst das Skript von dem Speicherort zu kopieren, der die Domänenanmeldeinformationen erfordertdass Sie bereits angemeldet sind alszum lokalen Dateisystem der Maschine, von der aus Sie es mit erhöhten Rechten ausführen müssen. Führen Sie das Skript dann stattdessen mit erhöhten Rechten von dieser lokalen Kopie aus aus.

Führen Sie es Start-Process Powershelletwas anders aus, als Sie es ausgeführt haben, damit die Aktion der Skriptlogik auch bei erhöhter Ausführung ausgeführt wird. Fügen Sie die ExecutionPolicy Bypass -NoProfile -FileParameter hinzu und führen Sie das Skript anschließend aus, damit es funktioniert.

Notiz:Beide der folgenden PowerShell-Beispiellösungen verwenden das Stammverzeichnis des Laufwerks „C“ C:\des lokalen Dateisystems, Sie können dies jedoch entsprechend anpassen.

PowerShell (Lösung 1)

Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

Wenn Sie sich mit einer Domänenanmeldeinformation authentifizieren müssen, um auf den Skriptpfad zuzugreifenZunächst können Sie invoke-commandden -credentialParameter verwenden, um den Kopiervorgang auszuführen. Anschließend können Sie das auf diese Weise kopierte Skript des lokalen Dateisystems mit erhöhten Rechten ausführen.

PowerShell (Lösung 2)

$cred = Get-Credential "domain\username";
Invoke-Command -ScriptBlock {
    Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
    } -Credential $cred;

Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

Unterstützende Ressourcen

Antwort4

Nach meinem Verständnis können der ausführende Benutzer und die Berechtigungen des aktuellen Prozesses im Allgemeinen während der Ausführung des Prozesses nicht geändert werden, sondern werden beim Start des Prozesses vom Betriebssystemkernel festgelegt.
Sie sollten daher den Codeblock, den Sie mit erhöhten Rechten ausführen möchten, trennen und ihn mit RunAs (oder seinen Validierungen) ausführen.
Wenn die Änderung der Berechtigungen innerhalb eines Prozesses möglich ist, wird dies zu einer sehr gefährlichen Sicherheitslücke des Betriebssystems.

Außerdem werden lokales Privileg ( local administrator) und Domänenprivileg ( [domain]\[admin group]) separat definiert. Wenn Sie beides UND
zulassen möchten , müssen Sie beides tun:DomainA\User01local administratorDomainA\AdminGroup

  • Gewährung der Berechtigung DomainA\User01zur lokalen Computersicherheitsgruppe local administratorUND
  • Gewährung DomainA\User01in DomänensicherheitsgruppeDomainA\AdminGroup

und führen Sie das Skript dann mit RunAs aus.

verwandte Informationen