У меня есть сценарий PowerShell, который копирует файлы с локального диска на сетевой диск. Все работает нормально, когда я запускаю этот скрипт через PowerShell, но когда я запускаю этот скрипт с планировщиком задач, он не работает. Я также создал простой скрипт с одной строкой для создания файла
New-Item -Path "Z:\DBBackups\" -Name testfile -Value "test123" -ItemType file -force
Этот сценарий работает через PowerShell с путем к подключенному сетевому диску и работает с планировщиком задач, когда путь находится на локальном диске, но не работает, когда путь - это сетевой диск.
Параметры планировщика заданий: Действие: Запустить программу
Программа / скрипт: powershell.exe
Добавьте аргументы: -ExecutionPolicy Bypass -File "E: \ t.ps1"
Учетная запись для запуска задачи, которую я установил в качестве администратора, у которого есть права на сетевой диск, также настроена на запуск сценария, когда пользователь не вошел в систему, не хранит пароль и с наивысшими привилегиями
Что я могу сделать, чтобы использовать планировщик задач со сценарием, использующим сетевой диск?
Могу я предложить подписать ваш сценарий? Я выполнил эти инструкции для аналогичного сценария, который у меня есть, который создает пакет развертывания. Мой сценарий должен быть переносимым, и я устал от необходимости менять политику выполнения. Он также получает доступ к защищенным ресурсам, которые были заблокированы политикой по умолчанию (например, архивирует папки перед отправкой в общий ресурс). После подписания вам необходимо развернуть один из сертификатов на сервере, на котором выполняется ваш скрипт.
Вот инструкции, которые нужно держать в руках (у меня работало в Windows 10 и даже было развернуто на сервере Windows 2008 R2).
https://www.hanselman.com/blog/SigningPowerShellScripts.aspx
Раньше я пытался подписаться, читая MSDN, и заблудился. Для меня большое «ах-ха» заключается в том, что этот процесс вставляет закодированный блок TEXT в ваш скрипт. Я не понял, куда делся файл с сертификатом.
И в качестве альтернативного решения вы можете попробовать Robocopy. Зачем изобретать велосипед :-)
Вы не указали, находитесь ли вы в домене или в рабочей группе. Основная проблема заключается в том, что вы запускаете сценарий от имени администратора, а это не та же учетная запись «Администратор» в общей сетевой папке.
Если это компьютер рабочей группы, это не сработает. Единственный обходной путь, который вы можете использовать, - это создать скрипт, отображающий букву диска, используя учетные данные в виде обычного текста. До смешного небезопасно, но если вы заблокируете удаленную учетную запись и предоставите ей только права на запись в папку, вы сможете ограничить доступ.
Если это домен активного каталога, то вам повезло. Вам необходимо изменить запланированную задачу и запустить ее под учетной записью службы. В этом случае учетная запись администратора не имеет доступа к сетевым ресурсам, и, поскольку это не та же учетная запись на удаленном сервере, она не может пройти аутентификацию на удаленном общем ресурсе. Учетная запись службы должна быть учетной записью службы, управляемой пользователем / группой домена. Вам нужно будет предоставить доступ к этой учетной записи на удаленном общем ресурсе и на уровне NTFS.
Как уже предлагал Питер Хандорф, вам следует изменить аргумент -Path, чтобы использовать сетевой путь вашего удаленного общего ресурса, а не букву диска. Буква диска уникальна для каждого пользователя, если это подключенный диск, а также недоступна для учетной записи администратора, если вы подключили его под своим логином.
ripvlan также сделал очень хорошее предложение подписать ваш сценарий. Это не только избавляет вас от необходимости изменять политику выполнения, но также не позволяет кому-либо другому помещать дополнительный / вредоносный код в ваш скрипт и запускать его без вашего ведома. После подписания сценария любые изменения в этом сценарии потребуют отказа от него, прежде чем вы сможете его снова использовать.