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 中不可用。
我要做的就是使用
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 |
我也尝试使用
所有 Azure 模块都更新到最新版本。
TLTR:
我的主要目标是使用 runnbook 中的
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} |
这似乎是一个已知问题,我无法找到解决方法。但是有两种解决方法:
指定
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' |