Partilhar via


Executar scripts na sua VM Windows usando Comandos de Execução geridos

Aplica-se a: ✔️ VMs Windows ✔️ Conjuntos de escala flexíveis

Importante

O Comando de Execução Gerenciada está atualmente disponível na CLI do Azure, PowerShell e API no momento. A funcionalidade do portal está no roteiro.

O recurso Executar Comando usa o agente de máquina virtual (VM) para executar scripts em uma VM do Windows do Azure. Pode utilizar estes scripts para a gestão geral de computadores ou aplicações. Eles podem ajudá-lo a diagnosticar e corrigir rapidamente problemas de acesso à VM e de rede e fazer com que a VM volte a um bom estado.

O Run Command atualizado gerido usa o mesmo canal do agente de VM para executar scripts e fornece os seguintes aprimoramentos em relação ao Run Command orientado à ação original:

  • Suporte para o Comando Run atualizado através do modelo de implementação ARM
  • Execução paralela de vários scripts
  • Execução sequencial de scripts
  • Tempo limite de script especificado pelo usuário
  • Suporte para scripts de execução prolongada (horas/dias)
  • Transmitir segredos (parâmetros, palavras-passe) de forma segura

Pré-requisitos

Sistemas operacionais Windows suportados

Versão do SO x64 ARM64
Windows 10 Suportado Suportado
Windows 11 Suportado Suportado
Windows Server 2016 Suportado Suportado
Núcleo do Windows Server 2016 Suportado Suportado
Windows Server 2019 Suportado Suportado
Núcleo do Windows Server 2019 Suportado Suportado
Windows Server 2022 Suportado Suportado
Núcleo do Windows Server 2022 Suportado Suportado
Windows Server 2025 Suportado Suportado
Núcleo do Windows Server 2025 Suportado Suportado

Comandos disponíveis

ID de comando Descrição
IPConfig Mostra informações detalhadas para o endereço IP, máscara de sub-rede e gateway padrão para cada adaptador vinculado ao TCP/IP. Para uso, consulte Executar scripts
Ativar a Atualização do Windows Habilite as Atualizações Automáticas através do Windows Update.
DesativarWindowsUpdate Desative as Atualizações Automáticas através do Windows Update.
AtivarContaAdministrador Verifica se a conta de Administrador local está desativada e, em caso afirmativo, se a habilita.
HabilitarEMS Habilite os Serviços de Gerenciamento de Emergência (EMS) para permitir a conexão do console serial em cenários de solução de problemas.
AtivarPSRemoto Habilite o PowerShell remoto.
IMDSCertCheck Verifica a integridade do IMDS e, em seguida, analisa os certificados instalados atualmente e dos quais o IMDS depende. Se faltar, mostra detalhes adicionais e etapas de mitigação.
RDPSettings Verifica as configurações do Registro e as configurações da diretiva de domínio. Sugere ações de política se a máquina fizer parte de um domínio ou modificar as configurações para valores padrão.
ResetRDPCert (Reiniciar Certificado RDP) Remove o certificado SSL vinculado ao ouvinte RDP e restaura a segurança do ouvinte RDP para padrão. Use este script se vir algum problema com o certificado.
Validação de Ativação do Windows Verifica o status atual da licença do Windows (ativada ou não) e o alerta é gerado se a máquina não estiver ativada.
SetRDPPort Define o número de porta padrão ou especificado pelo usuário para conexões de Área de Trabalho Remota. Habilita a regra de firewall para acesso de entrada à porta.
DesativarNLA Desabilita a Autenticação de Nível de Rede (NLA). Você deve reiniciar a VM após a conclusão do script para que a alteração entre em vigor. O script em si não reinicia a VM. Pode utilizar este script para desativar o NLA se as ligações RDP estiverem a falhar com o erro "O computador remoto ao qual está a tentar ligar requer Autenticação de Nível de Rede (NLA), mas o controlador de domínio do Windows não pode ser contactado para executar NLA." ou erro "Ocorreu um erro de autenticação. A autoridade local de segurança não pode ser contactada.» O NLA é um recurso de segurança que só deve ser desativado temporariamente para permitir que as conexões RDP sejam bem-sucedidas até que o problema de conectividade do controlador de domínio seja resolvido.

