如何获取订阅内所有VM的备份信息及Get-AzVM -Status结果
解决方案
可以通过PowerShell结合Azure模块,先分别抓取VM状态数据和备份关联数据,再通过VM的唯一资源ID完成关联,最终整合出包含备份信息的完整VM列表。以下是可直接运行的脚本:
# 1. 获取订阅内所有VM的状态信息 $vmList = Get-AzVM -Status # 2. 遍历所有恢复服务保管库,抓取VM备份项数据 $backupItems = Get-AzRecoveryServicesVault | ForEach-Object { Set-AzRecoveryServicesVaultContext -Vault $_ Get-AzRecoveryServicesBackupItem -BackupManagementType AzureVM -WorkloadType AzureVM } # 3. 关联VM与备份数据,提取所需字段 $result = $vmList | ForEach-Object { $currentVM = $_ # 通过资源ID匹配对应的备份项 $matchedBackup = $backupItems | Where-Object { $_.SourceResourceId -eq $currentVM.Id } # 若有备份项,拉取对应的备份策略详情 $backupPolicy = if ($matchedBackup) { Get-AzRecoveryServicesBackupPolicy -Name $matchedBackup.PolicyName } else { $null } # 解析备份计划和保留规则 $schedule = $backupPolicy?.SchedulePolicy $retentionRules = $backupPolicy?.RetentionPolicy # 组装最终输出对象 [PSCustomObject]@{ VMName = $currentVM.Name ResourceGroup = $currentVM.ResourceGroupName PowerState = $currentVM.Statuses[1].DisplayStatus BackupPolicyName = $matchedBackup?.PolicyName BackupScheduleType = $schedule?.ScheduleRunFrequency BackupTimes = if ($schedule?.ScheduleRunFrequency -eq "Daily") { $schedule.ScheduleRunTimes -join ", " } else { $schedule?.ScheduleRunWeekly?.DaysOfWeek -join ", " } DailyRetentionDays = $retentionRules?.DailyRetention.DurationCount WeeklyRetentionWeeks = $retentionRules?.WeeklyRetention.DurationCount MonthlyRetentionMonths= $retentionRules?.MonthlyRetention.DurationCount } } # 输出结果(可按需导出为CSV) $result | Format-Table -AutoSize # $result | Export-Csv -Path ".\VM_Backup_Details.csv" -NoTypeInformation
关键说明
- 关联逻辑:用VM的
Id(资源ID)匹配备份项的SourceResourceId,这是最可靠的关联方式,避免同一订阅内重名VM的冲突。 - 备份字段解析:通过备份项的
PolicyName拉取完整策略,从中拆分出计划类型、执行时间、各维度保留周期。未配置备份的VM,对应字段会显示为空。 - 前置准备:确保已安装最新版Azure模块:
Install-Module -Name Az.RecoveryServices, Az.Compute -Force -AllowClobber;执行前需登录Azure并切换到目标订阅:Connect-AzAccount、Set-AzContext -SubscriptionId "你的订阅ID"
内容的提问来源于stack exchange,提问作者Joris Willekens
相关产品推荐
相关产品推荐

