【问题标题】:Azure Automation Account - Runbook Error - Object reference not set to an instance of an objectAzure 自动化帐户 - Runbook 错误 - 对象引用未设置为对象的实例
【发布时间】:2020-02-18 22:43:42
【问题描述】:

上周,我部署了一个脚本来使用 New-AzSnapshot cmdlet 备份一些磁盘。 我在 Azure 自动化帐户中安排了这个脚本,前 2 天,脚本运行得非常好!

今天分析日志,发现脚本出现如下错误:

Connect-AzAccount:对象引用未设置为对象的实例。在 line:12 char:25 + $connectionResult = Connect-AzAccount ` + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [Connect-AzAccount], NullReferenceException + FullyQualifiedErrorId : Microsoft.Azure.Commands.Profile.ConnectAzureRmAccountCommand

有谁知道是什么导致了这个错误?

脚本下方:

Param(
    [string]$resourceGroupName
)

$connection = Get-AutomationConnection -Name AzureRunAsConnection
while (!($connectionResult) -And ($logonAttempt -le 10)) {
    $LogonAttempt++
    # Logging in to Azure...
    $connectionResult = Connect-AzAccount `
        -ServicePrincipal `
        -Tenant $connection.TenantID `
        -ApplicationID $connection.ApplicationID `
        -CertificateThumbprint $connection.CertificateThumbprint

    Start-Sleep -Seconds 30
}

# Remove old snapshots
$snapshotnames = (Get-AzSnapshot -ResourceGroupName $resourceGroupName).name
foreach($snapname in $snapshotnames)
{
    Get-AzSnapshot -ResourceGroupName $resourceGroupName -SnapshotName $snapname | ?{($_.TimeCreated) -lt ([datetime]::UtcNow.AddMinutes(-10080))} | Remove-AzSnapshot -Force
} 

foreach ($VMs in Get-AzVM -ResourceGroupName $resourceGroupName) {  
    #Set local variables 
    $location = $VMs.Location 
    #$resourceGroupName = $vmInfo.ResourceGroupName 
    $timestamp = Get-Date -f MM-dd-yyyy_HH_mm_ss 

    #Snapshot name of OS data disk 
    $snapshotName = "bkp-" + $VMs.Name + "-" + $timestamp 

    #Create snapshot configuration 
    $snapshot = New-AzSnapshotConfig -SourceUri $VMs.StorageProfile.OsDisk.ManagedDisk.Id -Location $location  -CreateOption copy 

    #Take snapshot 
    New-AzSnapshot -Snapshot $snapshot -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName  



    if ($VMs.StorageProfile.DataDisks.Count -ge 1) { 
        #Condition with more than one data disks 
        for ($i = 0; $i -le $VMs.StorageProfile.DataDisks.Count - 1; $i++) { 

            #Snapshot name of OS data disk 
            $snapshotName = "bkp-" + $VMs.StorageProfile.DataDisks[$i].Name + "-" + $timestamp

            #Create snapshot configuration 
            $snapshot = New-AzSnapshotConfig -SourceUri $VMs.StorageProfile.DataDisks[$i].ManagedDisk.Id -Location $location  -CreateOption copy 

            #Take snapshot 
            New-AzSnapshot -Snapshot $snapshot -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName  

        } 
    } 
    else { 
        Write-Host $VMs.Name + " doesn't have any additional data disk." 
    } 
}

【问题讨论】:

    标签: azure azure-automation azure-runbook


    【解决方案1】:

    查看错误消息中的位置(在 line:12 char:25),您遇到了 nullreference 异常。它表明connection 为空。

    您需要先在同一页面上声明connection,然后才能使用其中的变量。

    另请参阅:What is a NullReferenceException, and how do I fix it?

    编辑:在第二次通知中,我认为您已经在

    声明了$connection
    $connection = Get-AutomationConnection -Name AzureRunAsConnection
    

    但它看起来返回 null。在这种情况下,您需要弄清楚为什么返回 null,因为如果已连接,它应该返回填充的 $connection

    为了安全检查以避免错误:您应该在输入 while 之前先检查 $connection 是否不为空(例如 $connection != null 可以用于 Javascript)。这样你就不会得到错误,但请记住,你不会通过这个得到结果。

    【讨论】:

    • 嘿史蒂文,谢谢你的回答。在这种情况下,我应该像这样初始化变量 $connectionResult: $connectionResult = $null 吗?
    • 那行不通,是 $connection 为空,而不是 $connectionResult。我已经用更多信息更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2012-08-31
    • 2011-11-21
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多