求助:用PowerShell调用Az CLI编写脚本获取Azure全租户Windows VM信息
PowerShell + Az CLI 批量导出Azure租户下所有Windows虚拟机信息
所需Az CLI命令说明
az account list:获取租户下所有启用状态的订阅az vm list:筛选订阅内所有Windows虚拟机(包含已停止/解除分配状态)az vm get-instance-view:获取VM的操作系统详细版本信息az vm get-patch:获取VM的最新补丁部署状态及相关信息
完整脚本实现
# 设置目标租户ID $tenantId = "xxxx-xxxx-xxxx-xxxx" # 登录目标租户(未登录时执行) az login --tenant $tenantId # 获取租户下所有启用状态的订阅 $subscriptions = az account list --tenant $tenantId --query "[?state=='Enabled'].{id:id, name:name}" -o json | ConvertFrom-Json # 初始化结果存储数组 $vmResults = @() # 遍历每个订阅 foreach ($sub in $subscriptions) { Write-Host "正在处理订阅:$($sub.name) ($($sub.id))" # 切换到当前订阅上下文 az account set --subscription $sub.id # 获取当前订阅下所有Windows虚拟机 $vms = az vm list --query "[?storageProfile.osDisk.osType=='Windows'].{name:name, resourceGroup:resourceGroup, id:id}" -o json | ConvertFrom-Json # 遍历每个虚拟机 foreach ($vm in $vms) { Write-Host " 正在查询VM:$($vm.name)" # 获取VM实例视图(含OS版本信息) $instanceView = az vm get-instance-view --name $vm.name --resource-group $vm.resourceGroup --query "{osName:osName, osVersion:osVersion}" -o json | ConvertFrom-Json # 获取VM补丁信息 $patchInfo = az vm get-patch --name $vm.name --resource-group $vm.resourceGroup --query "{lastPatchTime:lastPatchInstallationDateTime, patchState:patchState}" -o json | ConvertFrom-Json # 组装结果对象 $vmRecord = [PSCustomObject]@{ 订阅名称 = $sub.name 订阅ID = $sub.id 资源组名称 = $vm.resourceGroup 虚拟机名称 = $vm.name 操作系统 = $instanceView.osName OS版本 = $instanceView.osVersion 最后补丁安装时间 = $patchInfo.lastPatchTime 补丁状态 = $patchInfo.patchState 补丁状态说明 = switch ($patchInfo.patchState) { 'Completed' { "已完成最新补丁安装" } 'Failed' { "补丁安装失败" } 'InProgress' { "补丁安装中" } default { "未检测到补丁记录" } } } $vmResults += $vmRecord } } # 控制台输出表格并导出CSV $vmResults | Format-Table -AutoSize $vmResults | Export-Csv -Path "Azure_Windows_VMs_Report.csv" -NoTypeInformation -Encoding UTF8
关键字段说明
- 订阅信息:从
az account list获取name(订阅名称)和id(订阅ID),确保VM归属关系清晰 - 操作系统/版本:通过
az vm get-instance-view的osName(如Windows Server 2019 Datacenter)和osVersion(如10.0.17763.4377)获取,比az vm list返回的信息更精准 - 补丁信息:使用
az vm get-patch的lastPatchInstallationDateTime(最后一次补丁安装时间)和patchState(补丁部署状态),如需具体补丁列表,可调整--query参数提取patches字段内容
注意事项
- 需安装最新版Az CLI,避免旧版本命令兼容性问题,安装命令:
Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet' - 执行脚本的账号需拥有租户内所有订阅的虚拟机读取权限和更新管理权限
- 订阅数量较多时脚本执行时间较长,建议在非高峰时段运行
内容的提问来源于stack exchange,提问作者Ian Carrick
相关产品推荐
相关产品推荐

