Вопрос или проблема
У меня есть запланированная задача, которую я хочу запускать/триггерить как обычный пользователь без административных привилегий на локальном компьютере. Задача была создана с использованием учетной записи NT AUTHORITY\SYSTEM
Когда я выполняю задачу с помощью PowerShell, я получаю сообщение Start-ScheduledTask : Access is denied
Что я сделал до сих пор
Установил Allow
для List folder contents
и Read
в
C:\Windows\System32\Tasks
Установил Allow
для Read & execute
и Read
в
C:\Windows\System32\Tasks\MyTask
Как я могу изменить разрешения для Authenticated Users
, чтобы иметь возможность запускать/триггерить MyTask?
Существует способ, который позволяет выполнить то, что требовалось в исходном вопросе: изменить разрешения запланированной задачи, чтобы позволить “аутентифицированным пользователям” запускать/триггерить эту запланированную задачу.
Проблема с разрешениями для запланированных задач относится к системам Windows OS 2016 / Windows 10 и более новым, насколько я могу судить. Ранее аутентифицированные пользователи могли запускать запланированные задачи, получая соответствующие разрешения на папку C:\Windows\System32\Tasks.
Сегодня эту проблему можно решить, изменив ACL для конкретной запланированной задачи. Эти ACL хранятся в реестре. Конечно, есть разные способы изменить эти ACL. Этот конкретный метод использует PowerShell для предоставления возможности увидеть и выполнить указанную запланированную задачу для аутентифицированных пользователей. (Вы также можете настроить его так, чтобы он работал для определенного SID пользователя, однако это другая задача.)
Я протестировал это у себя, и это сработало.
Запустите следующий код в PowerShell – запустите как Администратор, иначе он, скорее всего, не сработает. Убедитесь, что сначала обновили значения $TaskPath и $TaskName так, чтобы они соответствовали запланированной задаче, которую вы нацеливаетесь.
####################################
#ВАЖНО: Запустите PowerShell как Администратор
####################################
$TaskName = "(имя запланированной задачи, которую вы хотите запустить)"
$TaskPath = "\" #Запланированные задачи на базовом уровне используют этот путь. Любой более глубокий уровень необходимо добавить в путь папки.
$Scheduler = New-Object -ComObject "Schedule.Service"
$Scheduler.Connect()
$GetTask = $Scheduler.GetFolder($TaskPath).GetTask($TaskName)
$GetSecurityDescriptor = $GetTask.GetSecurityDescriptor(0xF)
if ($GetSecurityDescriptor -notmatch 'A;;0x1200a9;;;AU') {
$GetSecurityDescriptor = $GetSecurityDescriptor + '(A;;GRGX;;;AU)'
$GetTask.SetSecurityDescriptor($GetSecurityDescriptor, 0)
}
Информация для этого поста была в значительной степени получена из следующего сайта:
https://www.osdeploy.com/blog/2021/scheduled-tasks/task-permissions
Ответ или решение
Теория
В современных операционных системах Windows, таких как Windows 10 и Windows Server 2016, управление разрешениями для запланированных задач стало более сложным, чем в предыдущих версиях. Правильная настройка разрешений для запуска задач пользователями без административных привилегий требует настройки списков управления доступом (ACLs). Это необходимо для предотвращения несанкционированного доступа и повышения уровня безопасности системы.
ACLs для запланированных задач хранятся не в файловой системе, а в реестре Windows. Для изменения этих разрешений часто используется PowerShell, что позволяет детально и точно управлять доступом.
Пример
В данном примере рассматривается задача, которую нужно запускать от имени пользователя без административных привилегий. Сама задача была создана от имени `NT AUTHORITY\SYSTEM`. При попытке запуска через PowerShell возникает ошибка `Start-ScheduledTask : Access is denied`. Это происходит из-за отсутствия нужных разрешений у пользователя.
Применение
Для решения этой задачи необходимо изменить ACLs запланированной задачи. Вот пошаговая инструкция, как это сделать:
-
Запуск PowerShell от имени администратора: Сначала откройте PowerShell с правами администратора, поскольку выполнение скрипта требует высокой привилегии.
-
Инициализация объектов PowerShell: Необходимо создать объекты, которые позволят взаимодействовать с задачами. Объявите переменные для имени и пути задачи, которые вы хотите настроить.
-
Получение задачи: Подключитесь к службе задач и извлеките задачу, для которой нужно изменить разрешения.
-
Изменение ACLs: Проверьте текущий дескриптор безопасности задачи и добавьте туда права на чтение и выполнение для `Authenticated Users`. Вот пример такого скрипта:
####################################
# ВАЖНО: Запуск PowerShell от имени администратора
####################################
$TaskName = "Имя запланированной задачи"
$TaskPath = "\" # Запланированные задачи на базовом уровне используют этот путь. Для более вложенных задач, укажите полный путь.
$Scheduler = New-Object -ComObject "Schedule.Service"
$Scheduler.Connect()
$GetTask = $Scheduler.GetFolder($TaskPath).GetTask($TaskName)
$GetSecurityDescriptor = $GetTask.GetSecurityDescriptor(0xF)
if ($GetSecurityDescriptor -notmatch 'A;;0x1200a9;;;AU') {
$GetSecurityDescriptor = $GetSecurityDescriptor + '(A;;GRGX;;;AU)'
$GetTask.SetSecurityDescriptor($GetSecurityDescriptor, 0)
}
Этот скрипт проверяет наличие необходимых разрешений и, если они отсутствуют, добавляет их.
-
Проверка изменений: После внесения изменений в ACLs, проверьте работу задачи от имени пользователя без привилегий через интерфейс Windows или командную строку.
-
Тестирование и отладка: Всегда тестируйте изменения в безопасной среде перед внедрением их в рабочую.
Преимущества данного подхода заключаются в гибкости и возможности тонкой настройки безопасности. Теперь, разрешив запуск задачи, вы не повышаете глобально уровень привилегий для пользователя, а ограничиваете его доступ строго необходимыми функциями.
Таким образом, данное руководство позволяет максимально эффективно и безопасно настроить запуск запланированных задач, не нарушая общей безопасности системы. Это особенно актуально для корпоративных пользователей, где строгая политика безопасности является нормой.