Task-Berechtigungen via PowerShell vergeben
Hier ist beschrieben, wie man unter Windows mittels geplanter Tasks Standardnutzerkonten dazu berechtigt, geplante Tasks zu starten, die mit hohen Rechten (bzw. mit anderem Exekutor als der Standardnutzer) laufen. Dazu muss man die ACLs der Tasks anpassen, was nicht länger über die GUI möglich ist. Getestet auf Windows 11 23H2.
Einsatzzweck ist beispielsweise, ohne Adminrechte zu vergeben, dem Nutzer das Recht zu geben, spontan ein Vollbackup durchzuführen, oder seine IP-Adresse zu ändern, oder in beliebige (Konfigurations-)dateien zu schreiben, wozu er andernfalls kein Recht hätte.
Logischerweise ist das nur dann sicher, wenn das Skript/das Executable, welches der Task ausführt, an einem für den Nutzer nicht beschreibbaren Ort liegt (maximal Lese- und Ausführrechte).
Die Skripte/Exe müssen hierbei ohne Oberfläche (silent) ablaufen können, da der Task unsichtbar läuft!
Da Windows seit Längerem keine Änderung der Berechtigungen auf Tasks über die GUI zulässt, muss man die PowerShell zur Hilfe nehmen. Das Konto, mit dem man die PowerShell startet, muss hierfür volle Rechte auf den Task haben – dies ist in der Regel mit jedem Adminkonto gegeben.
Skriptbeispiel zum Hinzufügen von Lese- und Ausführberechtigungen explizit für Nutzer mydom\testuser auf den Task „Testtask" im Taskordner „Testordner".
Anmerkung: wenn der Testtask direkt im Wurzelverzeichnis liegt, lasse man den Ordnernamen schlicht weg in Zeile 5:
$Task = $TaskScheduler.GetFolder("").GetTask("Testtask")
Hat man dem Nutzer das Recht erteilt, kann dieser den Task nun zum Beispiel per GUI oder auch per Batch starten:
Und wie macht man das rückgängig?
Skriptbeispiel zum Entfernen von expliziten Berechtigungen für Nutzer mydom\testuser auf den Task „Testtask" im Taskordner „Testordner" (mit Kommentaren, da erheblich komplizierter als das Hinzufügen):
Anmerkung: wenn der Testtask direkt im Wurzelverzeichnis liegt, schreibt man in Zeile 3 schlicht keinen Ordnernamen vor den Tasknamen: $ScheduledTask="Testtask"
Prüfen kann man das erhoffte Ergebnis per Taskscheduler selbst: nur wenn Ausführrechte eingetragen sind, wird der Nutzer den Task sehen können.
Alternativ kann man das Prüfen, Eintragen und Entfernen auch mit dem Tool Tuskforce.exe vornehmen: Quelle: http://netneurotic.net/bin/Elephant-x64.zip (ist im Zip enthalten)
Kurzanleitung zu Tuskforce:
Weitere Details dazu siehe: https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask und nähere Einsichten, welches Bit für was steht, auch hier: https://michlstechblog.info/blog/windows-run-task-scheduler-task-as-limi ...
Ich habe mich beim Aufbau dieser Anleitung anregen lassen von michlstechblog sowie vom Autor von Tuskforce: http://netneurotic.net/WindowsBlog/scheduledtasks/
Bei den beiden kam für meinen Geschmack der direkte Weg zum Ergebnis etwas zu kurz, gerade was das Entfernen von gesetzten Rechten anging.
Einsatzzweck ist beispielsweise, ohne Adminrechte zu vergeben, dem Nutzer das Recht zu geben, spontan ein Vollbackup durchzuführen, oder seine IP-Adresse zu ändern, oder in beliebige (Konfigurations-)dateien zu schreiben, wozu er andernfalls kein Recht hätte.
Logischerweise ist das nur dann sicher, wenn das Skript/das Executable, welches der Task ausführt, an einem für den Nutzer nicht beschreibbaren Ort liegt (maximal Lese- und Ausführrechte).
Die Skripte/Exe müssen hierbei ohne Oberfläche (silent) ablaufen können, da der Task unsichtbar läuft!
Da Windows seit Längerem keine Änderung der Berechtigungen auf Tasks über die GUI zulässt, muss man die PowerShell zur Hilfe nehmen. Das Konto, mit dem man die PowerShell startet, muss hierfür volle Rechte auf den Task haben – dies ist in der Regel mit jedem Adminkonto gegeben.
Skriptbeispiel zum Hinzufügen von Lese- und Ausführberechtigungen explizit für Nutzer mydom\testuser auf den Task „Testtask" im Taskordner „Testordner".
$account = New-Object System.Security.Principal.NTAccount("mydom\testuser")
$SID=$account.Translate([System.Security.Principal.SecurityIdentifier]).Value
$TaskScheduler = New-Object -ComObject Schedule.Service
$TaskScheduler.Connect()
$Task = $TaskScheduler.GetFolder("Testordner").GetTask("Testtask")
$sec=$task.GetSecurityDescriptor(0xF)
$sec=$sec + "(A;;GRGX;;;$SID)"
$Task.SetSecurityDescriptor($sec, 0)
$Task = $TaskScheduler.GetFolder("").GetTask("Testtask")
Hat man dem Nutzer das Recht erteilt, kann dieser den Task nun zum Beispiel per GUI oder auch per Batch starten:
schtasks /run /tn \Testordner\Testtask
Und wie macht man das rückgängig?
Skriptbeispiel zum Entfernen von expliziten Berechtigungen für Nutzer mydom\testuser auf den Task „Testtask" im Taskordner „Testordner" (mit Kommentaren, da erheblich komplizierter als das Hinzufügen):
$account = New-Object System.Security.Principal.NTAccount("mydom\testuser")
$SIDToRemove=$account.Translate([System.Security.Principal.SecurityIdentifier]).Value
$ScheduledTask="Testordner\Testtask"
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\$ScheduledTask"
$helper = [wmiclass]"Win32_SecurityDescriptorHelper"
# Load the binary security descriptor from the registry
$binarySD = (Get-ItemProperty -Path $regPath -Name "SD").SD
$descriptorObj = $helper.BinarySDToWin32SD($binarySD).Descriptor
$originalDACL = $descriptorObj.DACL
# Filter the DACL to exclude ACEs for the SID we want to remove
$filteredDACL = @()
foreach ($ace in $originalDACL) {
$trusteeSID = $ace.Trustee.SIDString
if ($trusteeSID -ne $SIDToRemove) {
$filteredDACL += $ace
} else {
Write-Host "Removing ACE for SID: $trusteeSID"
}
}
# Reassign the filtered DACL as a strongly-typed WMI object array
$descriptorObj.DACL = [System.Management.ManagementBaseObject[]]$filteredDACL
# Convert the descriptor back to binary and write it to the registry
$updatedBinarySD = $helper.Win32SDToBinarySD($descriptorObj).BinarySD
Set-ItemProperty -Path $regPath -Name "SD" -Value $updatedBinarySD
Anmerkung: wenn der Testtask direkt im Wurzelverzeichnis liegt, schreibt man in Zeile 3 schlicht keinen Ordnernamen vor den Tasknamen: $ScheduledTask="Testtask"
Prüfen kann man das erhoffte Ergebnis per Taskscheduler selbst: nur wenn Ausführrechte eingetragen sind, wird der Nutzer den Task sehen können.
Alternativ kann man das Prüfen, Eintragen und Entfernen auch mit dem Tool Tuskforce.exe vornehmen: Quelle: http://netneurotic.net/bin/Elephant-x64.zip (ist im Zip enthalten)
Kurzanleitung zu Tuskforce:
- Um überhaupt alle Berechtigungen auf den selektierten Task zu sehen, muss man zunächst im Menü View "show all permissions" auswählen.
- Beim Hinzufügen muss man eine Zugriffs-Bitmaske als Nummer neben den User (mydom\testuser) eintragen. Typischerweise gibt es 3 Zugriffs-Bitmasken für Aufgaben, die von authentifizierten Benutzern gesteuert werden können: Vollzugriff: 2032127 (in Hex: 0x1f01ff, per Default vergeben für System, Administratoren), Lesen und Ausführen: 1179817 (0x1200a9, SYSTEM, Authentifizierter Benutzer, Lokaler Dienst, Netzwerkdienst) und nur Lesen ohne Ausführrechte: 1179785 (0x120089)
- Zum Entfernen eines ACL-Eintrags muss dieser hervorgehoben werden und dann drücke man die Entfernen-Taste!
- Schreiben der gesetzten Rechte dann per Rechtsklick "write permissions to scheduled task".
Weitere Details dazu siehe: https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask und nähere Einsichten, welches Bit für was steht, auch hier: https://michlstechblog.info/blog/windows-run-task-scheduler-task-as-limi ...
Ich habe mich beim Aufbau dieser Anleitung anregen lassen von michlstechblog sowie vom Autor von Tuskforce: http://netneurotic.net/WindowsBlog/scheduledtasks/
Bei den beiden kam für meinen Geschmack der direkte Weg zum Ergebnis etwas zu kurz, gerade was das Entfernen von gesetzten Rechten anging.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 672750
Url: https://administrator.de/tutorial/task-berechtigungen-via-powershell-vergeben-672750.html
Ausgedruckt am: 06.05.2025 um 14:05 Uhr