Azure凭据尚未设置或已过期,请运行Connect-AzAccount

时间:2019-03-01 10:18:14

标签: azure powershell authentication azure-devops azure-authentication

有关以下问题(Azure DevOps - Custom Task - PowerShell with Azure Authentification),我现在正在使用$url通过Azure DevOps自定义任务进行登录。

在下一步中,我想并行运行多个作业以首先进行操作,然后通过模板部署某些Azure资源。使用AzureRM可以正常工作,但是切换到Az后我总是会收到错误消息

  

您的Azure凭据尚未设置或已过期,请   运行Connect-AzAccount来设置您的Azure凭据。

我已经将Az模块更新为最新版本。

这是我的方法:

身份验证

Connect-AzAccount

并行部署

try {
    $endpoint = Get-VstsEndpoint -Name $serviceName -Require
    if (!$endpoint) {
        throw "Endpoint not found..."
    }
    $subscriptionId = $endpoint.Data.SubscriptionId
    $tenantId = $endpoint.Auth.Parameters.TenantId
    $servicePrincipalId = $endpoint.Auth.Parameters.servicePrincipalId
    $servicePrincipalKey = $endpoint.Auth.Parameters.servicePrincipalKey

    $spnKey = ConvertTo-SecureString $servicePrincipalKey -AsPlainText -Force
    $credentials = New-Object System.Management.Automation.PSCredential($servicePrincipalId,$spnKey)

    Connect-AzAccount -ServicePrincipal -TenantId $tenantId -Credential $credentials
    Select-AzSubscription -SubscriptionId $subscriptionId -Tenant $tenantId

    $ctx = Get-AzContext
    Write-Host "Connected to subscription '$($ctx.Subscription)' and tenant '$($ctx.Tenant)'..."
} catch {
    Write-Host "Authentication failed: $($_.Exception.Message)..." 
}

2 个答案:

答案 0 :(得分:0)

我个人使用此命令:

Connect-AzureRmAccount

我首先直接使用ISE控制台登录 ,然后该会话将保持不变,并且我可以运行任何脚本而不会出现任何问题(无需在脚本内部使用此命令)。

希望它对您有帮助。

编辑。

我看到您也在选择订阅,这是我使用的订阅。

Select-AzureRmSubscription -Subscription 'Subscription ID'

答案 1 :(得分:0)

由于某种原因(我不知道),将上下文传递给后台作业不再有效,因为移至Az模块(也是最新版本(1.4.0))。我尝试将Save-AzContextImport-AzContext一起使用,或者通过Get-AzContext获取上下文,然后将其传递给后台作业(通过Set-AzContext或直接使用-DefaultProfile(此方法使用AzureRm模块))。

现在适用于我的解决方法是分别对每个后台作业进行身份验证。

有关职位定义:

foreach ($armTemplateFile in $armTemplateFiles) {
    $logic = {
        Param(
            [object] 
            [Parameter(Mandatory=$true)]
            $endpointInput,

            [object] 
            [Parameter(Mandatory=$true)]
            $armTemplateFile,

            [string] 
            [Parameter(Mandatory=$true)]
            $resourceGroupName
        )

        ###########################
        #Login
        Write-Host "Authenticating..."
        try {
            $endpoint = $endpointInput
            if (!$endpoint) {
                throw "Endpoint not found..."
            }
            $subscriptionId = $endpoint.Data.SubscriptionId
            $tenantId = $endpoint.Auth.Parameters.TenantId
            $servicePrincipalId = $endpoint.Auth.Parameters.servicePrincipalId
            $servicePrincipalKey = $endpoint.Auth.Parameters.servicePrincipalKey

            $spnKey = ConvertTo-SecureString $servicePrincipalKey -AsPlainText -Force
            $credentials = New-Object System.Management.Automation.PSCredential($servicePrincipalId,$spnKey)

            Connect-AzAccount -ServicePrincipal -TenantId $tenantId -Credential $credentials
            Select-AzSubscription -SubscriptionId $subscriptionId -Tenant $tenantId

            $ctx = Get-AzContext
            Write-Host "Connected to subscription '$($ctx.Subscription)' and tenant '$($ctx.Tenant)'..."
        } catch {
            Write-Host "Authentication failed: $($_.Exception.Message)..." 
        }

开始工作:

Start-Job $logic -Name $jobName -ArgumentList $endpoint, $armTemplateFile, $ResourceGroupName