Nota

As IDs de comando acima são aplicáveis aos Comandos de Execução Gerenciada para VMs do Windows. Você pode listar todos os commandIds usando o comando "Get-AzVMRunCommandDocument -Location {RegionName}".

Limitar o acesso ao Comando Executar

Listar os comandos de execução ou mostrar os detalhes de um comando requer a Microsoft.Compute/locations/runCommands/read permissão no Nível de Assinatura. A função de leitor interna e os níveis superiores têm essa permissão.

A execução de um comando requer a Microsoft.Compute/virtualMachines/runCommand/write permissão. A função de Colaborador de Máquina Virtual e os níveis superiores têm essa permissão.

Você pode usar uma das funções internas ou criar uma função personalizada para usar o Comando Executar.

CLI do Azure

Os exemplos a seguir usam az vm run-command para executar shell script em uma VM do Windows Azure.

Executar um script com a VM

Este comando entrega o script à VM, executa-o e retorna a saída capturada.

az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "Write-Host Hello World!"

Listar todos os recursos RunCommand implantados em uma VM

Este comando retorna uma lista completa de Comandos de Execução implantados anteriormente, juntamente com suas propriedades.

az vm run-command list --vm-name "myVM" --resource-group "myRG"

Obter status e resultados de execução

Este comando recupera o progresso da execução atual, incluindo a saída mais recente, a hora de início/fim, o código de saída e o estado terminal da execução.

az vm run-command show --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --expand instanceView

Nota

Os campos de saída e erro em instanceView estão limitados a 4KB. Se quiser aceder à saída completa e ao erro, tem a opção de encaminhar os dados de saída e erro para o armazenamento em blobs de adição usando os parâmetros -outputBlobUri e -errorBlobUri durante a execução do Comando de Execução com Set-AzVMRunCommand ou Set-AzVMssRunCommand.

Excluir recurso RunCommand da VM

Remova o recurso RunCommand implantado anteriormente na VM. Se a execução do script ainda estiver em andamento, a execução será encerrada.

az vm run-command delete --name "myRunCommand" --vm-name "myVM" --resource-group "myRG"

PowerShell

Executar um script com a VM

Este comando entrega o script à VM, executa-o e retorna a saída capturada.

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

Executar um script na VM usando o parâmetro SourceScriptUri

OutputBlobUri e ErrorBlobUri são parâmetros opcionais.

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>”

Executar um comando Run de longa execução em uma VM

O tempo de execução deve exceder o tempo limite padrão de 90 minutos. Ele deve ser executado durante 100 minutos (consulte o parâmetro 6.000 segundos - TimeoutInSecond), desde que se espere que o script tenha essa duração. Após 100 minutos, a execução do script deve parar.

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

Listar todos os recursos RunCommand implantados em uma VM

Este comando retorna uma lista completa de Comandos de Execução implantados anteriormente, juntamente com suas propriedades.

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

Obter status e resultados de execução

Este comando recupera o progresso da execução atual, incluindo a saída mais recente, a hora de início/fim, o código de saída e o estado terminal da execução.

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

Criar ou atualizar o comando de execução numa VM usando SourceScriptUri (URL SAS do blob de armazenamento)

Criar ou atualizar um comando de execução numa VM Windows usando uma URL SAS de um blob de armazenamento que contém um script do PowerShell. SourceScriptUri pode ser o URL SAS completo de um blob de armazenamento ou o URL público.

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

Nota

A URL SAS deve fornecer acesso de leitura ao blob. Um tempo de expiração de 24 horas é sugerido para o URL SAS. As URLs SAS podem ser geradas no portal do Azure através das opções do blob ou utilizando o token SAS com New-AzStorageBlobSASToken. Se estiver a gerar um token SAS usando New-AzStorageBlobSASToken, o seu URL SAS = "URL de blob base" + "?" + "Token SAS de New-AzStorageBlobSASToken"

