Выполнение скриптов в виртуальной машине Windows с помощью функции "Выполнение команд"

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

Преимущества

Доступ к виртуальным машинам можно получить несколькими способами. Выполнение команд может удаленно выполнять сценарии на виртуальных машинах с помощью их агента. Выполнение команд используется на портале Microsoft Azure, REST API или PowerShell для виртуальных машин Windows.

Эта возможность полезна во всех сценариях, где требуется выполнить сценарий на виртуальной машине. Это один из способов устранения неполадок и исправления виртуальной машины, на которой не открыт порт RDP или SSH из-за неправильной настройки сети или пользователя с правами администратора.

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

Поддерживается ОС Windows

ОС Windows x64
Windows 10 Поддерживается
Windows 11 Поддерживается
Windows Server 2008 с пакетом обновления 2 (SP2) Поддерживается
Windows Server 2008 R2 Поддерживается
Windows Server 2012 Поддерживается
Windows Server 2012 R2 Поддерживается
Windows Server 2016 Поддерживается
Windows Server 2016 Core Поддерживается
Windows Server 2019 Поддерживается
Windows Server 2019 Core Поддерживается
Windows Server 2022 Поддерживается
Windows Server 2022 Core Поддерживается

Ограничения

При использовании выполнения команд следует принимать во внимание перечисленные ниже ограничения.

  • Выводятся только последние 4096 байт.
  • Минимальное время выполнения сценария составляет около 20 секунд.
  • Сценарии выполняются как системные в Windows.
  • Два сценария не могут выполняться одновременно.
  • Скрипты, запрашивающие информацию (интерактивный режим), не поддерживаются.
  • Вы не можете отменить выполнение скрипта.
  • Максимальное время выполнения сценария составляет 90 минут. После этого время ожидания истечет.
  • Чтобы вернуть результаты скрипта, требуется разрешить исходящие подключения из виртуальной машины.
  • Не рекомендуется запускать скрипт, который приведет к остановке или обновлению агента виртуальной машины. Это может привести к тому, что расширение зависнет в состоянии перехода и превысит время ожидания.

Примечание

Чтобы выполнение команд работало правильно, требуется подключение (через порт 443) к общедоступным IP-адресам Azure. Если расширение не имеет доступа к этим конечным точкам, скрипты могут успешно выполняться, но результаты не будут возвращаться. Если вы блокируете трафик на виртуальной машине, вы можете использовать теги служб, чтобы разрешить трафик к общедоступным IP-адресам Azure с помощью тега AzureCloud.

Функция "Выполнение команд" не работает, если агент виртуальной машины находится в состоянии "Не готов". Проверьте состояние агента в свойствах виртуальной машины на портале Azure.

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

В таблице ниже представлен список команд, доступных для виртуальных машин Windows. Команду RunPowerShellScript можно использоваться для выполнения любых пользовательских сценариев. При использовании Azure CLI или PowerShell для выполнения команды, значение, указанное для параметра --command-id или -CommandId, должно быть одним из приведенных ниже значений. При указании значения, которое не является доступной командой, появляется следующее сообщение об ошибке:

The entity was not found in this Azure location

имя; Описание
RunPowerShellScript Выполняет скрипт PowerShell.
DisableNLA Отключает аутентификацию на уровне сети.
DisableWindowsUpdate Отключает автоматические обновления Центра обновления Windows.
EnableAdminAccount Проверяет, отключена ли учетная запись локального администратора, если да — включает ее.
EnableEMS Включает EMS.
EnableRemotePS Настраивает компьютер для удаленного подключения к PowerShell.
EnableWindowsUpdate Включает автоматические обновления Центра обновления Windows.
IPConfig Предоставляет подробные сведения об IP-адресе, маске подсети и шлюзе по умолчанию для каждого адаптера, использующего стек TCP/IP.
RDPSettings Проверяет параметры реестра и параметры политики домена. Предлагает действия в рамках политики, если компьютер принадлежит домену, или сбрасывает параметры к значениям по умолчанию.
ResetRDPCert Удаляет TLS/SSL-сертификат, привязанный к прослушивателю RDP, и восстанавливает по умолчанию его защиту. Используйте этот сценарий при появлении проблем с сертификатом.
SetRDPPort Задает номер порта по умолчанию или указанный пользователем для подключений удаленного рабочего стола. Включает правило брандмауэра для входящего подключения к порту.

