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

Azure VM标签被批量覆盖如何通过PowerShell/CLI导出数据恢复旧标签

Azure VM批量标签恢复方案

可以直接通过PowerShell、CLI调用Azure Change Analysis的开放接口批量导出历史标签数据,无需逐个在门户手动查询,具体操作如下:

前置要求

  • 操作账号具备订阅级Microsoft.ChangeAnalysis/resourceChanges/read权限和虚拟机读取权限
  • PowerShell环境需提前安装Az.ChangeAnalysis模块,CLI环境需提前安装change-analysis扩展

方案1:Azure PowerShell实现

步骤1:安装依赖并登录

Install-Module -Name Az.ChangeAnalysis -Force -AllowClobber
Connect-AzAccount -Subscription "<替换为你的订阅ID>"

步骤2:批量导出历史标签到CSV

# 自定义标签变更的时间范围,示例为过去24小时,可根据实际修改
$startTime = (Get-Date).AddDays(-1).ToUniversalTime()
$endTime = (Get-Date).ToUniversalTime()
$outputCsv = "./VM历史标签记录.csv"

$allVMs = Get-AzVM
$exportResults = @()

foreach ($vm in $allVMs) {
    # 查询指定时间范围内该VM的所有变更记录
    $changeRecords = Get-AzChangeAnalysisResourceChange -ResourceId $vm.Id -StartTime $startTime -EndTime $endTime
    # 筛选标签类变更
    $tagRelatedChanges = $changeRecords | Where-Object { $_.PropertyChanges.ChangeCategory -eq "Tag" }
    
    foreach ($change in $tagRelatedChanges) {
        foreach ($prop in $change.PropertyChanges) {
            $exportResults += [PSCustomObject]@{
                虚拟机名称 = $vm.Name
                资源ID = $vm.Id
                变更时间 = $change.BeforeSnapshot.Timestamp
                标签键 = $prop.ProfilePropertyName
                标签旧值 = $prop.OldValue
                标签新值 = $prop.NewValue
            }
        }
    }
}

# 导出到CSV文件
$exportResults | Export-Csv -Path $outputCsv -NoTypeInformation -Encoding UTF8

方案2:Azure CLI实现(适用于Bash/WSL环境)

步骤1:安装扩展并登录

az extension add --name change-analysis
az login --subscription "<替换为你的订阅ID>"

步骤2:批量导出历史标签到CSV

# 自定义时间范围,示例为过去24小时,UTC格式
startTime=$(date -u -d "-1 day" +"%Y-%m-%dT%H:%M:%SZ")
endTime=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
outputCsv="./VM历史标签记录.csv"

# 写入CSV表头
echo "虚拟机名称,资源ID,变更时间,标签键,标签旧值,标签新值" > $outputCsv

# 遍历订阅下所有虚拟机
az vm list --query "[].{id:id, name:name}" -o tsv | while read -r vmId vmName; do
    # 查询标签变更记录
    az change-analysis resource list --resource-id $vmId --start-time $startTime --end-time $endTime -o json \
    | jq -c '.[] | select(.propertyChanges[]?.changeCategory == "Tag")' | while read -r change; do
        changeTime=$(echo $change | jq -r '.beforeSnapshot.timestamp')
        echo $change | jq -c '.propertyChanges[] | select(.changeCategory == "Tag")' | while read -r tagChange; do
            tagKey=$(echo $tagChange | jq -r '.profilePropertyName')
            oldVal=$(echo $tagChange | jq -r '.oldValue')
            newVal=$(echo $tagChange | jq -r '.newValue')
            echo "\"$vmName\",\"$vmId\",\"$changeTime\",\"$tagKey\",\"$oldVal\",\"$newVal\"" >> $outputCsv
        done
    done
done

批量恢复旧标签参考脚本

导出CSV后可以直接用以下PowerShell脚本批量还原所有VM的旧标签:

$tagRecords = Import-Csv -Path "./VM历史标签记录.csv"
# 按资源ID分组,整理每台VM的所有旧标签
$vmTagGroups = $tagRecords | Group-Object -Property 资源ID

foreach ($vmGroup in $vmTagGroups) {
    $oldTagMap = @{}
    foreach ($tag in $vmGroup.Group) {
        $oldTagMap[$tag.标签键] = $tag.标签旧值
    }
    # 覆盖现有标签为旧标签
    Update-AzTag -ResourceId $vmGroup.Name -Tag $oldTagMap -Operation Replace | Out-Null
    Write-Host "已恢复虚拟机 $($vmGroup.Group[0].虚拟机名称) 的旧标签"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:45:03