我真的很感兴趣,因为问题已经陈述,但我所追求的是暂时禁用预定运行的机制(在多个服务器上,共享磁盘上),同时仍然能够以交互方式运行它(如果可以使用脚本来判断它是否从任务调度程序启动)。外部标志(存在文件)似乎是一种简单的方法。
第一个选项是使用“%SESSIONNAME%”,从调度程序启动时似乎是空的,尽管从powershell启动时也是如此(使用Start-Process,这可能是禁用时允许使用的选项)。
编辑:第二个选项,使用whoami
cmd命令似乎更有前途,它从任务调度程序运行时报告用户属于 NT AUTHORITY \ BATCH 组(但是不是以交互方式运行)。我可以使用这个来拍摄自己的脚吗?用户可以“永久地”添加到我的背后吗?
我们使用的是Windows Server 2012 R2。 PowerShell解决方案会很有趣,因为可能会使用包装器(甚至从.bat到.ps1的修改/重写)。
答案 0 :(得分:0)
Per @Alex K .:传递一个单独的参数来表明我们在预定的上下文中运行的工作正常。简单,可靠的技术,不需要你对第三方组件有任何了解 - 在我的树林里,我们称之为“胜利”而非“欺骗”。
如果您真的想要,可以通过检查父进程的属性来检查您真正要求的内容 - 如果我们从任务计划程序运行。从PowerShell这是非常可行的,不知道普通的旧批处理文件:
$parentpid = (gwmi "win32_process where (ProcessId = $pid)").parentprocessid
$parentname = (gwmi "win32_process where (ProcessId = $parentpid)").name
if ($parentname -eq 'taskeng.exe') {
"I think this is Task Scheduler, or maybe something else a hacker named taskeng.exe, who knows?"
} else {
"This is not Task Scheduler. Probably."
}
当然,如果有一天MS重命名进程,或者确实如果你想使用除TS以外的东西来自动运行脚本,或者即使脚本调用另一个进程调用脚本,也可能会破坏。< / p>
就个人而言,我肯定会使用显式标志。如果您忘记应用它,很明显,它不会突然破坏一天,最重要的是,您可以测试您的脚本是否正常工作而无需先实际安排它。