Длинная версия: Существует множество вопросов по обмену стеком о написании сценария Powershell, который может выдерживать промежуточный сценарий перезагрузки, а также официальных блогов Microsoft, в которых либо отсутствует информация, либо неверна, либо отсутствует ошибка.
Мне нужно запустить сценарий Powershell, состоящий из двух частей; первая половина устанавливает предварительные условия для второй половины, которые требуют перезагрузки при установке. Исследование предполагает, что для этого подходят рабочие процессы Powershell. Это нужно сделать;
Я думаю автор этого вопроса https://stackoverflow.com/q/15166839/721425 был после того же, и принятый ответ, вероятно, работает, но не соответствует пункту 2 выше. Ответ внизу, https://stackoverflow.com/a/34494197/721425 , признает это и предлагает решение моего вопроса, но оно не работает. Нет и на сайтах обмена стеками, в блоге Microsoft 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
Я в основном думаю это потому, что они устанавливают учетные данные, которые, похоже, никогда не используют, и при тестировании этого и его вариантов рабочий процесс в конечном итоге завершается, но только когда я вхожу в систему в интерактивном режиме и запускаю резюме с идентификатором вакансии.
TL; DR
Как возобновить приостановленные задания рабочих процессов 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 при входе в систему как пользователь, от имени которого создается запланированная задача, она работает. Он не запускается как запланированная задача, поэтому я думаю, что теперь у меня проблема с запланированной задачей: \
В вашем сценарии я предлагаю вам выполнить два расширения пользовательского сценария Azure. В сценарии вам действительно не нужно входить в свою виртуальную машину, сценарий выполняется с ролью администратора. Вы можете перезапустить виртуальную машину с помощью Azure Power Shell, не нужно делать это в 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