Длинная версия: Есть несколько вопросов по обмену стеками о написании сценария Powershell, который может выдерживать промежуточный сценарий перезагрузки, а также официальных блогов Microsoft, в которых либо отсутствует информация, либо неверна информация, либо отсутствует ошибка.
Мне нужно запустить Скрипт Powershell из двух частей; первая половина устанавливает предварительные условия для второй половины, которые требуют перезагрузки при установке. Исследование предполагает, что для этого подходят рабочие процессы Powershell. Это необходимо сделать;
Я думаю, что автор этого вопроса https://stackoverflow.com/q/15166839/721425 был после того же, и принятый ответ, вероятно, работает, но не соответствует пункту 2 выше. Ответ внизу, https://stackoverflow.com/a/34494197/721425 , подтверждает это и предлагает решение моего вопроса, но оно не работает. Нет и на сайтах обмена стеками, в блоге Microsoft Technet или где-либо еще. Все они (в разной степени) полагаются на выполнение рабочего процесса как задания, и создание запланированного задания или задачи для возобновления всех приостановленных заданий (поскольку после перезагрузки задание находится в состоянии Suspended .)
Я думаю, что связанный ответ на связанный вопрос не работает из-за разрешений или контексты учетных записей пользователей.
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 с идентификатор задания.
TL; DR
Как возобновить приостановленные задания рабочих процессов Powershell с заданным именем пользователя и паролем, не выполняя вход в систему?
ОБНОВЛЕНИЕ:
Следующие виды работ ;
Шаг 1. Создайте рабочий процесс так же, как в приведенном выше примере, сделайте что-нибудь, перезагрузитесь, сделайте что-нибудь еще.
Шаг 2: Создайте файл resume.ps1, содержащий;
Import-Module PSWorkflow
Get-Job -State Suspended | Resume-Job -Wait| Wait-Job
И поместите его в корневой том или загрузите с помощью SAS в виде большого двоичного объекта.
Шаг 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