Я пытался настроить сценарий PowerShell для запуска как части запланированной задачи на сервере Windows Server 2012 R2. Сценарий запустится, если я выполню его вручную из графического интерфейса, но все мои попытки запустить его из задачи, кроме одной, потерпели неудачу.
После некоторого устранения неполадок я обнаружил, что если я устанавливаю задачу «Запускать только при входе пользователя в систему» и выполняю задачу, она работает нормально. Он открывает окно PowerShell, запускает сценарий и закрывается. Похоже, что я на правильном пути, и я, возможно, сузил круг вопросов относительно того, в чем проблема, но я не знаю, что делать дальше. Очевидно, я хотел бы, чтобы сценарий выполнялся независимо от того, вошел я в систему или нет.
На всякий случай вот сценарий, который я запускаю:
Get-ChildItem C:\somefolder -Recurse|
Where-Object{$_.PsIsContainer}| Sort-Object CreationTime -desc|
Select-Object -Skip 3| Remove-Item -Force
Где я могу смотреть отсюда? Я смог без проблем запускать сценарии PowerShell таким образом с сервера 2008, но я просто не могу взломать этот.
РЕДАКТИРОВАТЬ: для действия задачи, установленной для запуска программы, и в разделе «Программа / сценарий» у меня есть «powershell», затем «. \ Myscript.ps1» для аргументации, затем «c: \» для запуска.
Наконец понял это:
Проблема оказалась в том, что я пытался чем-то манипулировать на сетевом диске. Я узнал, что даже если у вас уже есть подключенный диск в Windows, вы НЕОБХОДИМО отключить и переназначить диск как часть вашего скрипта для неинтерактивного управления файлами через скрипт PowerShell.
Вот что я добавил в свой сценарий PowerShell, чтобы он заработал:
$secpasswd = ConvertTo-SecureString "YourPassword" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Remove-PSDrive –Name “Z”
New-PSDrive –Name “Z” –PSProvider FileSystem –Root “\\192.168.X.X\backup” –Persist -Credential $mycreds
Что-то с кэшируемыми учетными данными происходит, когда вы вошли в систему, но не используется, когда вы запускаете тот же сценарий через диспетчер задач.
Большое спасибо за все ответы, которые я получил на этот вопрос, это действительно помогло мне, наконец, разобраться в этом, надеюсь, это поможет и кому-то еще.
Последнее замечание: этот же метод работал и с пакетными файлами на том же сервере.
Можете ли вы попробовать запустить следующее:
powershell -noprofile -noexit -executionpolicy bypass -file C:\path\script.ps1
Также убедитесь, что для: get-executionpolicy установлено значение RemoteSigned.
Также отметьте «Запускать» вне зависимости от того, вошел ли пользователь в систему или нет.
Вы пробовали изменять настройки UAC для администраторов на контроллерах домена? (лучше всего сделать это через GPO) Есть 3 различных параметра, которые нужно изменить, чтобы скрипт Powershel работал в рамках запланированной задачи. Эти 3 параметра политики UAC можно найти в разделе Конфигурация компьютера >> Политики >> Настройки Windows >> Настройки безопасности >> Местная политика >> Параметры безопасности: - Контроль учетных записей пользователей: Режим утверждения администратором для встроенной учетной записи администратора (Не определено) - Контроль учетных записей пользователей: Запустить всех администраторов в режиме одобрения администратором (Отключено) - Контроль учетных записей пользователей: Поведение запроса на повышение прав для администраторов в режиме одобрения администратором (Поднимите без подсказки) Настройте их так, чтобы UAC не срабатывал, когда запланированная задача выполняется с учетной записью с правами администратора.
Вы, конечно, должны были выбрать вариант "Запускать всякий раз, когда пользователь входит в систему или нет"в общих параметрах конфигурации запланированной задачи.