6

Я использую Windows 10 и пытаюсь заставить работать пару запланированных задач. Эти задачи настроены на выполнение при блокировке рабочей станции и разблокировке рабочей станции, а также при выполнении сценария, который удаленно блокирует или разблокирует смежную рабочую станцию arch-linux. Это достигается с помощью интерфейса командной строки WinSCP, WinSCP.com, и его встроенных возможностей сценариев. Эти скрипты работают просто отлично - я могу вызывать их вручную до нужного эффекта. Я даже могу щелкнуть правой кнопкой мыши по задачам, которые я установил, и нажать «Выполнить», и наблюдать желаемый эффект. Проблема заключается в том, что события блокировки рабочей станции и разблокировки рабочей станции, по-видимому, никогда не инициируются, когда фактически блокируется и разблокируется рабочая станция. Этот же набор запланированных задач работал, как и ожидалось, в Windows 7.

Обзор задач блокировки / разблокировки

Окно планировщика заданий

Исходя из полученных ответов, я могу заставить задачи запускаться, как ожидается, если установить флажок "Запускать только когда пользователь вошел в систему", но это имеет нежелательный побочный эффект, приводящий к отображению видимого командного окна при запуске задач. ,

ОС Windows 10 Enterprise LTSB 2016 (x64). Любое понимание или идеи будут оценены.

Вещи, которые я уже пробовал:

  • Использование GPO для включения аудита событий блокировки / разблокировки рабочей станции - безрезультатно. (события блокировки / разблокировки отображаются в окне просмотра событий, как и ожидалось)

  • Создание альтернативного пользователя Windows и настройка задачи для выполнения в качестве этого участника.

  • Перенос звонка на WinSCP.com в пакетном скрипте.

  • Изменение локального объекта групповой политики, чтобы убедиться, что вход в систему как пакет включен.

Другая важная информация: другие запланированные задачи (например, те, которые выполняются в установленное время или интервал) работают нормально. Только эти две задачи не срабатывают.

Редактировать: согласно комментарию Твисти, я включил историю задач и получил реальное сообщение об ошибке: Сообщение об ошибке планировщика задач

Таким образом, кажется, что задача действительно запущена, но не запускается. Интересно, что это не обновляет свойство "Время последнего запуска" для задачи.

Некоторое беглое гугление указывает, что эта ошибка может быть связана с информацией о входе в систему и пароле. Я проверил, что сохраненный пароль правильный, но проблема остается. Вот скриншот вкладки «Общие» по запросу.Вкладка "Общие"

Вот исполняемый скрипт WINSCP (подвергнутый цензуре):

# Connect
open sftp://charles@192.168.0.1:2222/ -hostkey="ssh-rsa 2048 
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
call cinnamon-screensaver-command -d
close
exit

Я только что попытался обернуть это в очень простой пакетный файл:

@ECHO ON

SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com"
%prgwinscp% /script=lock-arch.winscp

Я могу выполнить это вручную, и как запланированное задание оно работает, когда я отмечаю "Запускать только когда пользователь вошел в систему". К сожалению, как и раньше, после того, как я установил задачу «Запускать, вошел ли пользователь в систему или нет», я получаю обычную ошибку.

Как и требовалось, вот скриншот вкладки действий:панель действий

Затененный текст выглядит следующим образом:

Add Arguments (Optional):    /script=unlock-arch.winscp
Start in (Optional):    C:\Program Files (x86)\WinSCP

3 ответа3

6

Выполните следующие шаги, чтобы устранить неполадки и решить вашу проблему

Свойства планировщика задач. , ,

Из Task Scheduler Windows о свойствах задания (см. Большинство снимков экрана внизу) в. , ,

  • 1. На вкладке Общие убедитесь, что нижеперечисленные параметры выбраны / отмечены или не отмечены, как показано на экране печати A

    • Снимите флажок Run only when user is logged on
    • Проверьте Run whether user is logged on or not
    • Проверьте Run with the highest privileges
  • 2. Условия Вкладка, убедитесь , что приведенные ниже варианты выбора, чек, или незарегистрированный так же , как показано на Print Screen B

    • Установите Wake the computer to run this task
  • 3. На вкладке « Действия » нажмите « Изменить» и убедитесь, что параметр « Start in (optional) установлен точно так же, как показано в примере ниже (НЕ ставьте двойные кавычки вокруг него) для полного пути, указывающего, где находится пакетный скрипт, БЕЗ окончательной обратной косой черты » \ " Экран печати C


СООБРАЖЕНИЯ БЕЗОПАСНОСТИ

  • Как только вы нажмете OK (2. выше), он должен запросить у вас учетные данные для запуска этого файла, и именно эти учетные данные потребуют доступа к EXECUTE пакетного файла там, где он существует, и ему также потребуется доступ для выполнения любого пакетного файла. работает, что вы сценарий.

  • Для этого процесса лучше всего настроить статическую учетную запись пользователя службы / прокси, а затем использовать ее учетные данные для запуска процесса. Вам нужно убедиться, что его пароль надежный, и он настроен так, что срок его действия не истечет, и ему нужен доступ для EXECUTE пакета и запуска независимо от того, запущен ли пакетный сценарий и какие команды и ресурсы, и т.д. он также использует.

  • Кажется, что опция Run whether user is logged on or not вы ДОЛЖНЫ проверить опцию Run with highest privileges чтобы он действительно работал так, как ожидалось от планировщика задач.

