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
相关产品推荐
相关产品推荐

