使用“运行命令”操作在 Windows VM 上运行脚本

“运行命令”功能使用虚拟机 (VM) 代理在 Azure Windows VM 中运行 PowerShell 脚本。 可以使用这些脚本进行常规计算机或应用程序管理。 它们可以帮助你快速诊断和修正 VM 访问与网络问题,使 VM 恢复正常状态。

优点

可通过多种方式访问虚拟机。 “运行命令”可以使用 VM 代理在虚拟机上以远程方式运行脚本。 你可以通过 Azure 门户、REST APIPowerShell 在 Windows VM 上使用运行命令。

在需要在虚拟机中运行脚本的所有方案中,此功能都很有用。 它是排查和修正因网络或管理用户配置错误而未打开 RDP 或 SSH 端口的虚拟机的唯一方法。

先决条件

支持的 Windows 操作系统

OS 版本。 x64 ARM64
Windows 10操作系统 支持 支持
Windows 11 支持 支持
Windows Server 2016 支持 支持
Windows Server 2016 核心版 支持 支持
Windows Server 2019 支持 支持
Windows Server 2019 核心版 支持 支持
Windows Server 2022 支持 支持
Windows Server 2022 核心版 支持 支持
Windows Server 2022 Azure 版本 支持 支持
Windows Server 2025 支持 支持
Windows Server 2025 核心版 支持 支持
Windows Server 2025 Azure Edition 支持 支持

限制

使用“运行命令”时存在以下限制:

  • 输出限制为最后的 4,096 个字节。
  • 运行脚本的最短时间大约为 20 秒。
  • 脚本在 Windows 上作为系统运行。
  • 一次只能运行一个脚本。
  • 不支持提示输入信息(交互模式)的脚本。
  • 无法取消正在运行的脚本。
  • 脚本最多可以运行 90 分钟。 之后,它会超时。
  • 需要从 VM 建立出站连接才能返回脚本的结果。
  • 建议不要运行会导致 VM 代理停止或更新的脚本。 这会使扩展处于“正在转换”状态,从而导致超时。

注意

若要正常工作,“运行命令”需要连接(通过端口 443)到 Azure 公共 IP 地址。 如果扩展无法访问这些终结点,则脚本可能会成功运行,但不会返回结果。 如果要阻止虚拟机上的流量,可以使用服务标记以通过 AzureCloud 标记允许流量发往 Azure 公共 IP 地址。

如果 VM 代理的状态为“未就绪”,则“运行命令”功能将不起作用。 在 Azure 门户的 VM 属性中检查代理状态。

可用的命令

下表显示了可用于 Windows VM 的命令的列表。 可以使用 RunPowerShellScript 命令运行所需的任何自定义脚本。 使用 Azure CLI 或 PowerShell 运行命令时,为 --command-id-CommandId 参数提供的值必须是下面列出的值之一。 如果指定的值不是可用的命令,将会收到以下错误:

The entity was not found in this Azure location

可用命令

CommandID 说明 详细信息
RunPowerShellScript 运行 PowerShell 脚本
IPConfig 显示绑定到 TCP/IP 的每个适配器的 IP 地址、子网掩码和默认网关的详细信息。 有关用法,请参阅 “运行脚本” readme
EnableWindowsUpdate 通过 Windows 更新启用自动更新。 readme
DisableWindowsUpdate 通过 Windows 更新禁用自动更新。 readme
EnableAdminAccount 检查本地管理员帐户是否已禁用,如果是,则启用它。 readme
EnableEMS 启用紧急管理服务(EMS),以便在故障排除方案中允许串行控制台连接。 readme
EnableRemotePS 启用远程 PowerShell。 readme
IMDSCertCheck 检查 IMDS 运行状况,然后分析 IMDS 所依赖的当前安装的证书。 如果缺少,则显示其他详细信息和缓解步骤。 readme
RDPSettings 检查注册表设置和域策略设置。 建议如果计算机是域的一部分,则执行相关策略操作,或者将设置改为默认值。 readme
ResetRDPCert 删除绑定到 RDP 侦听器的 SSL 证书,并将 RDP 侦听器安全性还原为默认值。 如果看到与证书有关的任何问题,请使用此脚本。 readme
WindowsActivationValidation 检查当前 Windows 许可证状态(已激活或未激活),如果计算机未正确激活,则会生成警报。 readme
SetRDPPort 设置远程桌面连接的默认或用户指定的端口号。 启用防火墙规则,以便对端口进行入站访问。 readme
DisableNLA 禁用网络级别身份验证 (NLA)。 脚本完成后必须重启 VM,才能使更改生效。 脚本本身不会重启 VM。 如果 RDP 连接失败并出现错误“你尝试连接到的远程计算机需要网络级别身份验证(NLA),但无法联系 Windows 域控制器来执行 NLA,则可以使用此脚本来禁用 NLA。 或错误“身份验证错误已发生。 无法联系本地安全机构。 NLA 是一项安全功能,应仅暂时禁用,以允许 RDP 连接成功,直到域控制器连接问题得到解决。 readme

