Windows 10:工作站锁定/解锁的计划任务未触发

Windows 10:工作站锁定/解锁的计划任务未触发

我正在运行 Windows 10,并尝试让一对计划任务运行。这些任务设置为在工作站锁定和工作站解锁时运行,并执行远程锁定或解锁相邻 arch-linux 工作站的脚本。这是通过 WinSCP 命令行界面 WinSCP.com 及其内置脚本功能实现的。这些脚本运行良好 - 我可以手动调用它们以实现所需的效果。我甚至可以右键单击我设置的任务并单击“运行”,并观察所需的效果。问题是,在实际锁定和解锁工作站时,工作站锁定和工作站解锁事件似乎从未被触发。同一组计划任务在 Windows 7 下按预期工作。

锁定/解锁任务概述

任务计划程序窗口

根据目前的答案,如果我选中“仅在用户登录时运行”框,我就可以让任务按预期运行,但这会产生不良的副作用,即在触发任务时出现可见的命令窗口。

操作系统是 Windows 10 Enterprise LTSB 2016 (x64)。如有任何见解或想法,我们将不胜感激。

我已经尝试过的事情:

  • 使用 GPO 启用工作站锁定/解锁事件的审核 - 无效果。(锁定/解锁事件按预期出现在事件查看器中)

  • 创建一个备用 Windows 用户并将任务设置为以该主体身份运行。

  • 将对 WinSCP.com 的调用包装在批处理脚本中。

  • 修改本地 GPO 以确保启用批量登录。

其他相关信息:其他计划任务(例如按设定的时间或间隔运行的任务)运行正常。只有这两个任务无法触发。

编辑:根据 Twisty 的评论,我打开了任务历史记录,并收到了一条实际的错误消息: 任务计划程序错误消息

因此看起来任务确实被触发了,但未能启动。有趣的是,这不会更新任务的“上次运行时间”属性。

粗略地谷歌搜索表明此错误可能与登录/密码信息有关。我已验证存储的密码是正确的,但同样的问题仍然存在。以下是请求的“常规”选项卡的屏幕截图。常规选项卡

以下是正在执行的 WINSCP 脚本(密钥已审查):

# Connect
open sftp://[email protected]: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

答案1

请按照以下步骤排除故障并解决您的问题

任务计划程序属性...

从 WindowsTask Scheduler开始properties (见最底部的屏幕截图)在里面。 。 。

  • 1. General选项卡,确保以下选项被选中/选中或取消选中,如图所示打印屏幕A

    • 取消选中 Run only when user is logged on
    • 查看 Run whether user is logged on or not
    • 查看 Run with the highest privileges
  • 2. Conditions选项卡,确保以下选项选择已检查, 或者未选中正如所示打印屏幕B

    • 查看 Wake the computer to run this task
  • 3. Actions选项卡,点击Edit,并确保设置Start in (optional)如下例所示(不要用双引号括起来)表示批处理脚本所在位置的完整路径没有最后一个反斜杠“ \打印屏幕 C


安全注意事项

  • 一旦您按下OK2.上面)它会提示你输入运行此命令所需的凭证,而这个凭证就是需要访问EXECUTE批处理文件所在的位置,并且它还需要访问权限才能执行您编写的批处理文件所运行的任何内容。

  • 最好为该进程设置一个静态服务/代理用户帐户,然后使用其凭据来运行该进程。您需要确保其密码强且设置为永不过期——并且它需要访问EXECUTE批处理并运行批处理脚本进程正在运行的任何命令和资源等。它也利用了。

  • 看来Run whether user is logged on or not您必须检查该选项Run with highest privileges才能真正按照任务计划程序的预期运行。

错误检查

  • 如果实际的批处理脚本存在问题,但 Windows任务计划程序实际上确实执行了它来运行它,但是批处理脚本逻辑出错了,等等,无论出于什么原因,任务计划程序可能在这个级别看不到此故障。从它的角度来看(大多数情况下默认),它正在执行批处理文件,因此只要它可以执行并且有权执行,它的工作就算成功完成。

  • 添加错误检查或者日志记录批处理脚本逻辑抓住(或者排除故障) 这一级别的问题包括确保批处理调度程序执行它的安全上下文对批处理脚本运行时的命令、资源等具有适当的访问权限。


组策略注意事项

检查组策略并以批处理作业权限登录

回答: 在 Windows 上,此权限是通过当地的或者域安全策略. 要执行此操作,请使用本地安全策略, 按着这些次序。

  1. 在里面控制面板, 打开管理工具, 然后本地安全 政策。
  2. 下面安全设定, 打开当地政策并突出显示用户权限分配
  3. 定位作为批处理作业登录。 打开特性并添加任何需要此权限的用户。
  4. 等结束了,节省您的更改并关闭本地安全设置窗户。

您的更改应立即生效。要更改域安全策略,请在域控制器上使用域安全策略实用程序在里面控制面板


具有映射驱动器或完整 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 服务器下载 FTP 脚本WinSCP.com。确保SET winscplogin=变量设置为您在 WinSCP GUI 中定义的 FTP 连接的名称。

这种方式可以动态地构建脚本,您可以从批处理脚本中构建 FTP 命令,但您也可以简单地将其指向包含 FTP 命令的静态 WinSCP 脚本,这也很容易设置。

上传到 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://[email protected]: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

答案2

我通过绕过“工作站锁定/解锁”触发类型并设置触发器直接查看 Windows 事件日志来解决这个问题。

这不是理想的,但应该是可持续的。不过,我仍然很好奇为什么任务计划程序提供的触发器不起作用。


配置锁定/解锁事件

默认情况下,锁定/解锁事件不会被审核到事件日志中,您需要启用这些事件的日志记录。您可以从组策略编辑器中执行此操作:

运行->gpedit.msc

并配置以下类别:

计算机配置->
Windows 设置->
安全设定->
高级审计策略配置->
系统审核策略 - 本地组策略对象->
登录/注销->
审计其他登录/注销事件

(在里面解释标签上写着“...允许您审核...锁定和解锁工作站”。)

信用:https://stackoverflow.com/a/15904838/1216896


创建触发器

从那里,您可以设置 4800(锁定)和 4801(解锁)事件的触发器,如下所示:

触发器配置

答案3

Win10 任务计划程序有很多错误 —— 尤其是在 GUI 中。请参阅:https://www.ctrl.blog/entry/idle-task-scheduler-powershell

重新编译界面可能会有好处:

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

您可能还想通过 PowerShell 中的 COM 接口创建任务。我更喜欢使用包含 XML 定义的字符串变量。您可以导出 GUI 创建的任务的 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)

祝你好运!

相关内容