无法通过自动化帐户 运行 我的 ps 脚本
Unable to run my ps script through automation account
我有一个 powershell 脚本,我想通过 azure 自动化帐户运行。当 运行 在 cloudshell 上运行时,脚本运行良好,但是当 运行 通过 powershell 运行book 运行它时,它没有执行预期的任务并抛出 errors.When 我正在使用 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 之后我也收到这些错误。
在云端shell,它会自动登录你的用户帐户,实际上Connect-AzAccount
不起作用,但它不会给你一个错误,只是一个警告,所以脚本会起作用。
在自动化运行书中,不支持交互方式登录用户账号,如果直接使用Connect-AzAccount
,会报错,其他报错是follow-up 基于此的问题。
因此,为了解决这些问题,我们总是在这种情况下使用您的自动化帐户的 Run As Account,本质上它是一个 AD 应用程序以及您的 AAD 租户中的服务主体。确保你已经启用它并赋予它与你的用户帐户相同的所有权限给运行脚本,它的名字像automationname_xxxxxxxxx
,你可以在Run As Account
blade 在门户的自动化帐户中。
然后使用以下命令登录。
$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-AzStorageContext
和[=20] =] 属于此模块,完成后,您的脚本应该可以运行。
更新:
我用你在 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
角色分配在存储帐户级别或更高级别,而不是容器级别。
我有一个 powershell 脚本,我想通过 azure 自动化帐户运行。当 运行 在 cloudshell 上运行时,脚本运行良好,但是当 运行 通过 powershell 运行book 运行它时,它没有执行预期的任务并抛出 errors.When 我正在使用 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 之后我也收到这些错误。
在云端shell,它会自动登录你的用户帐户,实际上Connect-AzAccount
不起作用,但它不会给你一个错误,只是一个警告,所以脚本会起作用。
在自动化运行书中,不支持交互方式登录用户账号,如果直接使用Connect-AzAccount
,会报错,其他报错是follow-up 基于此的问题。
因此,为了解决这些问题,我们总是在这种情况下使用您的自动化帐户的 Run As Account,本质上它是一个 AD 应用程序以及您的 AAD 租户中的服务主体。确保你已经启用它并赋予它与你的用户帐户相同的所有权限给运行脚本,它的名字像automationname_xxxxxxxxx
,你可以在Run As Account
blade 在门户的自动化帐户中。
然后使用以下命令登录。
$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-AzStorageContext
和[=20] =] 属于此模块,完成后,您的脚本应该可以运行。
更新:
我用你在 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
角色分配在存储帐户级别或更高级别,而不是容器级别。