如何通过Azure Functions或Azure Logic App在Azure虚拟机中运行Powershell脚本
Azure Windows VM运行PowerShell脚本的实现方案(Azure Functions / Azure Logic App)
这两种Azure服务均支持该需求,你可以根据自身场景选择对应方案:Azure Functions适合需要自定义复杂逻辑、高频率触发的场景;Azure Logic App适合低代码、需要联动多个Azure/第三方服务的工作流场景。
方案1:使用Azure Functions实现
- 提前配置权限:为Azure Functions的系统托管身份分配目标VM所在资源组的Virtual Machine Contributor角色,或自定义包含
Microsoft.Compute/virtualMachines/runCommand/action权限的角色,确保Function有调用VM执行命令的权限。 - 创建PowerShell运行时的Azure Function,可按需选择触发方式(HTTP触发、定时触发、事件触发等均可)。
- 编辑Function代码,调用Az.Compute模块的
Invoke-AzVMRunCommandcmdlet执行脚本,参考代码如下:
# 使用系统托管身份登录Azure Connect-AzAccount -Identity # 替换为你的实际参数 $rgName = "目标VM所在资源组名称" $vmName = "目标Windows虚拟机名称" $targetScript = @" # 此处写入需要在VM内执行的PowerShell代码 Get-Service | Where-Object Status -eq Running Write-Output "脚本执行完毕" "@ # 向VM下发脚本执行请求 $runResult = Invoke-AzVMRunCommand -ResourceGroupName $rgName -VMName $vmName -CommandId 'RunPowerShellScript' -ScriptString $targetScript # 输出执行结果(可选) $runResult.Value[0].Message
- 保存并测试Function,确认脚本可正常在VM内执行、返回结果符合预期。
方案2:使用Azure Logic App实现
- 提前配置权限:为Logic App的系统托管身份分配和上述方案一致的VM操作权限。
- 创建Logic App工作流,按需选择触发条件(定时触发、HTTP请求触发、新Blob上传触发等均可)。
- 在工作流设计器中添加Azure Resource Manager - 调用操作节点,按如下规则配置参数:
- 订阅:选择目标VM所属的Azure订阅
- 资源组:选择目标VM所在的资源组
- 资源提供程序:选择
Microsoft.Compute - 资源类型:选择
virtualMachines - 资源:选择目标Windows虚拟机的名称
- 操作名称:填入
runCommand
- 配置操作的请求Body,指定要执行的PowerShell脚本,参考结构如下:
{ "commandId": "RunPowerShellScript", "script": [ "Get-Service | Where-Object Status -eq Running", "Write-Output 'Logic App触发脚本执行成功'" ] }
- 保存工作流并运行测试,可在运行历史中查看脚本的执行返回结果。
注意事项
- 两种方案底层均调用Azure VM的Run Command能力执行脚本,默认使用本地系统管理员权限运行,需严格管控脚本内容的安全性,避免执行高危操作。
- 如果目标VM部署在私有子网、无公网IP,需要为Azure Functions/Logic App配置虚拟网络集成,确保服务可以访问到VM的管理接口。
- Run Command的单脚本执行最大超时时间为90分钟,若需执行更长时间的任务,可将脚本提前上传到VM本地,通过Run Command触发脚本后台运行即可。
内容的提问来源于stack exchange,提问作者Karrar
相关产品推荐
相关产品推荐