Azure CLI

Ниже приведен пример с использованием команды az vm run-command для запуска сценария оболочки на виртуальной машине Windows Azure.

# script.ps1
#   param(
#       [string]$arg1,
#       [string]$arg2
#   )
#   Write-Host This is a sample script with parameters $arg1 and $arg2

az vm run-command invoke  --command-id RunPowerShellScript --name win-vm -g my-resource-group \
    --scripts @script.ps1 --parameters "arg1=somefoo" "arg2=somebar"

Портал Azure

Перейдите к виртуальной машине на портале Azure и выберите Выполнить команду в меню слева под пунктом Операции. Появится список доступных команд, выполняемых на виртуальной машине.

Список команд

Выберите команду для запуска. Некоторые команды могут иметь необязательные или обязательные входные параметры. Параметры для этих команд представлены в виде текстовых полей для ввода входных значений. В каждой команде можно развернуть Просмотреть сценарий, чтобы просмотреть выполняемый сценарий. Команда RunPowerShellScript отличается от других команд тем, что она позволяет использовать пользовательские сценарии.

Примечание

Встроенные команды не редактируются.

Выбрав команду, выберите Выполнить, чтобы запустить скрипт. Сценарий выполняется и по завершении выдает результаты и возможные ошибки в окне вывода. На следующем рисунке показан пример сообщения после запуска команды RDPSettings.

Вывод сценария команды запуска

PowerShell

Ниже приведен пример с использованием командлета Invoke-AzVMRunCommand для выполнения скрипта PowerShell на виртуальной машине Azure. Этот командлет ожидает, что скрипт, указанный в параметре -ScriptPath, расположен в локальной среде, в которой выполняется командлет.

Invoke-AzVMRunCommand -ResourceGroupName '<myResourceGroup>' -Name '<myVMName>' -CommandId 'RunPowerShellScript' -ScriptPath '<pathToScript>' -Parameter @{"arg1" = "var1";"arg2" = "var2"}

Примечание

Значения параметров могут быть только строкового типа, и скрипт отвечает за их преобразование в другие типы, если это необходимо.

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

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

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

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

Устранение неполадок Windows с командой выполнения действия

При устранении неполадок с командой выполнения действия для сред Windows обратитесь к файлу журнала RunCommandExtension , который обычно находится в следующем каталоге: C:\WindowsAzure\Logs\Plugins\Microsoft.CPlat.Core.RunCommandWindows\<version>\RunCommandExtension.log для получения дополнительных сведений.

Известные проблемы

Расширение команды выполнения действия может не выполниться в среде Windows, если команда содержит зарезервированные символы. Пример:

& Если символ передается в параметре команды, например в приведенном ниже скрипте PowerShell, он может завершиться ошибкой.

$paramm='abc&jj'
Invoke-AzVMRunCommand -ResourceGroupName AzureCloudService1 -Name test -CommandId 'RunPowerShellScript' -ScriptPath C:\data\228332902\PostAppConfig.ps1 -Parameter @{"Prefix" = $paramm}

Используйте символ для ^ экранирования & в аргументе , например $paramm='abc^&jj'

Расширение run command также может не выполниться, если выполняемая команда содержит слово "\n" в пути, так как оно будет рассматриваться как новая строка. Например, C:\Windows\notepad.exe содержит в \n пути к файлу . Рассмотрите возможность замены \n\N на в пути.

Удаление команды выполнения действия

Если необходимо удалить расширение Windows для команды запуска действия, выполните следующие действия для Azure PowerShell и CLI:

Замените rgname и vmname соответствующим именем группы ресурсов и именем виртуальной машины в следующих примерах удаления.

 Invoke-AzVMRunCommand -ResourceGroupName 'rgname' -VMName 'vmname' -CommandId 'RemoveRunCommandWindowsExtension'
az vm run-command invoke  --command-id RemoveRunCommandWindowsExtension --name vmname -g rgname

Примечание

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

Дальнейшие действия

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