可恢复的 Powershell 工作流,在可恢复它的机器上运行

可恢复的 Powershell 工作流,在可恢复它的机器上运行

较长的版本: 关于编写一个可以容忍脚本运行中途重启的 Powershell 脚本,堆栈交换中有很多问题,微软官方博客也有很多问题,要么是缺少信息,要么是错误,要么是被错误所阻碍。

我需要分两部分运行 Powershell 脚本;前半部分安装后半部分的先决条件,后半部分需要在安装时重新启动。研究表明,Powershell 工作流是实现此目的的方法。这需要完成;

  1. 由于没有交互式登录,因此“您登录后半部分并输入...”是不允许的,因为这是 Azure 自定义脚本扩展,将由 Azure 而不是人员运行
  2. 完全包含在机器本身中(也是 Azure ARM 自定义脚本扩展的要求),因此不允许使用第二台机器使用 Powershell 远程处理和一些重复的测试,这些测试会失败,直到机器重新启动,此时它会通过,此时更多的远程 Powershell 被托管在目标上

我认为这个问题的作者https://stackoverflow.com/q/15166839/721425是针对同样的事情,并且接受的答案可能有效,但没有达到上述第 2 点。下面的答案,https://stackoverflow.com/a/34494197/721425 ,承认了这一点,并为我的问题提供了解决方案,但它不起作用。堆栈交换网站、微软的 Technet 博客或其他地方也没有任何类似的解决方案。它们都(在不同程度上)依赖于将工作流作为作业运行,并创建计划作业或任务来恢复所有暂停的作业(因为在重新启动后,作业处于暂停状态。)

我认为链接问题的链接答案由于权限或用户帐户上下文而不起作用。

Workflow Resume_Workflow {
# do something like install a prerequisite with a required reboot
restart-computer
# do something else after the reboot
}

$options = New-ScheduledJobOption -RunElevated -ContinueIfGoingOnBattery -StartIfOnBattery
$secpasswd = ConvertTo-SecureString "Aa123456!" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ("WELCOME\Administrator", $secpasswd)
$AtStartup = New-JobTrigger -AtStartup


Register-ScheduledJob -Name Resume_Workflow_Job -Trigger $AtStartup -ScriptBlock ({[System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager = $true; Import-Module PSWorkflow; Resume-Job -Name new_resume_workflow_job -Wait}) -ScheduledJobOption $options

Resume_Workflow -AsJob -JobName new_resume_workflow_job

我之所以这么想,主要是因为他们设置了似乎从未使用过的凭证,并且在测试此凭证及其变体时,工作流程最终确实完成了,但是仅当我以交互方式登录并运行 resume-job 时带有作业 ID。

总结

如何使用给定的用户名和密码,在没有任何用户登录的情况下恢复 Powershell 工作流的暂停作业?

更新:

以下类型的作品;

步骤1:创建与上述示例相同的工作流程,执行某些操作,重新启动,执行其他操作。

第 2 步:创建包含以下内容的 resume.ps1;

Import-Module PSWorkflow

Get-Job -State Suspended | Resume-Job -Wait| Wait-Job

并将其放入根卷或使用 SAS 将其作为 blob 下载。

步骤 3:创建运行 resume.ps1 AtStart 的计划任务

$TaskName = "ResumeWorkflows"
$Action = New-ScheduledTaskAction -Execute 
"C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe" -Argument " -executionpolicy bypass c:\resume.ps1"
$Trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName $TaskName -Action $Action -Trigger $Trigger -User "$env:Computername\Administrator" -Password "SuperS3cretP@ssword" -RunLevel Highest

Resumable_Workflow -AsJob -JobName $(get-date -Format hhmmss)

“某种程度上”是指,如果您以创建计划任务的用户身份登录并运行 resume.ps1,它就会正常工作。它不会作为计划任务运行,所以我猜我现在遇到了计划任务问题:\

答案1

根据您的情况,我建议您可以执行两个 Azure 自定义脚本扩展。在脚本中,您实际上不需要登录您的 VM,脚本以管理员角色执行。您可以使用 Azure Power Shell 重新启动 VM,而无需在 Power Shell 中执行此操作。

###execute script 1 and install prerequisite.
Set-AzureRmVMCustomScriptExtension -ResourceGroupName myResourceGroup `
    -VMName myVM `
    -Location myLocation `
    -FileUri myURL `
    -Run 'myScript.ps1' `
    -Name DemoScriptExtension

###Restart your VM
Restart-AzureRmVM -ResourceGroupName myResourceGroup -VMName myVM

###I suggest you could wait for a minute
Start-Sleep

###execute script 2, no need uninstall script 1
Set-AzureRmVMCustomScriptExtension 

相关内容