Запуск скриптов в Windows VM с использованием управляемых команд выполнения

Область применения: ✔️ Виртуальные машины Windows ✔️ Гибкие масштабируемые наборы

Функция команды запуска использует агент виртуальной машины для выполнения скриптов в виртуальной машине Windows Azure. Эти сценарии можно использовать для общего управления компьютерами или приложениями. Они могут помочь вам быстро диагностировать и исправлять проблемы доступа к виртуальной машине и сети, а также восстановить работоспособность виртуальной машины.

Обновленная управляемая функция "Выполнение команд" использует один и тот же канал агента виртуальных машин для выполнения скриптов и предоставляет следующие усовершенствования в рамках данной функции, ориентированной на исходное действие:

  • поддержка обновленной функции "Выполнение команд" с помощью шаблона развертывания ARM;
  • параллельное выполнение нескольких скриптов;
  • последовательное выполнение скриптов;
  • Время ожидания скрипта, заданного пользователем
  • Поддержка скриптов, выполняющихся в течение длительных периодов (часов/дней);
  • безопасная передача секретов (параметров и паролей).

Внимание

Managed Run Command в настоящее время доступна в Azure CLI, PowerShell и API.

Предварительные условия

Поддерживаемые операционные системы Windows

Версия ОС x64 ARM64
Windows 10 Поддерживается Поддерживается
Windows 11 Поддерживается Поддерживается
Windows Server 2016 Поддерживается Поддерживается
Windows Server 2016 Core Поддерживается Поддерживается
Windows Server 2019 Поддерживается Поддерживается
Windows Server 2019 Core Поддерживается Поддерживается
Windows Server 2022 Поддерживается Поддерживается
Windows Server 2022 Core Поддерживается Поддерживается
Выпуск Windows Server 2022 Azure Поддерживается Поддерживается
Windows Server 2025 г. Поддерживается Поддерживается
Windows Server 2025 Core Поддерживается Поддерживается
Windows Server 2025 Azure Edition Поддерживается Поддерживается

Доступные команды

CommandID Описание Дополнительные сведения
RunPowerShellScript Выполняет скрипт PowerShell.
DisableNLA Отключает проверку подлинности на уровне сети (NLA). Чтобы изменения вступили в силу, необходимо перезапустить виртуальную машину после завершения скрипта. Сам скрипт не перезапускает виртуальную машину. readme
DisableWindowsUpdate Отключите автоматическое обновление с помощью Центра обновления Windows. readme
EnableAdminAccount Проверяет, отключена ли учетная запись локального администратора и включена ли она. readme
EnableEMS Включите службы аварийного управления (EMS), чтобы разрешить последовательное подключение консоли в сценариях устранения неполадок. readme
EnableRemotePS Активируйте удаленную оболочку PowerShell. readme
EnableWindowsUpdate Включение автоматических обновлений с помощью Центра обновления Windows. readme
IMDSCertCheck Проверяет работоспособность IMDS, а затем анализирует установленные в настоящее время сертификаты, от которых зависит IMDS. Если отсутствуют, отображаются дополнительные сведения и шаги по устранению рисков. readme
IPConfig Подробные сведения о IP-адресе, маске подсети и шлюзе по умолчанию для каждого адаптера, привязанного к TCP/IP. Сведения об использовании см. в разделе "Запуск сценариев" readme
RDPSettings Проверяет параметры реестра и параметры политики домена. Предлагает действия политики, если компьютер является частью домена или изменяет параметры на значения по умолчанию. readme
ResetRDPCert Удаляет SSL-сертификат, привязанный к прослушивателю RDP, и восстанавливает безопасность прослушивателя RDP по умолчанию. Используйте этот сценарий при появлении проблем с сертификатом. readme
SetRDPPort Задает номер порта по умолчанию или пользователя для подключений к удаленному рабочему столу. Включает правило брандмауэра для входящего доступа к порту. readme
Активация и проверка Windows Проверяет текущее состояние лицензии Windows (активировано или нет) и создается оповещение, если компьютер не активируется. readme
WindowsGhostedNicValidationScript Этот скрипт сканирует реестр Windows в поисках сетевых адаптеров на шинах PCI и VMBUS, сравнивает их с активными сетевыми адаптерами и определяет устаревшие сетевые адаптеры. Полезно для устранения проблем с сетью или очистки старых сетевых адаптеров. readme
ОценкаВалидацииОбновленияWindows Этот скрипт предназначен для оценки готовности компьютера Windows (клиента или сервера) к обновлению ос на месте с особыми рекомендациями для виртуальных машин Azure. Она оценивает версию ОС, поддерживаемые пути обновления, дисковое пространство системы и функции безопасности Azure, такие как доверенный запуск, безопасная загрузка и vTPM. readme

Примечание.

Приведенные выше идентификаторы команд применимы к управляемым командам запуска для виртуальных машин Windows. Вы можете перечислить все командные идентификаторы с помощью команды "Get-AzVMRunCommandDocument -Location {RegionName}".

Ограничение доступа к команде запуска

