Compartir a través de


Ejecución de scripts en una máquina virtual Windows mediante la acción Ejecutar comandos

La función Ejecutar comando usa el agente de máquina virtual (VM) para ejecutar los scripts de PowerShell de una VM Windows de Azure. Puede usar estos scripts para la administración general de máquinas o aplicaciones. Pueden ayudarle a diagnosticar y corregir rápidamente el acceso a la máquina virtual y los problemas de red, así como a revertir la máquina virtual a un buen estado.

Ventajas

Puede acceder a las máquinas virtuales de varias maneras. Ejecutar comando puede ejecutar scripts en sus máquinas virtuales de forma remota con el agente de VM. Ejecutar comando se usa mediante Azure Portal, la API REST o PowerShell para VM con Windows.

Esta funcionalidad es útil en todos los escenarios en los que quiera ejecutar un script en una máquina virtual. Es uno de los únicos métodos para solucionar problemas y corregir una máquina virtual que no tiene abierto el puerto RDP o SSH debido a una configuración incorrecta de red o de usuario administrativo.

Prerrequisitos

Compatible con el sistema operativo Windows

SO Windows x64
Windows 10 Compatible
Windows 11 Compatible
Windows Server 2008 SP2 Compatible
Windows Server 2008 R2 Compatible
Windows Server 2012 Compatible
Windows Server 2012 R2 Compatible
Windows Server 2016 Compatible
Windows Server 2016 Core Compatible
Windows Server 2019 Compatible
Windows Server 2019 Core Compatible
Windows Server 2022 Compatible
Windows Server 2022 Core Compatible

Restricciones

Las siguientes consideraciones se aplican al usar el Ejecutar comando:

  • La salida se limita a los últimos 4096 bytes.
  • El tiempo mínimo para ejecutar un script es de aproximadamente 20 segundos.
  • Los script se ejecutan como sistema en Windows.
  • Se puede ejecutar un script a la vez.
  • No se admiten los scripts que solicitan información (modo interactivo).
  • No se puede cancelar un script en ejecución.
  • El tiempo máximo que se puede ejecutar un script es de 90 minutos. Después, se agotará el tiempo de espera.
  • La conectividad saliente de la máquina virtual es necesaria para devolver los resultados del script.
  • No se recomienda ejecutar un script que provoque la detención o actualización del agente de máquina virtual. Esto puede llevar a la extensión a un estado de transición, lo que da lugar a un tiempo de espera.

Nota

Para poder funcionar correctamente, Run Command requiere conectividad (puerto 443) a las direcciones IP públicas de Azure. Si la extensión no tiene acceso a estos puntos de conexión, los scripts pueden ejecutarse correctamente, pero no devuelven los resultados. Si va a bloquear el tráfico de la máquina virtual, puede usar las etiquetas de servicio para permitir el tráfico a las direcciones IP públicas de Azure mediante la etiqueta AzureCloud.

La característica Ejecutar no funciona si el estado del agente de máquina virtual es NOT READY. Compruebe el estado del agente en las propiedades de la máquina virtual en Azure Portal.

Comandos disponibles

Esta tabla muestra la lista de comandos disponibles para máquinas virtuales Windows. Puede usar el comando RunPowerShellScript para ejecutar cualquier script personalizado. Al usar la CLI de Azure o PowerShell para ejecutar un comando, el valor que se proporciona para el parámetro --command-id o -CommandId debe ser uno de los siguientes valores. Cuando se especifica un valor que no es un comando disponible, se recibe este error:

The entity was not found in this Azure location

Nombre Descripción
RunPowerShellScript Ejecuta un script de PowerShell.
DisableNLA Deshabilita la autenticación de nivel de red.
DisableWindowsUpdate Deshabilita las actualizaciones automáticas de Windows Update.
EnableAdminAccount Comprueba si la cuenta de administrador local está deshabilitada, y si lo está, la habilita.
EnableEMS Habilita EMS.
EnableRemotePS Configura la máquina para habilitar PowerShell remoto.
EnableWindowsUpdate Habilita las actualizaciones automáticas de Windows Update.
IPConfig Muestra información detallada de la dirección IP, la máscara de subred y la puerta de enlace predeterminada de cada adaptador enlazado a TCP/IP.
RDPSettings Comprueba la configuración del registro y de la directiva de dominio. Recomienda acciones de directiva si la máquina forma parte de un dominio o modifica la configuración a los valores predeterminados.
ResetRDPCert Quita el certificado TLS/SSL asociado al agente de escucha RDP y restaura la seguridad de este a los valores predeterminados. Use este script si ve algún problema con el certificado.
SetRDPPort Establece el número de puerto especificado por el usuario o predeterminado para las conexiones del Escritorio remoto. Habilita las reglas de firewall para el acceso entrante al puerto.

