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 powershell
es 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 runasuser
wird 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 Powershell
etwas 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 -File
Parameter 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-command
den -credential
Parameter 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\User01
local administrator
DomainA\AdminGroup
- Gewährung der Berechtigung
DomainA\User01
zur lokalen Computersicherheitsgruppelocal administrator
UND - Gewährung
DomainA\User01
in DomänensicherheitsgruppeDomainA\AdminGroup
und führen Sie das Skript dann mit RunAs aus.