Что необходимо учитывать при выполнении командного файла в качестве запланированной задачи?
У меня есть запланированное задание, которое выполняется, но, похоже, оно не работает. Эта задача выполняет командный файл. Пакетный файл содержит только одну строку:
wscript c:\myfolder/myscript.vbs
Этот файл VBScript запускает командную строку, выполняет vpncli
, спит одну минуту, затем переходит к настройке соединения, посылая имя пользователя / пароль в окно командной строки.
Это работает нормально при запуске командного файла из окна командной строки, но безуспешно при использовании запланированной задачи. Учетная запись, под которой выполняется задача, является управляемой учетной записью службы. После запуска задачи я проверяю в отдельном окне командной строки vpncli
и увидите, что соединение все еще отключено.
Что необходимо учитывать при выполнении командного файла в запланированном задании, чтобы решить эту проблему?
Ниже приведена часть кода, который я использую для выполнения в оболочке CMD. Выполняется следующая подпрограмма:
Sub VPN_open
VPN_Profile = "vpn.myhost.com"
VPN_User = "USERNAME"
' If the password contains special characters, enclose the characters in curly braces {}.
VPN_Password = "PASSWORD"
oShell.Run "cmd"
WScript.Sleep 100
oShell.AppActivate "C:\Windows\System32\cmd.exe"
oShell.SendKeys "vpncli connect " & VPN_Profile & "~"
WScript.Sleep 10000
oShell.SendKeys VPN_User & "~"
WScript.Sleep 5000
oShell.SendKeys VPN_Password & "~"
WScript.Sleep 10000
oShell.SendKeys "exit~"
End Sub 'VPN_open
1 ответ
Использование пакетного файла с одной командной строкой в качестве запланированной задачи обычно не имеет большого смысла. Было бы лучше указать непосредственно в запланированном задании запуск приложения, выполняемого командным файлом, с его параметрами, которые будут в этом случае %SystemRoot%\System32\wscript.exe
с параметром "C:\myfolder\myscript.vbs"
,
При использовании только консольных приложений было бы лучше использовать cscript
- консольная версия Windows Script Host - вместо wscript
- Windows GUI версия Windows Script Host. Справка по обоим приложениям отображается при запуске в окне командной строки cscript /?
с помощью вывода непосредственно в окно консоли и wscript /?
с помощью отображается в окне графического интерфейса.
Должно быть учтено как минимум 4 пункта при выполнении чего-либо как запланированной задачи:
Учетная запись пользователя настраивается в свойствах запланированной задачи.
Используемая учетная запись определяет разрешения как для локального диска, так и для общих сетевых ресурсов. Например, локальный администратор или системная учетная запись обычно не имеют прав доступа к любому ресурсу в локальной сети, но имеют полный доступ к любому каталогу на локальных дисках. Он также определяет доступные переменные среды и все зависящие от региона и языка настройки, такие как формат даты и времени для командdate
а такжеtime
и встроенные переменные среды ДАТА и ВРЕМЯ.Текущий рабочий каталог, установленный при запуске запланированного задания.
Каталог по умолчанию для запуска запланированной задачи%SystemRoot%\System32
если в свойствах запланированной задачи не настроена другая папка для использования в качестве запуска в папке. При двойном щелчке командного файла на диске с буквой диска каталог командного файла становится текущим рабочим каталогом. Любой скрипт, выполняемый командным файлом, должен это учитывать. Лучше всего написать скрипт для независимости от текущего каталога.Среда, определенная для запланированной задачи, зависит от используемой учетной записи.
Для всех учетных записей пользователей и переменных среды, связанных с учетными записями пользователей, используются системные переменные среды. При выполнении запланированного задания с другой учетной записью пользователя, такой как локальный администратор или системная учетная запись, некоторые переменные среды не могут быть определены, которые определяются при запуске того же сценария с собственной учетной записью пользователя. Рекомендуется сделать скрипты, выполняемые как запланированные задачи, максимально независимыми от переменных среды, за исключением системных переменных, определенных Windows, автоматически, напримерSystemRoot
, В статье Википедии Переменные среды Windows перечислены и описаны переменные среды, определенные Windows.Сетевые ресурсы, подключенные как сетевые диски, часто недоступны при выполнении запланированной задачи.
Windows хранит в реестре текущего пользователя, сетевой ресурс которого постоянно подключен как сетевой диск. Эти общие сетевые ресурсы подключаются (сопоставляются с буквой диска), когда пользователь входит в систему, и автоматически отключаются, когда пользователь выходит из системы. Запуск сценария в виде запланированной задачи с учетной записью, отличной от собственной учетной записи, делает сетевые диски недоступными для сценария, поскольку ни одна сетевая папка не подключена как сетевой диск, а другая учетная запись, скорее всего, вообще не имеет доступа к сетевому ресурсу. И даже если в свойствах запланированной задачи настроено использование собственной учетной записи пользователя, сетевые диски недоступны, поскольку нет входа в систему до запуска запланированной задачи, за исключением того, что запланированная задача настроена на запуск только при входе пользователя в систему.
Решение использует в сценарии UNC-пути и учетную запись с необходимыми правами доступа к сетевому ресурсу или сопоставлению, например, сnet use X: \\ComputerName\ShareName password /user:DomainName\AccountName /persistent:no
доля вожденияX:
и отключиться перед выходом из скриптаnet use X: /delete
Запустить в окне командной строкиnet use /?
за помощь по этой команде.
Используя для запланированной задачи учетную запись с разрешениями доступа к общему сетевому ресурсу, нет необходимости указывать пароль и имя учетной записи в (пакетном) сценарии, который является гораздо более безопасным, поскольку в противном случае каждый, имеющий доступ для чтения к файлу сценария, может увидеть незашифрованный пароль и имя учетной записи. Windows хранит учетные данные запланированной задачи в зашифрованном виде.
Таким образом, VBScript работает нормально при ручном выполнении с текущей учетной записью пользователя, где текущим каталогом является каталог пакетного файла с переменными среды, определенными для текущей учетной записи пользователя, и, возможно, с подключенными сетевыми дисками, доступными для сценария, и приложениями, вызываемыми сценарием, исследован на предмет поиска причины, по которой скрипт не работает как запланированная задача со свойствами, настроенными для запланированной задачи.