You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure存储账户锁定时如何用PowerShell获取孤立VHD列表?

解决PowerShell脚本处理Azure锁定/无权限存储账户时的失败问题

我明白你碰到的麻烦了——当脚本遇到锁定的存储账户或者没有访问权限的账户时,整个执行就会直接中断,没法继续处理其他正常的存储账户。这是因为原脚本的管道操作没有错误处理机制,只要有一个账户出问题,整条命令就会抛出异常终止。

下面是改进后的脚本,加入了逐个账户处理和异常捕获的逻辑,确保单个账户的错误不会影响整个脚本的执行,同时还会记录错误信息方便后续排查:

# 先检查是否已登录Azure,未登录则触发登录
if (-not (Get-AzureRmContext)) {
    Login-AzureRmAccount
}

# 获取订阅下所有存储账户
$allStorageAccounts = Get-AzureRmStorageAccount

# 初始化两个变量:存储找到的孤立VHD,存储错误日志
$orphanedVHDs = @()
$errorLogs = @()

# 遍历每个存储账户,逐个处理
foreach ($sa in $allStorageAccounts) {
    try {
        Write-Host "正在处理存储账户: $($sa.StorageAccountName) (资源组: $($sa.ResourceGroupName))" -ForegroundColor Cyan
        
        # 获取当前存储账户的上下文,这一步如果账户锁定/无权限会抛出异常
        $storageContext = $sa.Context
        
        # 获取该账户下所有后缀为.vhd的Blob
        $allVHDs = Get-AzureStorageContainer -Context $storageContext | 
                   Get-AzureStorageBlob -Context $storageContext | 
                   Where-Object { $_.Name -like '*.vhd' }

        # 补充判断VHD是否为孤立的逻辑(原脚本未实现,可按需调整)
        # 示例:检查是否没有Azure磁盘引用这个VHD
        foreach ($vhd in $allVHDs) {
            $linkedDisk = Get-AzureRmDisk | Where-Object { $_.CreationData.SourceUri -eq $vhd.ICloudBlob.Uri.AbsoluteUri }
            if (-not $linkedDisk) {
                $orphanedVHDs += [PSCustomObject]@{
                    VHDName           = $vhd.Name
                    ContainerName     = $vhd.Container.Name
                    StorageAccount    = $sa.StorageAccountName
                    ResourceGroupName = $sa.ResourceGroupName
                    VHDUri            = $vhd.ICloudBlob.Uri.AbsoluteUri
                }
            }
        }

    } catch {
        # 捕获异常并记录错误信息
        $errorRecord = [PSCustomObject]@{
            StorageAccountName = $sa.StorageAccountName
            ResourceGroupName  = $sa.ResourceGroupName
            ErrorMessage       = $_.Exception.Message
            ErrorTimestamp     = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        }
        $errorLogs += $errorRecord
        Write-Host "处理存储账户 $($sa.StorageAccountName) 失败: $($_.Exception.Message)" -ForegroundColor Red
    }
}

# 输出最终结果
Write-Host "`n===== 孤立VHD列表 =====" -ForegroundColor Green
$orphanedVHDs | Format-Table VHDName, ContainerName, StorageAccount, ResourceGroupName -AutoSize

Write-Host "`n===== 处理错误日志 =====" -ForegroundColor Yellow
$errorLogs | Format-Table StorageAccountName, ResourceGroupName, ErrorMessage, ErrorTimestamp -AutoSize

关键改进点说明:

  • 逐个账户处理:用foreach循环替代原脚本的直接管道,实现错误隔离,单个账户出错不会影响全局。
  • try/catch异常捕获:捕获所有可能的异常(账户锁定、权限不足、网络问题等),记录错误信息的同时继续执行后续账户的处理。
  • 孤立VHD判断逻辑:补充了通过Azure磁盘关联关系识别孤立VHD的常用逻辑,你也可以根据需求调整(比如检查VHD的Lease状态)。
  • 可视化状态提示:添加彩色的进度和错误提示,实时掌握脚本执行情况。

这样修改后,脚本的鲁棒性大幅提升,即使遇到异常存储账户,也能完成剩余账户的处理并保留错误记录,方便后续排查。

内容的提问来源于stack exchange,提问作者harish ks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:32:46