Проверка ошибок

  • Если есть проблема с фактическим пакетным сценарием, но планировщик задач Windows фактически выполняет его, чтобы запустить его, но логика пакетного сценария выдает ошибки и т.д. По какой-либо причине, планировщик задач может не увидеть этот сбой на этом уровне. С его точки зрения (по умолчанию большую часть времени) он выполняет командный файл, поэтому, пока он может его выполнять и имеет доступ к нему, его работа выполняется успешно.

  • Добавьте проверку ошибок или ведение журнала в логику пакетного сценария, чтобы выявить (или устранить неисправности) проблемы на этом уровне, включая обеспечение того, чтобы контекст безопасности, в котором его выполняет пакетный планировщик, имел соответствующий доступ к командам, ресурсам и т.д., К которым запускается пакетный сценарий.


Вопросы групповой политики

ПРОВЕРЬТЕ ПОЛИТИКУ ГРУППЫ И ВХОДИТЕ КАК РАЗРЕШЕНИЕ НА РАБОТУ

Ответ. В Windows эта привилегия предоставляется через локальную политику или политику безопасности домена.Чтобы сделать это с помощью локальной политики безопасности, выполните следующие действия.

  1. На панели управления откройте Администрирование, затем Локальная политика безопасности.
  2. Под настройками безопасности откройте Локальные политики и выделите Назначение прав пользователя.
  3. Найдите Вход в систему как пакетное задание. Откройте свойства и добавьте пользователей, которым необходимо это право.
  4. Когда закончите, сохраните ваши изменения и закройте окно Local Security Settings.

Ваши изменения должны вступить в силу немедленно. Чтобы внести изменения в Политику безопасности домена, на контроллере домена используйте утилиту Политики безопасности домена в Панели управления.


Логика пакетного сценария с подключенными дисками или полным UNC-путем и проблемы. , ,

Если ваш сценарий ссылается на подключенный сетевой диск, но вы хотите, чтобы он Run whether the user is logged on or not , то в этом контексте сопоставление дисков может фактически отсутствовать, чтобы пакетный процесс мог выполнить то, что ожидалось.

Если возможно, используйте пути UNC в логике пакетного сценария, а не букву подключенного диска, чтобы избежать проблем. В противном случае вам может понадобиться использовать PUSHD \\ServerName\ShareName в начале пакетного процесса, а затем использовать POPD в конце пакетного процесса. Вы можете сопоставить диск с помощью NET USE X: \\ServerName\ShareName в начале пакетного процесса, а затем отключить диск с помощью NET USE X: /DELETE в конце пакетного процесса.


Экраны печати

Экран печати A

Экран печати B

Экран печати C


Примеры пакетных скриптов WinSCP

Ниже приведены два очень простых и полных примера сценария FTP для загрузки и сценария FTP для загрузки с FTP-сервера с использованием WinSCP.com . Убедитесь, что в переменной SET winscplogin= указано имя FTP-соединения, которое вы определили из графического интерфейса WinSCP.

Таким образом, сценарий создается динамически, и вы создаете команды FTP из пакетного сценария, но вы также можете просто указать его на статический сценарий WinSCP с командами FTP в них, в противном случае это тоже легко установить.

Загрузить на FTP-сервер

@ECHO ON

SET logfile=C:\folder\path\log.log

::SET WinSCP variables, etc.
SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com"
SET winscplogin="ABC Company"
SET winscpfile=C:\folder\path\ABCompany_FTP_OUT_WinSCP.txt
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"

:ftpout
ECHO.                                              >> "%logfile%"
ECHO *******************FTP OUT******************* >> "%logfile%"
ECHO Delivering file(s) to ABC Company FTP server  >> "%logfile%"
SET ftpdir="ToABC"
ECHO option batch on           >> %winscpfile%
ECHO option confirm off        >> %winscpfile%
ECHO option transfer binary    >> %winscpfile%
ECHO open %winscplogin%        >> %winscpfile%
ECHO cd %ftpdir%               >> %winscpfile%
ECHO put "C:\Folder\Path\*.*"  >> %winscpfile%
ECHO dir                       >> %winscpfile%
ECHO close                     >> %winscpfile%
ECHO exit                      >> %winscpfile%
ECHO %winscpfile%                                >> "%logfile%"
TYPE %winscpfile%                                >> "%logfile%"
ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%"
%prgwinscp% /script=%winscpfile%                 >> "%logfile%"
ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%"
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"
ECHO Transmission complete                       >> "%logfile%"

Скачать с FTP-сервера

@ECHO ON

SET logfile=C:\folder\path\log.log

::SET WinSCP variables, etc.
SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com"
SET winscplogin="ABC Company"
SET winscpfile=C:\folder\path\ABCompany_FTP_IN_WinSCP.txt
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"