Obter uma exibição de instância de comando de execução para uma VM depois de criar ou atualizar o comando de execução

Obtenha um Comando de Execução para VM com visão da instância. Instance View contém o estado de execução do comando run (Succeeded, Failed, etc.), código de saída, saída padrão e erro padrão gerado pela execução do script usando Run Command. Um ExitCode diferente de zero indica uma execução malsucedida.

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

Exemplo de saída

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: Estado do script Run Command do utilizador. Consulte esse estado para saber se o script foi bem-sucedido ou não. ProvisioningState: Status do provisionamento geral de extensão de ponta a ponta (se a plataforma de extensão foi capaz de acionar o script Run Command ou não).

Criar ou atualizar o Run Command em uma VM usando ScriptLocalPath (arquivo de script local)

Criar ou atualizar o Comando de Execução numa Máquina Virtual (VM) usando um ficheiro de script local que está na máquina cliente onde o cmdlet é executado.

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

Criar ou atualizar o Comando Executar em uma VM usando SourceScript (texto de script)

Criar ou atualizar Run Command em uma VM passando o conteúdo do script diretamente para o parâmetro -SourceScript. Use ; para separar vários comandos

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

Criar ou atualizar o Run Command em uma VM usando SourceCommandId

Crie ou atualize o Run Command em uma VM usando commandId preexistente. Os commandIds disponíveis podem ser recuperados usando Get-AzVMRunCommandDocument.

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

Criar ou atualizar Executar Comando em uma VM usando OutputBlobUri, ErrorBlobUri para transmitir saída padrão e mensagens de erro padrão para saída e erro Acrescentar blobs

Crie ou atualize o Comando Executar em uma VM e transmita mensagens de saída padrão e de erro padrão para blobs de saída e erro Anexe.

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

Nota

Os blobs de saída e de erro devem ser do tipo AppendBlob e suas URLs SAS devem fornecer acesso de leitura, acréscimo, criação e gravação ao blob. Um tempo de expiração de 24 horas é sugerido para o URL SAS. Se o blob de saída ou de erro não existir, um blob do tipo AppendBlob será criado. "As URLs SAS podem ser geradas no portal do Azure usando as opções do blob ou através do token SAS utilizando New-AzStorageBlobSASToken."

Criar ou atualizar Run Command em uma VM como um usuário diferente usando os parâmetros RunAsUser e RunAsPassword

Crie ou atualize o Comando Executar em uma VM como um usuário diferente usando RunAsUser e RunAsPassword parâmetros. Para que o RunAs funcione corretamente, entre em contato com o administrador da VM e certifique-se de que o usuário seja adicionado à VM, o usuário tenha acesso aos recursos acessados pelo Comando Executar (Diretórios, Arquivos, Rede etc.) e, no caso da VM do Windows, o serviço 'Logon Secundário' esteja em execução na VM.

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

Criar ou atualizar o comando de execução em um recurso de Conjuntos de Escala de Máquinas Virtuais usando SourceScriptUri (URL SAS do blob de armazenamento)

Criar ou atualizar o comando Executar num recurso de Conjuntos de Escala de Máquina Virtual Windows usando uma URL SAS de um blob de armazenamento que contém um script PowerShell.

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

Nota

A URL SAS deve fornecer acesso de leitura ao blob. Sugere-se um tempo de expiração de 24 horas para o URL SAS. As URLs SAS podem ser geradas no portal do Azure usando as opções do blob ou o token SAS, ambos utilizando New-AzStorageBlobSASToken. Ao gerar o token SAS usando New-AzStorageBlobSASToken, a formatação da URL SAS é: URL base do blob + "?" + o token SAS de New-AzStorageBlobSASToken.

Criar ou atualizar o Run Command em uma instância de VM usando os parâmetros Parâmetro e Parâmetro Protegido (Parâmetros Públicos e Protegidos para guião)

Use ProtectedParameter para passar quaisquer entradas confidenciais para o script, como senhas, chaves, etc.

