求助:如何获取所有订阅中所有虚拟机的Publisher、Offer、Plan及ID信息?
获取所有Azure订阅中虚拟机的Publisher、Offer、Plan和ID信息
没问题,我给你写一个实用的PowerShell脚本,能帮你遍历所有有权限的Azure订阅,抓取每个虚拟机的指定信息,还能导出到CSV方便后续分析。
前置准备
首先确保你已经安装了Azure PowerShell的Az模块,如果还没装,打开PowerShell(以管理员身份运行)执行:
Install-Module -Name Az -AllowClobber -Scope CurrentUser
然后登录你的Azure账号:
Connect-AzAccount
完整脚本
# 若未登录Azure,取消注释下面这行 # Connect-AzAccount # 获取当前账号有权访问的所有订阅 $allSubscriptions = Get-AzSubscription # 初始化数组存储最终结果 $vmInventory = @() foreach ($sub in $allSubscriptions) { try { Write-Host "正在处理订阅:$($sub.Name)(ID:$($sub.Id))" -ForegroundColor Cyan # 切换到当前订阅上下文 Set-AzContext -Subscription $sub.Id -ErrorAction Stop | Out-Null # 获取当前订阅下的所有虚拟机 $subscriptionVMs = Get-AzVM -ErrorAction Stop foreach ($vm in $subscriptionVMs) { # 提取镜像引用中的关键信息 $imageDetails = $vm.StorageProfile.ImageReference # 构建包含所需字段的自定义对象 $vmRecord = [PSCustomObject]@{ 订阅名称 = $sub.Name 订阅ID = $sub.Id 虚拟机ID = $vm.Id Publisher = $imageDetails.Publisher Offer = $imageDetails.Offer Plan(镜像SKU)= $imageDetails.Sku } # 添加到结果数组 $vmInventory += $vmRecord } } catch { Write-Warning "处理订阅 $($sub.Name) 时遇到错误:$_" } } # 在控制台输出格式化后的结果 Write-Host "`n=== 虚拟机信息汇总 ===" -ForegroundColor Green $vmInventory | Format-Table -AutoSize # 可选:将结果导出到CSV文件(路径可自行修改) $exportPath = "C:\AzureVMInventory.csv" $vmInventory | Export-Csv -Path $exportPath -NoTypeInformation -Encoding UTF8 Write-Host "`n结果已成功导出到:$exportPath" -ForegroundColor Green
脚本说明
- 遍历所有订阅:自动获取你有权限的所有Azure订阅,逐个切换上下文进行处理
- 关键字段提取:从虚拟机的
StorageProfile.ImageReference中抓取Publisher、Offer和Plan(对应镜像的Sku字段,部分自定义镜像可能为空) - 错误处理:加入了
try-catch块,遇到权限不足或其他异常时会输出警告,不会中断整个脚本运行 - 结果导出:默认会把所有信息导出到CSV文件,方便你用Excel等工具进一步分析
注意事项
- 如果你的账号有大量订阅或虚拟机,脚本运行时间可能会稍长,请耐心等待
- 部分特殊虚拟机(比如使用共享镜像库或自定义镜像创建的)可能没有完整的Publisher/Offer/Plan信息,脚本会显示为空值,这是正常现象
内容的提问来源于stack exchange,提问作者Abhinav Anand
相关产品推荐
相关产品推荐

