我想写一个PowerShell工作流,它将运行脚本,重新启动并继续执行它停止的地方。不是在用户登录时,而是在计算机重新启动时(非交互式)。
挑战在于它需要在本地运行。 Windows使这令人愤怒地困难。
到目前为止,我所做的是创建一个作为作业运行的工作流程(PSWorkflowJob)。
在工作流程的中间,它使用-wait开关
运行restart-computer然后我创建一个在启动时运行的计划任务,恢复该工作流程
问题是任务无法在启动时运行,除非它们存储凭据或作为本地系统运行。我不想在此脚本中完全传递管理员信誉,因此我将该任务作为本地系统运行。
当计算机重新启动该任务时,它无法找到作业,因为该作业是由本地管理员创建的。
workflow Resume_Workflow
{
PowerShell.exe -Noninteractive -ExecutionPolicy Bypass -File 'C:\somescript.ps1'
Restart-Computer -Wait
PowerShell.exe -Noninteractive -ExecutionPolicy Bypass -File 'C:\someotherscript.ps1'
}
$taskName = 'Continue_Workflow'
#Pass code directly to powershell.exe to avoid creating another .ps1 file
$PSCode = @'
-NoProfile -command "& powershell.exe {
Import-Module PSWorkflow;
Resume-Job -Name new_resume_workflow_job -Wait;
}"
'@
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument $PSCode
$trigger = New-ScheduledTaskTrigger -AtStartup -RandomDelay 00:00:30
$settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$principal = New-ScheduledTaskPrincipal -UserId SYSTEM `
-LogonType ServiceAccount -RunLevel Highest
$definition = New-ScheduledTask -Action $action -Principal $principal `
-Settings $settings -Description "Run $($taskName) at startup" `
-Trigger $trigger
Register-ScheduledTask -TaskName $taskName -InputObject $definition
# Execute the workflow as a PS job (PSWorkflowJob)
Resume_Workflow -AsJob -JobName new_resume_workflow_job