$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: Os Parâmetros e ProtectedParameters são passados para o script da mesma forma que outros argumentos e executados desta forma - myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value

  • Linux: Parâmetros nomeados e seus valores são definidos como configuração de ambiente, que deve ser acessível dentro do script .sh. Para argumentos sem nome, passe uma cadeia de caracteres vazia para a entrada de nome. Argumentos sem nome são passados para o script e executados assim - myscript.sh publicParam1value publicParam2value secret1value secret2value

Excluir recurso RunCommand da VM

Remova o recurso RunCommand implantado anteriormente na VM. Se a execução do script ainda estiver em andamento, a execução será encerrada.

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

API REST

Para implantar um novo Run Command, execute um PUT na VM diretamente e especifique um nome exclusivo para a instância Run Command.

PUT /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-01
{ 
"location": "<location>", 
"properties": { 
    "source": { 
        "script": "Write-Host Hello World!", 
        "scriptUri": "<SAS URI of a storage blob with read access or public URI>",  
        "commandId": "<Id>"  
        }, 
    "parameters": [ 
        { 
            "name": "param1",
            "value": "value1" 
            }, 
        { 
            "name": "param2", 
            "value": "value2" 
            } 
        ], 
    "protectedParameters": [ 
        { 
            "name": "secret1", 
            "value": "value1" 
            }, 
        { 
            "name": "secret2", 
            "value": "value2" 
            } 
        ], 
    "runAsUser": "userName",
    "runAsPassword": "userPassword", 
    "timeoutInSeconds": 3600,
    "treatFailureAsDeploymentFailure": true,
    "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 >"  
    }
}

Notas

  • Você pode fornecer um script embutido, um URI de script ou um ID de comando de script interno como fonte de entrada. A URI do script é uma URI SAS de um blob de armazenamento com acesso de leitura ou uma URI pública.
  • Apenas um tipo de entrada de origem é suportado para a execução de um comando.
  • A partir da API versão 2023-03-01, você pode definir a propriedade treatFailureAsDeploymentFailure como true fazendo com que a implantação falhe quando houver uma falha no script. Se definido como false, ProvisioningState refletirá apenas se o comando run foi executado ou não pela plataforma de extensões. Ele não indicaria se o script falhou em caso de falhas de script.
  • O Run Command suporta a gravação da saída e do erro em blobs de armazenamento, utilizando os parâmetros outputBlobUri e errorBlobUri, os quais podem ser usados para armazenar saídas extensas de scripts. Utilize o URI SAS de um blob de anexação de armazenamento com acesso para adicionar, criar, gravar e ler. O blob deve ser do tipo AppendBlob. Escrever a saída do script ou blob de erro falharia caso contrário. O blob será substituído se já existir. Será criado se não existir.

Listar instâncias em execução do Comando Executar em uma VM

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2023-03-01

Obter detalhes sobre os resultados de uma implantação específica do Run Command

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2023-03-01

Excluir uma implantação específica do Run Command

Você também pode excluir a instância de Run Command.

DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-01

Implantar scripts em uma sequência ordenada

Para implantar scripts sequencialmente, use um modelo de implantação, especificando uma dependsOn relação entre scripts sequenciais.

{ 
    "type": "Microsoft.Compute/virtualMachines/runCommands", 
    "name": "secondRunCommand", 
    "apiVersion": "2019-12-01", 
    "location": "[parameters('location')]", 
    "dependsOn": <full resourceID of the previous other Run Command>, 
    "properties": { 
        "source": {  
            "script": "Write-Host Hello World!"  
        }, 
        "timeoutInSeconds": 60  
    }
} 

Execute vários comandos de execução sequencialmente

Por padrão, se você implantar vários recursos RunCommand usando o modelo de implantação, eles serão executados simultaneamente na VM. Se você tiver uma dependência dos scripts e uma ordem preferencial de execução, poderá usar a dependsOn propriedade para executá-los sequencialmente.

Neste exemplo, secondRunCommand será executado após 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
         }
      }
   ]
}

Próximos passos

Para saber mais sobre outras maneiras de executar scripts e comandos remotamente em sua VM, consulte Executar scripts em sua VM do Windows.