使用“运行命令”操作在 Windows VM 上运行脚本
“运行命令”功能使用虚拟机 (VM) 代理在 Azure Windows VM 中运行 PowerShell 脚本。 可以使用这些脚本进行常规计算机或应用程序管理。 它们可以帮助你快速诊断和修正 VM 访问与网络问题,使 VM 恢复正常状态。
优点
可通过多种方式访问虚拟机。 “运行命令”可以使用 VM 代理在虚拟机上以远程方式运行脚本。 通过 Windows VM 的 Azure 门户、REST API 或 PowerShell 使用“运行命令”。
在需要在虚拟机中运行脚本的所有方案中,此功能都很有用。 它是排查和修正因网络或管理用户配置错误而未打开 RDP 或 SSH 端口的虚拟机的唯一方法。
先决条件
支持的 Windows 操作系统
Windows OS | x64 |
---|---|
Windows 10 | 支持 |
Windows 11 | 支持 |
Windows Server 2008 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 | 支持 |
限制
使用“运行命令”时存在以下限制:
- 输出限制为最后的 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
名称 | 说明 |
---|---|
RunPowerShellScript | 运行 PowerShell 脚本 |
DisableNLA | 禁用网络级身份验证 |
DisableWindowsUpdate | 禁用 Windows 更新自动更新 |
EnableAdminAccount | 检查本地管理员帐户是否被禁用,如果是,则启用它。 |
EnableEMS | 启用 EMS |
EnableRemotePS | 配置计算机以启用远程 PowerShell。 |
EnableWindowsUpdate | 启用 Windows 更新自动更新 |
IPConfig | 显示绑定到 TCP/IP 的每个适配器的 IP 地址、子网掩码和默认网关的详细信息。 |
RDPSettings | 检查注册表设置和域策略设置。 提供策略操作建议(如果计算机属于某个域),或者将设置修改为默认值。 |
ResetRDPCert | 删除绑定到 RDP 侦听器的 TLS/SSL 证书,并将 RDP 侦听器安全性还原为默认值。 如果看到与证书有关的任何问题,请使用此脚本。 |
SetRDPPort | 为远程桌面连接设置默认的或用户指定的端口号。 为端口的入站访问启用防火墙规则。 |
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/runCommands/action
权限。 虚拟机参与者角色和更高级别具有此权限。
若要使用“运行命令”,可以使用内置角色之一,也可以创建一个自定义角色。
操作运行命令 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'
如果要执行的命令在路径中包含“\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 中运行脚本。