首页 > 解决方案 > 如何使用 Azure 自动化帐户从不同的订阅启动 vm

问题描述

我在同一个租户中有三个订阅,比如 Sub1、Sub2 和 Sub3。我在 Sub1 中创建了自动化帐户,我的 VM 在 Sub3 中。(由于某些限制,无法在 Sub3 中创建自动化帐户)。我想编写一个将启动 Sub3 VM 的 powershell 脚本。

当我运行Get-AzureRmSubscription时,它只给我当前的订阅,即 Sub1 我的天蓝色自动化脚本如下 -

$connectionName = "AzureRunAsConnection"
try
{
    # Get the connection "AzureRunAsConnection "
    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

Get-AzureRmSubscription

 # $context = Get-AzureRmSubscription -SubscriptionId {subId}
# Set-AzureRmContext $context
# Start-AzureRmVM -ResourceGroupName "ResourceName" -Name "VMName"

你能指导我怎么做吗?

标签: azureazure-powershellazure-automation

解决方案


由于您的订阅位于同一租户中,因此您可以在Sub3中直接将 Azure RABC 角色分配给您的 Azure 自动化连接(服务主体) 。然后就可以在Sub3中管理 Azure 资源了

例如

  1. 获取连接应用程序 ID 在此处输入图像描述

  2. 分配角色

Connect-AzAccount
 $sp=Get-AzADServicePrincipal -ApplicationId < the appId you copy>
Set-AzContext -SubscriptionId <the id of sub3>
#assign Contributor role to the connection at subsciprion level
New-AzRoleAssignment -ObjectId $sp.id -RoleDefinitionName Contributor
  1. 测试
$connectionName = "AzureRunAsConnection"
try
{
    # Get the connection "AzureRunAsConnection "
    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

Get-AzureRmSubscription

在此处输入图像描述


推荐阅读