使用 New-ScheduledTaskTrigger 注册计划任务以触发事件 ID

Register scheduled task with New-ScheduledTaskTrigger to trigger on event ID

在 Windows 事件 ID

上使用 New-ScheduledTaskTrigger 注册计划任务

您好 Stack-overflow 用户。 MSDN 和 Google 都没有结果...
我通过 Powershell 脚本配置了几个计划任务。计划任务在特定时间设置为运行。
这一切都很好。但是我需要配置另一个计划任务,当某个事件 ID 记录在 Windows 事件记录器中时 运行。
我当然可以手动设置它,但我希望它成为我的自动化脚本的一部分。

这是我到目前为止的计划任务代码,我需要替换 $Trigger= New-ScheduledTaskTrigger -At 4:00am -Daily 部分:

        Copy-Item "\networkDrive\Backups\scripts\Reset-Sessions.ps1" "c:\scripts\Reset-Sessions.ps1"
        $Trigger= New-ScheduledTaskTrigger -At 4:00am -Daily
        $User= 'Nt Authority\System'
        $Action= New-ScheduledTaskAction -Execute "Powershell.exe" -Argument "-executionpolicy bypass -File c:\scripts\Reset-Sessions.ps1"
        Register-ScheduledTask -TaskName "Reset-Sessions" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest -Force

我更改了一些目录和文件名以供在线使用。

如果有人能引导我走向正确的方向或提供示例,我将不胜感激。
我宁愿只更改 $Trigger 部分而不是重写整个脚本,但如果不可能的话我会理解。

我使用 Powershell 5.1 版。

步骤 1: 转到eventvwr,然后根据eventid 创建一个新的计划任务。

步骤 2: 打开powershell,然后显示计划任务,看看是怎么写的。

步骤 3: 附加并在你的脚本中测试它。

我创建了一个临时的 Get-ScheduledTask 和 运行 下面一行:您所要做的就是替换订阅以满足您的要求。

$A = (Get-ScheduledTask "Tmp" | select -ExpandProperty Triggers)

这是我最后使用的另一种方法来解决问题:
如果您尝试在 Server 2012 之前的 Windows 服务器上执行此操作,那么您可能没有 Get-ScheduledTaskNew-ScheduledTaskTriggerRegister-ScheduledTask 模块在您的 Windows 系统上。这意味着我原来问题中的脚本和接受的答案将不起作用。

  • 解决方法是手动创建所需的计划任务,然后将其导出到 xml 文件。如果你喜欢,你可以编辑这个文件,它是普通的纯文本xml。
  • 然后将您的脚本和 xml 文件放在同一目录中。
  • 更改您的脚本以与旧版本的 Powershell 兼容以导入 xml 文件。
                schtasks /create /tn "Reset-Sessions" /xml "c:\scripts\Reset-Sessions.xml"

您的新计划任务现在应该已注册并处于活动状态。

使用 as a base and some additional help 我能够构建这个脚本

    $taskname="Reset-Sessions"
    # delete existing task if it exists
    Get-ScheduledTask -TaskName $taskname -ErrorAction SilentlyContinue |  Unregister-ScheduledTask -Confirm:$false
    # get target script based on current script root
    $scriptPath=[System.IO.Path]::Combine($PSScriptRoot, "Reset-Sessions.ps1")
    # create list of triggers, and add logon trigger
    $triggers = @()
    $triggers += New-ScheduledTaskTrigger -AtLogOn

    # create TaskEventTrigger, use your own value in Subscription
    $CIMTriggerClass = Get-CimClass -ClassName MSFT_TaskEventTrigger -Namespace Root/Microsoft/Windows/TaskScheduler:MSFT_TaskEventTrigger
    $trigger = New-CimInstance -CimClass $CIMTriggerClass -ClientOnly
    $trigger.Subscription = 
@"
<QueryList><Query Id="0" Path="Microsoft-Windows-NetworkProfile/Operational"><Select Path="Microsoft-Windows-NetworkProfile/Operational">*[System[(EventID=4004)]]</Select></Query></QueryList>
"@
    $trigger.Enabled = $True 
    $triggers += $trigger

    # create task
    $User='Nt Authority\System'
    $Action=New-ScheduledTaskAction -Execute "Powershell.exe" -Argument "-ExecutionPolicy bypass -File $scriptPath"
    Register-ScheduledTask -TaskName $taskname -Trigger $triggers -User $User -Action $Action -RunLevel Highest -Force

主要的魔法是使用Get-CimClass得到正确的实例,然后从Get-ScheduledTask "Tmp" | Select -ExpandProperty Triggers

填充Subscription