Azure CLI

El siguiente ejemplo utiliza el comando az vm run-command para ejecutar un script de shell en una máquina virtual Windows de 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 Portal

Vaya a una máquina virtual en Azure Portal y seleccione Ejecutar comando en el menú de la izquierda, en Operaciones. Se mostrará una lista de los comandos disponibles para ejecutarse en la máquina virtual.

Lista de comandos

Elija un comando para ejecutar. Algunos de los comandos pueden tener parámetros de entrada obligatorios u opcionales. Para estos comandos, los parámetros se presentan como campos de texto para que pueda proporcionar los valores de entrada. Para cada comando, puede ver el script que se está ejecutando si expande Ver script. RunPowerShellScript es diferente de los otros comandos, ya que permite proporcionar sus propios scripts personalizados.

Nota

Los comandos integrados no son editables.

Después de elegir el comando, seleccione Ejecutar para ejecutar el script. Una vez finalizada la ejecución del script, se devuelven el resultado y los errores en la ventana de salida. La siguiente captura de pantalla muestra un ejemplo de salida tras ejecutar el comando RDPSettings.

Salida del script del comando Ejecutar

PowerShell

En el siguiente ejemplo se utiliza el cmdlet Invoke-AzVMRunCommand para ejecutar un script de PowerShell en una VM de Azure. El cmdlet espera que el script al que se hace referencia en el parámetro -ScriptPath tenga una ubicación local allí donde se está ejecutando el cmdlet.

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

Nota

Los valores de parámetro solo pueden ser de tipo cadena y el script es responsable de convertirlos a otros tipos si es necesario.

Limitación del acceso al comando Ejecutar

Para enumerar los comandos ejecutados o mostrar los detalles de un comando, se requiere el permiso Microsoft.Compute/locations/runCommands/read en el nivel de suscripción. El rol de lector integrado tiene este permiso, al igual que los roles superiores.

La ejecución de un comando requiere el permiso Microsoft.Compute/virtualMachines/runCommands/action. El rol colaborador de la máquina virtual tiene este permiso, al igual que los roles superiores.

Puede usar uno de los roles integrados o crear uno personalizado para usar Ejecutar comando.

Solución de problemas de acciones de comandos de ejecución

Al solucionar problemas del comando de ejecución de acciones para entornos Windows, consulte el archivo de registro RunCommandExtension que se encuentra normalmente en el siguiente directorio: C:\WindowsAzure\Logs\Plugins\Microsoft.CPlat.Core.RunCommandWindows\<version>\RunCommandExtension.log para obtener más detalles.

Problemas conocidos

  • Es posible que la extensión de comando de ejecución de acciones no se ejecute en el entorno de Windows si el comando contiene caracteres reservados. Por ejemplo:

    Si el símbolo & se pasa en el parámetro del comando, como el siguiente script de PowerShell, podría producir un error.

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

    Use el carácter ^ para escapar de & en el argumento, como $paramm='abc^&jj'

  • La extensión Ejecutar comando también podría no ejecutarse si el comando que se va a ejecutar contiene "\n" en la ruta de acceso, ya que se tratará como una nueva línea. Por ejemplo, C:\Windows\notepad.exe contiene \n en la ruta de acceso del archivo. Considere la posibilidad de reemplazar \n por \N en la ruta de acceso.

  • Asegúrese de que no tiene ninguna configuración personalizada en la clave del Registro HKLM\SOFTWARE\Microsoft\Command Processor\AutoRun (detallada aquí). Esto podría desencadenarse durante la instalación o habilitación de la extensión RunCommand y provocar un error como "XYZ no se reconoce como un comando interno o externo, programa operable o archivo por lotes".

Eliminación de acciones de comandos de ejecución

Si necesita quitar la extensión de Windows del comando de ejecución de acciones, consulte los pasos siguientes para Azure PowerShell y la CLI:

Reemplace rgname y vmname por el nombre del grupo de recursos pertinente y el nombre de la máquina virtual en los ejemplos de eliminación siguientes.

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

Nota:

Si vuelve a aplicar Ejecutar comando, la extensión se instalará automáticamente. El comando de eliminación de extensiones se puede usar para solucionar cualquier problema relacionado con la extensión.

Pasos siguientes

Para obtener información sobre otras maneras de ejecutar comandos y scripts de forma remota en la máquina virtual, consulte Ejecución de scripts en una máquina virtual Windows.