【问题标题】:Unable to run my ps script through automation account无法通过自动化帐户运行我的 ps 脚本
【发布时间】:2021-05-16 05:56:36
【问题描述】:

我有一个我想通过 azure 自动化帐户运行的 powershell 脚本。该脚本在 cloudshell 上运行时运行良好,但通过 powershell runbook 运行时,它没有执行预期的任务并引发错误。当我使用 Select-AzSubscription -SubscriptionName 'xxx' 时,它告诉我使用 Connect-AzAccount,当我使用它给我的找不到打开的端口错误。 有人能帮忙吗?我列出了我收到的四种不同的错误消息。

Connect-AzAccount : Cannot find an open port. At line:6 char:1 + Connect-AzAccount + ~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [Connect-AzAccount], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.Profile.ConnectAzureRmAccountCommand



Get-AzVM : Argument passed in is not serializable. Parameter name: value At line:19 char:12 + $vmOSDisk=(Get-AzVM -ResourceGroupName $resourceGroupName -Name $vmNa ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [Get-AzVM], ArgumentException + FullyQualifiedErrorId : Microsoft.Azure.Commands.Compute.GetAzureVMCommand



New-AzStorageContext : Context cannot be null. Please log in using Connect-AzAccount. At line:50 char:23 + ... onContext = New-AzStorageContext -StorageAccountName $destinationstor ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzStorageContext], InvalidOperationException + FullyQualifiedErrorId : Microsoft.WindowsAzure.Commands.Storage.Common.Cmdlet.NewAzureStorageContext



Start-AzStorageBlobCopy : Cannot bind argument to parameter 'AbsoluteUri' because it is null. At line:55 char:38 + Start-AzStorageBlobCopy -AbsoluteUri $sas.AccessSAS -DestContainer $d ... + ~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Start-AzStorageBlobCopy], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.WindowsAzure.Commands.Storage.Blo [![enter image description here][1]][1]b.Cmdlet.StartAzureStorageBlobCopy

这里是部分代码的片段供参考。脚本中使用了 Az 模块,并且默认情况下新的 Azure 自动化帐户没有安装 Az 模块,即使在导入 Az.Accounts、Az.Automation、Az.Compute 之后我也会收到这些错误。

【问题讨论】:

  • 您通过 Connect-AzAccount 发送哪些参数?为您用于 sigh-in 的帐户启用了 MFA?
  • 为了人类的爱,请将您的代码发布为纯文本,而不是屏幕截图 - 最好是生成列出的错误的实际代码
  • 投票作为答案的脚本是我正在使用的代码。它在云 shell 上运行良好,但在 Azure 自动化帐户运行手册上运行不正常。
  • @OlehTarasenko 我没有通过 Connect-AzAccount 传递任何参数,并且我登录的帐户没有启用任何 MFA。

标签: azure powershell azure-automation azure-runbook


【解决方案1】:

在cloud shell中,它会自动登录你的用户帐户,实际上Connect-AzAccount不起作用,但它不会给你一个错误,只是一个警告,所以脚本可以工作。

自动化Runbook中不支持交互方式登录用户账号,如果直接使用Connect-AzAccount会报错,其他报错是基于此的后续问题。

因此,为了解决问题,在这种情况下,我们始终使用您的自动化帐户的 Run As Account,本质上它是一个 AD 应用程序以及您的 AAD 租户中的服务主体。确保您已启用它并授予它与您的用户帐户相同的所有权限以运行脚本,其名称类似于automationname_xxxxxxxxx,您可以在门户中的自动化帐户中的Run As Account 刀片中查看它。

然后使用下面的命令登录。

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

    Connect-AzAccount `
        -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
    }
}

登录后,请使用Set-AzContext -Subscription <subscription-id>,而不是Select-AzSubscription,也请在自动化账户中导入Az.Storage模块,因为New-AzStorageContextStart-AzStorageBlobCopy等一些命令属于该模块,执行后,您的脚本应该可以工作。

更新:

我用你在Storage Blob Data Contributor 中使用的脚本进行了测试,它运行良好。

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

    Connect-AzAccount `
        -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
    }
}

$sas = Grant-AzSnapshotAccess -SnapshotName "joyvmsnap" -ResourceGroupName "xxxxx"  -DurationInSecond 3600 -Access Read 

$destinationContext = New-AzStorageContext -StorageAccountName "joystoragev2" -UseConnectedAccount

$storageContainerName="image"
$destinationVHDFileName="test.vhd"
Start-AzStorageBlobCopy -AbsoluteUri $sas.AccessSAS -DestContainer $storageContainerName -DestContext $destinationContext -DestBlob $destinationVHDFileName -Force

确保存储帐户的防火墙设置为允许来自所有网络的访问,并且Storage Blob Data Contributor 角色分配在存储帐户级别或更高级别,而不是容器级别。

【讨论】:

  • 抱歉给您添麻烦了,这个方法奏效了,最后出现了一些拼写错误。谢谢。
  • 一切运行良好。现在只有一个错误。此请求无权执行此操作,即使我具有贡献者和存储数据 Blob 贡献者角色并且与运行脚本的用户帐户相同,它也具有这两个角色。
  • 这是错误: Start-AzStorageBlobCopy:此请求无权执行此操作。 HTTP 状态代码:403 - HTTP 错误消息:此请求无权执行此操作。 ErrorCode: AuthorizationFailure ErrorMessage: 此请求无权执行此操作。
  • @atindra 对于新问题,我建议您在新帖子中提出,包括更多详细信息,stackoverflow 避免在一个帖子中提出多个问题,其他人会很清楚。
  • @atindra 为你做了一个测试,它应该可以工作,查看我的更新中的详细信息,确保存储帐户的防火墙设置为允许从所有网络访问并且Storage Blob Data Contributor 角色是在存储帐户级别或更高级别分配,而不是容器级别。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多