关于 powershell:在 Azure 自动化 Runbook 中执行时出现 Set-AzureRmContext 错误

Set-AzureRmContext error when executed within an Azure Automation Runbook

更新:

好像其他人遇到了同样的问题并报告了它。

我在从 Azure 自动化运行手册调用简单 PowerShell 脚本时遇到问题。同一段代码在本地运行时完美无缺。

我已在 Azure Active Directory(托管在 Azure German Cloud 中)中添加了一个带有密码凭据的服务主体,并授予其参与者访问订阅(也托管在 Azure German Cloud 中)的权限。

Azure 自动化服务托管在北欧,因为它目前在 Azure German Cloud 中不可用。

我要做的就是使用 Add-AzureRmAccount cmdlet 使用上述主体登录到我的订阅。之后,我尝试使用 Set-AzureRmContext 设置当前上下文并收到以下错误消息:

1
2
3
4
5
6
Set-AzureRmContext : Please provide a valid tenant or a valid subscription.
At line:26 char:1
+ Set-AzureRmContext -TenantId $TenantId -Su ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Set-AzureRmContext], ArgumentException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.Profile.SetAzureRMContextCommand

这是我尝试运行的脚本(将配置留空):

1
2
3
4
5
6
7
8
9
10
$TenantId =""
$ApplicationId =""
$ClientSecret =""
$SubscriptionId =""

$secpasswd = ConvertTo-SecureString $ClientSecret -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($ApplicationId , $secpasswd)

Add-AzureRmAccount -ServicePrincipal -Environment 'AzureGermanCloud' -Credential $mycreds -TenantId $TenantId
Set-AzureRmContext -TenantId $TenantId -SubscriptionId $SubscriptionId

我也尝试使用 Login-AzureRmAccount 没有成功。我还可以使用 Get-AzureRmResourceGroup cmdlet 来检索资源组,因此登录似乎可以正常工作。

所有 Azure 模块都更新到最新版本。

TLTR:

我的主要目标是使用 runnbook 中的 New-AzureRmSqlDatabaseExport 启动 SQL 导出作业,但似乎上述错误会导致 cmdlet 失败并显示以下消息:

1
2
3
4
New-AzureRmSqlDatabaseExport : Your Azure credentials have not been set up or have expired, please run
Login-AzureRMAccount to set up your Azure credentials.
At line:77 char:18
+ ... rtRequest = New-AzureRmSqlDatabaseExport -ResourceGroupName $Resource


以下是对我有用的代码(常规 dc 区域)。如果它不起作用,请转到自动化帐户 >> 模块 >> 更新 Azure 模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ClientSecret =""
$ApplicationId =""
$SubscriptionId =""

#New PSCredential Object
$secpasswd = ConvertTo-SecureString $ClientSecret -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($ApplicationId , $secpasswd)

#Login to subscription
Login-AzureRmAccount -Credential $mycreds -SubscriptionId $SubscriptionId

#Export Database
New-AzureRmSqlDatabaseExport -ResourceGroupName"<RG>" -ServerName"<SQLSERVERNAME>" -DatabaseName"<DATABASENAME>" -StorageKeyType"StorageAccessKey" -StorageKey"<STRKEY>" -StorageUri"<URITOFILE>" -AdministratorLogin"<DBLOGIN>" -AdministratorLoginPassword"<DBPASS>"

更新

也许使用运行方式帐户运行可能是解决此问题的方法。通过导航到 Azure 自动化帐户 >> 帐户设置 >> 运行方式帐户来创建一个。这是一个示例代码。

1
2
3
4
5
6
# Authenticate to Azure with service principal and certificate, and set subscription
$connectionAssetName ="AzureRunAsConnection"
$conn = Get-AutomationConnection -Name $ConnectionAssetName

Add-AzureRmAccount -ServicePrincipal -Tenant $conn.TenantID -ApplicationId $conn.ApplicationId -CertificateThumbprint $conn.CertificateThumbprint -ErrorAction Stop | Write-Verbose
Set-AzureRmContext -SubscriptionId $conn.SubscriptionId -ErrorAction Stop | Write-Verbose


几周前我遇到了同样的问题,首先使用以下方法登录 Azure 帐户(我想你已经这样做了):

1
Login-AzureRmAccount

然后从 Azure 中获取订阅 ID 并使用 ID 而不是名称选择订阅,如下所示:

1
Select-AzureRmSubscription -SubscriptionId {insert-subscription-id}


这似乎是一个已知问题,我无法找到解决方法。但是有两种解决方法:

  • 使用混合 Runnbook Worker(Walter 提到 - MSFT)
  • 使用带有证书凭据的 RunAsAccount(Bruno Faria 提到)
  • 指定-Environment 参数很重要。否则我得到以下异常:

    Login-AzureRmAccount : AADSTS90038: Confidential Client is not
    supported in Cross Cloud request.

    这是我用来从托管在 NorthEurope 的 Azure Runbook 登录到 AzureGermanCloud (MCD) 的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $connectionAssetName ="AzureRunAsConnection"
    $conn = Get-AutomationConnection -Name $ConnectionAssetName

    Login-AzureRmAccount `
        -ServicePrincipal `
        -CertificateThumbprint $conn.CertificateThumbprint `
        -ApplicationId $conn.ApplicationId `
        -TenantId $conn.TenantID `
        -Environment AzureGermanCloud


    当您登录您的 Azure 帐户时,您可以使用指定的订阅 ID。您可以尝试以下脚本。

    1
    2
    3
    4
    5
    6
    7
    $subscriptionId=""
    $tenantid=""
    $clientid=""
    $password=""
    $userPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
    $userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $clientid, $userPassword
    Add-AzureRmAccount -TenantId $tenantid -ServicePrincipal -SubscriptionId $subscriptionId -Credential $userCredential -Environment 'AzureGermanCloud'