从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会话。
实现步骤+示例代码:
- 先在目标VM(或同VNet的其他机器)上安装混合Runbook工作器,关联到你的Azure Automation账户
- 在Azure Automation中创建一个工作组,把这个工作器加入进去
- 编写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
相关产品推荐
相关产品推荐