Azure CLI

注意

可能需要执行某些转义,具体取决于使用哪种形式执行。 例如,如果要在 PowerShell 会话中执行命令,则脚本文件的路径将需要带引号。

以下示例使用 az vm run-command 命令在 Azure Windows VM 上运行 shell 脚本。

# 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 门户中的 VM,然后在左侧菜单中的“操作”下选择“运行命令” 。 你将看到可以在 VM 上运行的可用命令的列表。

命令列表

选择要运行的命令。 某些命令可能有可选或必需的输入参数。 对于这些命令,参数将呈现为文本字段,你可以在其中提供输入值。 对于每个命令,可以通过展开“查看脚本”来查看所运行的脚本。 RunPowerShellScript 不同于其他命令,因为它允许你提供自己的自定义脚本。

注意

内置命令不可编辑。

选择命令之后,选择“运行”以运行脚本。 脚本完成之后,它会在输出窗口中返回输出和任何错误。 下面的屏幕截图显示了运行 RDPSettings 命令时的示例输出。

运行命令脚本输出

PowerShell

以下示例使用 Invoke-AzVMRunCommand cmdlet 在 Azure VM 上运行 PowerShell 脚本。 该 cmdlet 需要 -ScriptPath 参数中引用的脚本位于运行该 cmdlet 的位置本地。

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

注意

参数值只能是字符串类型,如果需要,脚本负责将它们转换为其他类型。

限制对“运行命令”的访问

列出运行命令或显示命令详细信息需要订阅级别的 Microsoft.Compute/locations/runCommands/read 权限。 内置读者角色和更高级别具有此权限。

运行命令需要 Microsoft.Compute/virtualMachines/runCommand/action 权限。 虚拟机参与者角色和更高级别具有此权限。

若要使用“运行命令”,可以使用内置角色之一,也可以创建一个自定义角色

操作运行命令 Windows 疑难解答

对 Windows 环境的操作运行命令进行故障排除时,请参考 RunCommandExtension 日志文件了解详细信息,该文件通常位于以下目录:

已知问题

  • 如果命令包含保留字符,则操作运行命令扩展可能无法在 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'

  • 如果要执行的命令在路径中包含“\n”,运行命令扩展可能也无法执行,因为它将被视为一个新行。 例如,C:\Windows\notepad.exe 在文件路径中包含 \n。 请考虑在路径中将 \n 替换为 \N

  • 请确保注册表项 HKLM\SOFTWARE\Microsoft\Command Processor\AutoRun 中没有任何自定义设置(在此处进行了详述)。 这可能会在 RunCommand 扩展安装或启用阶段期间触发,并导致“XYZ 无法识别为内部或外部命令、可操作程序或批处理文件”错误。

操作运行命令删除

如果需要删除操作运行命令 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

注意

再次应用运行命令时,扩展将自动安装。 可以使用扩展删除命令来排查与扩展相关的任何问题。

后续步骤

若要了解在 VM 中远程运行脚本和命令的其他方法,请参阅在 Windows VM 中运行脚本