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

Fop*_*ush 12 scheduled-tasks winscp 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://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
Run Code Online (Sandbox Code Playgroud)

我刚刚尝试将其包装在一个非常简单的批处理文件中:

@ECHO ON

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

我可以手动执行此操作,并且作为计划任务,当我选中“仅在用户登录时运行”时,它就可以工作。不幸的是,和以前一样,一旦我将任务设置为“无论用户是否登录都运行”,我就会遇到通常的失败。

根据要求,以下是操作选项卡的屏幕截图:操作窗格

被遮挡的文字如下:

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

Vom*_*yle 12

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

任务计划程序属性。. .

从 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选项卡,确保如Print Screen B所示选择选中取消选中以下选项

    • 查看 Wake the computer to run this task
  • 3. Actions选项卡,单击Edit,并确保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. 完成后,保存更改并关闭本地安全设置窗口。

您的更改应立即生效。要更改域安全策略,在域控制器上,使用域安全策略工具控制面板


带有映射驱动器或完整 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 批处理脚本示例

下面是两个非常基本和简化的示例,分别是使用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%"
Run Code Online (Sandbox Code Playgroud)

从 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 Code Online (Sandbox Code Playgroud)

自定义示例脚本

请确保同时使用Run whether user is logged on or notRun 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Wax*_*xen 5

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

这并不理想,但应该是可持续的。仍然很好奇为什么 Task Scheduler 提供的触发器不起作用。


配置锁定/解锁事件

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

运行 -> gpedit.msc

并配置以下类别:

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

(在“解释”选项卡中,它说“...允许您审核...锁定和解锁工作站”。)

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


创建触发器

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

触发配置


Tek*_*ist 5

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

您可能有一些运气重新编译界面:

mofcomp c:\Windows\System32\wbem\SchedProv.mof
Run Code Online (Sandbox Code Playgroud)

您可能还想通过 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)
Run Code Online (Sandbox Code Playgroud)

祝你好运!