You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Azure Automation通过PowerShell远程访问无公网IP的Azure VM

解决:从Azure Automation远程访问无公网IP的Azure VM

嘿,你的New-PSSession执行失败很正常——Azure Automation的运行沙盒处于公网环境,而你的VM只有私有IP,两者之间没有直接的网络通路,常规的PS会话根本连不上。下面给你几种可行的实现方式,按推荐程度排序:

1. 用Azure VM Run命令(首推!)

这是Azure官方提供的原生方案,完全不需要额外网络配置,直接通过Azure的管控API把PowerShell脚本推到VM上执行,完美适配无公网IP的场景。

示例代码:

$connectionName = "AzureRunAsConnection"
$SPC = Get-AutomationConnection -Name $connectionName
# 建议用Az模块的Connect-AzAccount代替旧的Add-AzureRmAccount
Connect-AzAccount -ServicePrincipal -TenantId $SPC.TenantId -ApplicationId $SPC.ApplicationId -CertificateThumbprint $SPC.CertificateThumbprint | Out-Null

# 替换成你的VM资源信息
$resourceGroupName = "你的VM资源组名称"
$vmName = "目标VM的名称"

# 这里写你要在VM上执行的脚本内容
$scriptToRun = @"
# 举个例子:查看VM上的进程
Get-Process
# 你可以替换成任何需要的操作,比如安装软件、修改配置等
"@

# 执行命令
Invoke-AzVMRunCommand -ResourceGroupName $resourceGroupName -VMName $vmName -CommandId 'RunPowerShellScript' -ScriptString $scriptToRun

注意事项:

  • 确保你的Azure Automation RunAs账户拥有Virtual Machine Contributor或更高权限的角色
  • Windows VM默认已启用Azure代理(需要它接收Run命令),Linux VM要确认Azure代理已安装并运行

2. 通过Azure Bastion建立交互式会话

如果需要交互式的PowerShell会话(比如像本地远程桌面那样操作VM),可以用Azure Bastion作为跳板——它部署在你的虚拟网络里,能通过私有网络访问VM,不需要给VM开公网IP。

示例代码:

$connectionName = "AzureRunAsConnection"
$SPC = Get-AutomationConnection -Name $connectionName
Connect-AzAccount -ServicePrincipal -TenantId $SPC.TenantId -ApplicationId $SPC.ApplicationId -CertificateThumbprint $SPC.CertificateThumbprint | Out-Null

# 替换成你的资源信息
$bastionResourceGroup = "Bastion所在的资源组"
$bastionName = "你的Azure Bastion名称"
$vmResourceGroup = "目标VM的资源组"
$vmName = "目标VM名称"

# 从Azure Automation的凭据资产里获取VM的登录信息(建议用凭据资产,不要明文写密码)
$vmCred = Get-AutomationPSCredential -Name "你的VM凭据资产名称"

# 执行交互式命令(这里以查看C盘目录为例)
Invoke-AzBastionCommand -ResourceGroupName $bastionResourceGroup -Name $bastionName `
    -TargetResourceId (Get-AzVM -ResourceGroupName $vmResourceGroup -Name $vmName).Id `
    -Command "Get-ChildItem C:\" `
    -Credential $vmCred `
    -Protocol PowerShell

3. 部署混合Runbook工作器(适合频繁操作)

如果需要经常对这台VM(或同VNet内的多台VM)执行操作,推荐在你的私有网络里部署Azure Automation混合Runbook工作器。它相当于一个部署在你VNet内的代理,Azure Automation会把Runbook发送到这个工作器执行,工作器和VM处于同一网络,直接就能用私有IP建立PS会话。

实现步骤+示例代码:

  1. 先在目标VM(或同VNet的其他机器)上安装混合Runbook工作器,关联到你的Azure Automation账户
  2. 在Azure Automation中创建一个工作组,把这个工作器加入进去
  3. 编写Runbook时指定在该工作组运行,然后就能用常规的New-PSSession连接VM的私有IP了:
# 注意:这个Runbook要指定在混合工作器组运行
$username = "VM的登录用户名"
$password = ConvertTo-SecureString "VM的登录密码" -AsPlainText -Force
$vmCred = New-Object System.Management.Automation.PSCredential ($username, $password)

# 直接用VM的私有IP建立会话
$session = New-PSSession -ComputerName "192.168.1.100" -Credential $vmCred
Enter-PSSession -Session $session

# 在这里执行你的操作,比如:
Get-Service

# 操作完成后记得关闭会话
Exit-PSSession
Remove-PSSession $session

4. 打通Azure Automation和VM的网络(适合多VNet场景)

如果你的Azure Automation需要访问多个VNet内的VM,可以通过VNet对等连接、VPN或ExpressRoute把Azure Automation的虚拟网络(需要先启用虚拟网络集成)和VM所在的VNet连通。这样Automation的沙盒就能直接访问VM的私有IP,用原来的New-PSSession命令就行。

核心步骤:

  • 给你的Azure Automation账户启用虚拟网络集成,把它加入到一个VNet中
  • 建立这个VNet和VM所在VNet的对等连接(如果是同区域),或者通过VPN/ExpressRoute连接
  • 之后Runbook里就能直接用New-PSSession连接VM的私有IP了

内容的提问来源于stack exchange,提问作者Suman Ghosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:29:13