我想要一个计划任务,它以 运行,SYSTEM
但由 触发,user action
并且是on a delay
。这部分似乎并不难。
困难的部分是我希望运行的 (PoSh) 脚本能够识别哪个用户触发了该任务。我该怎么做呢?
由于有延迟,操作可能不再有效。由于任务延迟是随机的(有最大延迟),所以我没有具体的时间。
答案1
以系统身份运行但由用户操作触发且延迟的计划任务。
由于您使用的是随机延迟,而且每次计时似乎都很麻烦,因此您应该只对每个触发事件使用显式延迟。这样,每个触发器都有自己的延迟设置。
尝试XML
从我在我这边的系统上设置的作业中导出附件,稍微改变一下以掩盖真实的脚本和进程名称。
您可以导入它,然后查看所有设置和配置以查看所有设置,进行调整等。
任务计划程序作业 - XML 导出
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2019-12-10T13:30:30.3849335</Date>
<Author>Administrator</Author>
<URI>\Kill Daemon</URI>
</RegistrationInfo>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
</Settings>
<Triggers>
<LogonTrigger>
<Delay>PT10S</Delay>
</LogonTrigger>
<SessionStateChangeTrigger>
<Delay>PT10S</Delay>
<StateChange>RemoteConnect</StateChange>
</SessionStateChangeTrigger>
<SessionStateChangeTrigger>
<Delay>PT10S</Delay>
<StateChange>ConsoleConnect</StateChange>
</SessionStateChangeTrigger>
</Triggers>
<Actions Context="Author">
<Exec>
<Command>Powershell</Command>
<Arguments>-ExecutionPolicy Bypass -File "C:\process\killit.ps1"</Arguments>
<WorkingDirectory>C:\process</WorkingDirectory>
</Exec>
</Actions>
</Task>
我希望运行的(PoSh)脚本能够识别哪个用户触发了该任务
由于任务的触发器是一个事件,而不是用户单击脚本来执行计划任务,因此执行的 PoSH 脚本无法分辨根据执行该脚本的事件登录的用户是谁。
这意味着进行简单的日志记录和使用$env:username
不会为您提供导致该事件的登录用户名。
如何识别哪个用户触发的任务?
您可能需要从事件查看器安全日志在执行时获取登录的用户帐户详细信息,生成触发任务计划程序作业的事件,并将其合并到 PoSH 逻辑中以保存日志等。
您可能能够运行该quser
命令并记录活动会话用户名并按照 PoSH 逻辑记录它。
quser 示例输出
C:\Users\ClownMan>quser
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>ClownMan console 1 Active none 4/14/2021 7:46 AM
其他 PowerShell
(quser)[1].Split("").Where({$_.Trim() -ne ""})[0] -join " " -replace ">";
(quser)[1].Split("").Where({$_.Trim() -ne ""})[3];
(quser)[1].Split("").Where({$_.Trim() -ne ""})[5..7] -join " ";
示例输出
笔记: 通过这些值,您可以获取活动用户帐户的名称,然后使用 PowerShell 进行计算,以确保日期和时间大于一小时,并且仅在按照一小时延迟条件运行脚本时才运行。
ClownMan
Active
4/14/2021 7:46 AM