Для получения списка выполняемых команд или отображения сведений о команде требуется разрешение Microsoft.Compute/locations/runCommands/read на уровне подписки. Это разрешение имеется у встроенной роли Читатель и более высоких уровней.

Для выполнения команды требуется разрешение Microsoft.Compute/virtualMachines/runCommand/write. Это разрешение имеется у роли Участник виртуальной машины и более высоких уровней.

Можно использовать одну из встроенных ролей или создать пользовательскую роль для использования функции выполнения команд.

Использование команд выполнения

Выполнение скрипта с виртуальной машиной

Эта команда предоставляет скрипт виртуальной машине, выполняет его и возвращает захваченные выходные данные.

Set-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -Location "EastUS" -RunCommandName "RunCommandName" –SourceScript "echo Hello World!"

Выполнение скрипта на виртуальной машине с использованием параметра SourceScriptUri

OutputBlobUri и ErrorBlobUri являются необязательными параметрами.

Set-AzVMRunCommand -ResourceGroupName "myRg" `
-VMName "myVM" `
-RunCommandName "RunCommandName" `
-SourceScriptUri “<SAS_URI_of_a_storage_blob_with_read_access_or_public_URI>" `
-OutputBlobUri “<SAS_URI_of_a_storage_append_blob_with_read_add_create_write_access>" `
-ErrorBlobUri “<SAS_URI_of_a_storage_append_blob_with_read_add_create_write_access>”

Выполнение длительной команды запуска на виртуальной машине

Время выполнения должно превышать время ожидания по умолчанию, равное 90 минутам. Он должен выполняться в течение 100 минут (см. параметр TimeoutInSecond на 6,000 секунд), если ожидается, что скрипт будет выполняться так долго. Через 100 минут выполнение скрипта должно остановиться.

Set-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri> -AsyncExecution -TimeoutInSecond 6000

Вывод списка всех развернутых ресурсов RunCommand на виртуальной машине

Эта команда возвращает полный список ранее развернутых команд выполнения вместе со своими свойствами.

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM"

Получение состояния выполнения и результатов

Эта команда извлекает текущий ход выполнения, включая последние выходные данные, время начала и окончания, код выхода и состояние терминала выполнения.

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName" -Expand InstanceView

Создание или обновление команды запуска на виртуальной машине с помощью SourceScriptUri (URL-адрес SAS BLOB-объекта хранилища)

Создайте или обновите команду запуска на виртуальной машине Windows, используя SAS URL блоба хранилища, содержащего скрипт PowerShell. SourceScriptUri может быть полным URL-адресом SAS или общедоступным URL-адресом BLOB-объекта хранилища.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>

Примечание.

URL SAS должен предоставлять доступ для чтения к объекту BLOB. Для URL-адреса SAS предлагается срок действия 24 часа. URL-адреса SAS можно создать на портале Azure с помощью параметров BLOB или маркера SAS.New-AzStorageBlobSASToken При создании токена SAS с помощью New-AzStorageBlobSASToken, ваш URL-адрес SAS = "базовый URL-адрес Blob" + "?" + "токен SAS из New-AzStorageBlobSASToken"

Получение представления экземпляра команд запуска для виртуальной машины после создания или обновления команды выполнения

Получите команду выполнения для виртуальной машины с просмотром экземпляра. Представление экземпляра содержит состояние выполнения команды Run Command (успешное выполнение, ошибка и т. д.), код выхода, стандартный вывод и стандартную ошибку, созданные при выполнении скрипта. Ненулевой ExitCode указывает на неудачное выполнение.

$x = Get-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Expand InstanceView
$x.InstanceView

Пример результата

ExecutionState   : Succeeded
ExecutionMessage :
ExitCode         : 0
Output           :   
output       : uid=0(root) gid=0(root) groups=0(root)
                   HelloWorld

Error            :
StartTime        : 10/27/2022 9:10:52 PM
EndTime          : 10/27/2022 9:10:55 PM
Statuses         :

InstanceView.ExecutionState: состояние скрипта запуска команды пользователя. Обратитесь к этому состоянию, чтобы узнать, был ли скрипт успешным или нет. ProvisioningState: состояние полной подготовки общего расширения от начала до конца (завершила ли платформа расширений выполнение сценария команды запуска или нет).

Создание или обновление команды run на виртуальной машине с помощью ScriptLocalPath (локальный файл скрипта)

Создайте или обновите команду запуска на виртуальной машине с помощью локального файла скрипта, который находится на клиентском компьютере, где выполняется командлет.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1"

Создание или обновление команды запуска на виртуальной машине с помощью SourceScript (текст скрипта)

Создайте или обновите команду запуска на виртуальной машине, передавая содержимое скрипта непосредственно параметру -SourceScript. Использование ; для разделения нескольких команд

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"

Создание или обновление команды run на виртуальной машине с помощью SourceCommandId

Создайте или обновите команду run на виртуальной машине с помощью предварительного идентификатора commandId. Доступные командные идентификаторы можно получить с помощью Get-AzVMRunCommandDocument.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceCommandId DisableWindowsUpdate