:ftpin
ECHO.                                             >> %logfile%
ECHO *******************FTP IN******************* >> %logfile%
ECHO Retrieving files from ABC Company server     >> %logfile%
SET ftpdir="FromABC"
ECHO option batch on          >> %winscpfile%
ECHO option confirm off       >> %winscpfile%
ECHO option transfer binary   >> %winscpfile%
ECHO open %winscplogin%       >> %winscpfile%
ECHO cd %ftpdir%              >> %winscpfile%
ECHO ls                       >> %winscpfile%
ECHO get "*.*" "C:\Folder\path\"  >> %winscpfile%
ECHO close                    >> %winscpfile%
ECHO exit                     >> %winscpfile%
ECHO %winscpfile%                                >> %logfile%
TYPE %winscpfile%                                >> %logfile%
ECHO ------------------------------------------- >> %logfile%
%prgwinscp% /script=%winscpfile%                 >> %logfile%
ECHO ------------------------------------------- >> %logfile%
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"
ECHO FTP Downloading Complete                    >> %logfile%
ECHO Transmission complete                       >> %logfile%

Пользовательские примеры скриптов

При планировании пакетного сценария обязательно используйте обе опции « Выполнить» независимо от Run whether user is logged on or not Run with the highest privileges . После того, как вы примените эти изменения, вам нужно будет ввести учетные данные, чтобы выполнить задачу в явном виде. Обязательно используйте учетную запись, которая имеет доступ к файлу C:\Program Files (x86)\WinSCP\WinSCP.com и также отвечает другим общим требованиям, перечисленным выше.

Если у вас все еще есть проблемы и вы хотите подтвердить, что это не связано с безопасностью ОС, создайте новую локальную учетную запись на компьютере и задайте для нее надежный пароль, установите для нее никогда не истекать срок действия и разрешите запуск в качестве пакетных разрешений. Вы также можете сделать его локальным администратором и протестировать, чтобы узнать, имеет ли какое-либо значение предоставление учетной записи локального администратора на машине.

Это будет означать, что у вас есть два файла: пакетный скрипт и WinSCP. Пакетный скрипт передаст скрипт WinSCP на WinSCP.com, и вы можете просто выполнить его, чтобы запустить процесс. Убедитесь, что этот сценарий работает как тот же пользователь, когда он вошел в систему, просто выполнив его для тестирования, а затем протестировать с той же учетной записью, когда он вошел в систему на сеансе компьютера с параметром Run only when user is logged on чтобы подтвердить, что он работает и из планировщика задач перед тем, как установить его на работу, независимо от того, вошли вы в систему или нет

На вкладке Actions планировщика заданий будет использоваться только поле « Program/Script: при этом все остальные поля будут оставлены пустыми, а поле « Program/Script: будет иметь значение C:\folder\path\yourbatchscript.cmd .

Пакетный скрипт

@ECHO ON

SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com"
%prgwinscp% /script=lock-arch.winscp

EXIT

Скрипт WinSCP

open sftp://charles@192.168.0.1:2222/ -hostkey="ssh-rsa 2048 
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
call cinnamon-screensaver-command -d
close
exit
3

Я решил эту проблему, обойдя типы триггеров «Блокировка / разблокировка на рабочей станции» и установив триггеры для непосредственного просмотра журнала событий Windows.

Это не идеально, но должно быть устойчивым. Определенно все еще любопытно, почему триггеры, предоставляемые планировщиком заданий, не работают.


Настроить события блокировки / разблокировки

По умолчанию события блокировки / разблокировки не проверяются в журнале событий, вам необходимо включить ведение журнала этих событий. Вы можете сделать это из редактора групповой политики:

запустить -> gpedit.msc

и настройка следующей категории:

Конфигурация компьютера ->
Настройки Windows ->
Настройки безопасности ->
Расширенная настройка политики аудита ->
Политики аудита системы - Объект локальной групповой политики ->
Вход / Выход из системы ->
Аудит Другое Войти / Выйти События

(На вкладке « Объяснение » написано «... позволяет проводить аудит ...» Блокировка и разблокировка рабочей станции ".)

Кредит: https://stackoverflow.com/a/15904838/1216896


Создать триггеры

Оттуда вы можете настроить триггеры для событий 4800 (блокировка) и 4801 (разблокировка) следующим образом:

Конфигурация триггера

1

В планировщике задач Win10 много ошибок, особенно в графическом интерфейсе. Смотрите: https://www.ctrl.blog/entry/idle-task-scheduler-powershell

Возможно, вам повезет пересобрать интерфейс:

mofcomp c:\Windows\System32\wbem\SchedProv.mof

Вы также можете создать задачу через интерфейс COM в PowerShell. Я предпочитаю использовать строковую переменную, содержащую определение XML. Вы можете экспортировать XML задачи, созданной с помощью графического интерфейса, и очистить / исправить ее. Затем:

$TaskService = new-object -ComObject('Schedule.Service')
$TaskService.connect()
$Task = $TaskService.NewTask($null)
$task.XmlText = $XMLstring
$null = $Global:TaskFolder.RegisterTaskDefinition('Lock Arch Workstation', $Task, 6, $null, $null, 3)

Удачи!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .