Как найти идентификатор процесса запущенной запланированной задачи?

Я могу определить запущенные задачи с:

$TaskService    = new-object -ComObject('Schedule.Service')
$TaskService.connect()
$TaskFolder = $TaskService.GetFolder('\')
$TaskFolder.gettasks(1) | ? {$_.state -eq 4}

Есть ли способ идентифицировать идентификаторы процессов этих задач, если они запускают ту же программу (то есть имя процесса), что и другие существующие процессы?

Моя цель - сценарий PowerShell, запущенный из запланированной задачи, который может определить, под какой запланированной задачей он выполняется. Я могу легко определить идентификатор процесса PoSh с $PID, но я не знаю, как связать это с конкретной запланированной задачей.

Благодарю.

2 ответа

Решение

Это должно работать, если у вас есть это работает в сценарии, который запускается как действие. Он получит путь к задаче, предполагая, что он может быть найден методом COM-объекта RunningTasks.

# Initiate a COM object and connect
$TaskService = New-Object -ComObject('Schedule.Service')
$TaskService.Connect()

# Query for currently running tasks 
# 0 - the user is permitted to see. 
# 1 - 0 + Hidden
$runningTasks = $TaskService.GetRunningTasks(0)

# Get the task associated to a certain PID
$runningTasks | Where-Object{$_.EnginePID -eq $PID} | Select-Object -ExpandProperty Path

Авторы благодарят eryksun за указание метода и подключение к интерфейсу ITaskService в MSDN


Есть еще кое-что, что можно сказать о другом предложении, состоящем в том, чтобы просто рассказать вашему сценарию, что выполняется, с помощью дополнительного параметра. Таким образом, вам не нужно беспокоиться о зависимости COM.

param(
  [string]$SuperImportantString,
  [int]$NumberofBagels,
  [string]$TaskInitiated
)

Set-Content -Path $file -Value "I'm running from $TaskInitiated"

Да, это делает его более ручным, но вы будете иметь полный контроль над текстом и тому подобным, и вам не придется беспокоиться о нескольких задачах, выполняющихся с одного и того же PID.

Похоже, это говорит мне, с какой именно задачи был запущен скрипт:

$EventFilter = @{ 
              Logname      = 'Microsoft-Windows-TaskScheduler/Operational'
              ProviderName = "Microsoft-Windows-TaskScheduler"
              Id           = 129
              Data         = "$PID"
           }

$ThisProcessEvent = Get-WinEvent -FilterHashtable $EventFilter -MaxEvents 1 -ErrorAction SilentlyContinue

$EventXML = [xml]$ThisProcessEvent.toxml()

$TaskFullName = $eventxml.event.eventdata.data | ? {$_.name -eq 'taskname'} |select -ExpandProperty "#text"
Другие вопросы по тегам