Создание или обновление команды выполнения на виртуальной машине с помощью OutputBlobUri, ErrorBlobUri для потоковой передачи стандартных выходных данных и стандартных сообщений об ошибках для вывода и добавления больших двоичных объектов

Создайте или обновите команду run на виртуальной машине и потоковую передачу стандартных выходных данных и стандартных сообщений об ошибках для вывода и добавления больших двоичных объектов.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -OutputBlobUri <OutPutBlobUrI> -ErrorBlobUri "ErrorBlobUri

Примечание.

Выходные и ошибочные блобы должны быть типа AppendBlob, а URL-адреса SAS должны предоставлять доступ для чтения, добавления, создания и записи в блобы. Для URL-адреса SAS предлагается срок действия 24 часа. Если blob-объект для вывода или ошибок не существует, создается blob-объект типа AppendBlob. URL-адреса SAS можно создать на портале Azure, используя параметры объекта BLOB или маркер SAS.New-AzStorageBlobSASToken

Создание или обновление команды run на виртуальной машине в качестве другого пользователя с помощью параметров RunAsUser и RunAsPassword

Создайте или обновите команду выполнения на ВМ в качестве другого пользователя с помощью параметров RunAsUser и RunAsPassword. Чтобы RunAs функционировал должным образом, обратитесь к администратору виртуальной машины и убедитесь, что пользователь добавлен на виртуальной машине, имеет доступ к ресурсам, к которым обращается команда Run (каталоги, файлы, сеть и так далее), а в случае с виртуальной машиной Windows служба "Вторичный вход" запущена на виртуальной машине.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -RunAsUser myusername -RunAsPassword mypassword

Создавайте или обновляйте команду Run в ресурсе наборов масштабируемых виртуальных машин с помощью SourceScriptUri (URL-адрес SAS для BLOB-объекта хранилища)

Создайте или обновите команду выполнения на ресурсе масштабируемых наборов виртуальных машин Windows, используя SAS URL-адрес большого двоичного объекта хранилища, содержащего скрипт PowerShell.

Set-AzVmssVMRunCommand -ResourceGroupName MyRG0 -VMScaleSetName MyVMSS -InstanceId 0 -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>

Примечание.

URL SAS должен предоставлять доступ для чтения к объекту BLOB. Срок действия 24 часов предлагается для URL-адреса SAS. URL-адреса SAS можно создать на портале Azure с помощью параметров объектов Blob или токена SAS.New-AzStorageBlobSASToken Если вы создаете токен SAS с помощью New-AzStorageBlobSASToken, формат URL-адреса SAS: базовый URL-адрес объекта Blob + "?" + токен SAS из New-AzStorageBlobSASToken.

Создайте или обновите команду Run в экземпляре виртуальной машины с использованием параметров Parameter и ProtectedParameter (публичные и защищенные параметры для сценария).

Используйте ProtectedParameter для передачи конфиденциальных входных данных скрипту, таким как пароли, ключи и т. д.

$PublicParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam1';value='publicParam1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam2';value='publicParam2value'})

$ProtectedParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret1';value='secret1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret2';value='secret2value'})

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri> -Parameter $PublicParametersArray -ProtectedParameter $ProtectedParametersArray
  • Windows: Параметры и ProtectedParameters передаются скрипту в виде аргументов и запускаются следующим образом - myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value

  • Linux: именованные параметры и его значения задаются в конфигурации среды, которая должна быть доступна в скрипте .sh. Для аргументов без имен передайте пустую строку для ввода имени. Безымянные аргументы передаются в скрипт и выполняются следующим образом: myscript.sh publicParam1value publicParam2value secret1value secret2value

Удаление ресурса RunCommand из виртуальной машины

Удалите ресурс RunCommand, ранее развернутый на виртуальной машине. Если скрипт всё ещё выполняется, выполнение прекращается.

Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"

Последовательное выполнение нескольких команд 'Выполнить'

По умолчанию при развертывании нескольких ресурсов RunCommand с помощью шаблона развертывания они будут выполняться одновременно на виртуальной машине. Если существует зависимость от скриптов и имеется предпочтительный порядок выполнения, можно использовать свойство dependsOn, чтобы они выполнялись последовательно.

В этом примере secondRunCommand будет выполняться после firstRunCommand.

{
   "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion":"1.0.0.0",
   "resources":[
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/firstRunCommand')]",
         "apiVersion":"2023-03-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
         ],
         "properties":{
            "source":{
               "script":"Write-Host First: Hello World!"
            },
            "parameters":[
               {
                  "name":"param1",
                  "value":"value1"
               },
               {
                  "name":"param2",
                  "value":"value2"
               }
            ],
            "timeoutInSeconds":20
         }
      },
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/secondRunCommand')]",
         "apiVersion":"2019-12-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'),'runcommands/firstRunCommand')]"
         ],
         "properties":{
            "source":{
               "scriptUri":"http://github.com/myscript.ps1"
            },
            "timeoutInSeconds":60
         }
      }
   ]
}

Следующие шаги

Сведения о других способах удаленного выполнения сценариев и команд на виртуальной машине см. в разделе Выполнение сценариев в виртуальных машинах Windows.