Невозможно возобновить рабочий процесс через планировщик задач

В окне powershell я запускаю следующий рабочий процесс:

workflow foo { Suspend-Workflow; "hello world" | Out-File c:\users\weijgerss\desktop\foo.txt }

Затем, чтобы возобновить рабочий процесс, у меня запланировано следующее с помощью планировщика задач, запускаемого при запуске:

Import-Module PSWorkflow
$jobs = Get-Job -state Suspended
$jobs > c:\users\weijgerss\desktop\zqqfff.txt
$resumedJobs = $jobs | resume-job -wait
$resumedJobs | wait-job

# Task scheduler action: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Normal -NoLogo -NoProfile -Command "&'c:\users\weijgerss\desktop\resume.ps1'"

Рабочий процесс не возобновляется ни при запуске, ни когда я запускаю его вручную через планировщик задач. Содержимое zqqfff.txt указывает, что активированный PowerShell планировщик задач не может видеть рабочий процесс. Обычное окно powershell может видеть рабочий процесс, когда я запускаю Get-Job.

(Как обычное окно powershell, так и экземпляр powershell планировщика задач выполняются от одного и того же пользователя.)

Я использовал procmon, чтобы увидеть, что происходит, и из этого я могу видеть, что когда powershell обычно vs taskscheduler обычно смотрит на разные пути персистентности рабочего процесса, а именно:

C: \ Users \ weijgerss \ AppData \ Local \ microsoft \ windows \ PowerShell \ WF \ PS \ default \ S-1-5-21-3519956147-933941082-741972881-500_EL (обычное окно powershell использует эту папку) C:\Users\weijgerss\AppData\Local\microsoft\windows\PowerShell\WF\PS\default\S-1-5-21-3519956147-933941082-741972881-500_EL_NI (этот экземпляр powershell, активированный планировщиком заданий, использует эту папку)

Я полностью в тупике. Как я могу получить экземпляр PowerShell, активированный планировщиком задач, чтобы увидеть те же рабочие процессы, что и обычное окно PowerShell?

1 ответ

Решение

Приведенные ниже сценарии дают вам решение, которое автоматически возобновляет рабочие процессы powershell после перезагрузки / сбоя с использованием планировщика задач при запуске системы:

resume-workflows.ps1: (первая строка ниже исправляет проблему _NI, упомянутую в вопросе)

[System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager = $true
Import-Module PSWorkflow
Get-Job -State Suspended | Resume-Job -Wait| Wait-Job

resume-workflows.cmd: (работает вокруг ошибки планировщика задач Windows 8/ Server 2012)

@rem This is a workaround for task scheduler bug 
@rem See: http://support.microsoft.com/kb/2968540
set "USERPROFILE=%USERPROFILE%\..\%USERNAME%"
set "APPDATA=%USERPROFILE%\AppData\Roaming"
set "LOCALAPPDATA=%USERPROFILE%\AppData\Local"
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NonInteractive -WindowStyle Normal -NoLogo -NoProfile -Command "&'c:\path\to\resume-workflows.ps1'"

Чтобы собрать все воедино, используйте следующий скрипт powershell, чтобы запланировать резюме-workflows.cmd для запуска при запуске системы:

$trigger = New-ScheduledTaskTrigger -AtStartup
$action = New-ScheduledTaskAction -Execute "c:\path\to\resume-workflows.cmd" 
$currentuser = ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Register-ScheduledTask -TaskName "Resume $($currentuser.Replace('\', '-'))'s Powershell Workflows" `
    -Trigger $trigger -Action $action -RunLevel Highest -User $currentuser `
    -Password (Read-Host "Enter password for $currentuser")

Наслаждайтесь!

(ILSpy, promon sysinternal, множество google и тире windbg сыграли важную роль в предоставлении вам вышеуказанного ответа)

Другие вопросы по тегам