如何用Azure PowerShell获取订阅内Azure VM的创建及修改信息并导出报表
使用Azure PowerShell获取Azure虚拟机的创建/修改信息并导出报表
前提准备
- 安装最新版Azure PowerShell模块:
Install-Module -Name Az -Force -AllowClobber - 登录并切换到目标订阅:
Connect-AzAccount Set-AzContext -Subscription "你的订阅ID或名称"
核心脚本实现
VM的创建者、创建日期需要从Azure活动日志中查询(VM资源本身不存储创建者信息),而修改日期和修改者可结合资源属性与活动日志获取。注意:微软仅保留最近90天的活动日志,超过90天的创建/修改记录无法查询。
运行以下脚本获取VM信息并导出CSV报表:
# 替换为你的订阅ID(已切换订阅可跳过此步) $targetSubscription = "你的订阅ID" Set-AzContext -Subscription $targetSubscription # 获取订阅下所有虚拟机 $allVMs = Get-AzVM # 初始化结果集合 $vmInventory = @() foreach ($vm in $allVMs) { # 获取VM资源的基础属性 $vmResource = Get-AzResource -ResourceId $vm.Id $lastModifiedFromResource = $vmResource.LastModifiedTime # 查询活动日志中的创建事件(最早的成功写入操作) $creationEvent = Get-AzLog -ResourceId $vm.Id -StartTime (Get-Date).AddDays(-90) | Where-Object { $_.OperationName.Value -eq "Microsoft.Compute/virtualMachines/write" -and $_.Status.Value -eq "Succeeded" } | Sort-Object EventTimestamp | Select-Object -First 1 # 查询活动日志中的最近修改事件(排除创建事件) $modifyEvent = Get-AzLog -ResourceId $vm.Id -StartTime (Get-Date).AddDays(-90) | Where-Object { $_.OperationName.Value -eq "Microsoft.Compute/virtualMachines/write" -and $_.Status.Value -eq "Succeeded" -and $_.EventTimestamp -ne $creationEvent?.EventTimestamp } | Sort-Object EventTimestamp -Descending | Select-Object -First 1 # 组装VM详情对象 $vmDetails = [PSCustomObject]@{ VMName = $vm.Name ResourceGroupName = $vm.ResourceGroupName CreationDate = $creationEvent ? $creationEvent.EventTimestamp : "超过90天无法获取" CreatedBy = $creationEvent ? $creationEvent.Claims.Name : "超过90天无法获取" LastModifiedDate = $modifyEvent ? $modifyEvent.EventTimestamp : $lastModifiedFromResource LastModifiedBy = $modifyEvent ? $modifyEvent.Claims.Name : "无最近修改记录(或超过90天)" } $vmInventory += $vmDetails } # 导出到CSV文件(可自行修改路径) $exportPath = "C:\VM_Inventory_$(Get-Date -Format 'yyyyMMdd').csv" $vmInventory | Export-Csv -Path $exportPath -NoTypeInformation -Encoding UTF8 Write-Host "报表已成功导出至:$exportPath"
后续分组操作示例
导出CSV后,可直接用PowerShell按创建者/修改者分组分析:
# 按创建者统计VM数量 Import-Csv -Path $exportPath | Group-Object CreatedBy | Select-Object Name, Count # 按修改者查看对应VM列表 Import-Csv -Path $exportPath | Group-Object LastModifiedBy
关键注意事项
- 若VM创建/修改时间超过90天,脚本会在对应字段标注“超过90天无法获取”,这是Azure活动日志的保留限制导致的
- 如需长期留存这类信息,建议定期运行脚本归档报表,或配置Azure Monitor将活动日志导出到存储账户/Log Analytics工作区
内容的提问来源于stack exchange,提问作者Yogesh Kulkarni
相关产品推荐
相关产品推荐

