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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:30:48