У нас есть запланированная задача, которая представляет собой сценарий PowerShell. Сценарий выполняет ряд действий с базами данных SQL, доступ к которым контролируется с помощью встроенной защиты. Следовательно, каждое из этих действий должно выполняться процессом, который выполняется под соответствующими учетными данными Windows AD, и необходимо использовать более одного набора учетных данных.
Подробности:
Задача powershell вызывается в планировщике задач следующим образом:
cmd.exe /C ""powershell.exe" -Noninteractive "C:\someDir\SomeScript.ps1" >"C:\logDir\SomeScript.log" 2>&1"
Другими словами, cmd.exe
это Program/script
вызывается, остаток строки - это Add arguments (optional):
часть. (Мы используем этот способ по причинам, не имеющим отношения к рассматриваемому вопросу, отчасти из-за того, как мы спроектировали ведение журнала в разработанных нами библиотеках сценариев.)
В настройках запланированного задания (General
), выбираем Run whether user is logged in or not
и Run with highest privileges
. Идентификатор пользователя, запускающего задачу, позвольте назвать его ad\admin1
, имеет права локального администратора.
Внутри сценария SomeScript.ps1
, мы вызываем другие скрипты под другими учетными данными через
Start-Process $explicitPowershellExe -NonInteractive -Credential $credential -Wait -ArgumentList @( '-file', $scriptForSqlOperations )
Полномочия $credential
предназначены для пользователей, отличных от ad\admin1
. Этот вызов молча не запускает powershell, хотя ошибки не возникает. Единственный признак того, что Powershell не запускается, - это событие в "Windows Logs" => System:
Всплывающее окно приложения: powershell.exe - Ошибка приложения: приложение не смогло запуститься правильно (0xc0000142). Щелкните ОК, чтобы закрыть приложение.
Обратите внимание, что мы можем без проблем запустить сценарий, если он выполняется вне запланированной задачи. Запуск скрипта SomeScript.ps1
в сеансе входа в систему для пользователя ad\admin1
успешно работает любым способом. Например, в cmd.exe
консоль (работает с администратором), мы можем запустить точный линия
cmd.exe /C ""powershell.exe" -Noninteractive "C:\someDir\SomeScript.ps1" >"C:\logDir\SomeScript.log" 2>&1"
и это удается, или мы можем проще запустить
powershell -Noninteractive "C:\someDir\SomeScript.ps1"
в командной строке, и все идет хорошо. Итак, проблема явно в том, как TaskScheduler настраивает cmd.exe
процессы, которые он запускает.
Кто-нибудь знает, в чем может быть проблема и как ее обойти? Я подозреваю, что это какое-то ограничение безопасности при выдаче себя за другое лицо в запланированной задаче ????
Спасибо.