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

获取一年前创建的Azure资源所有者详情的PowerShell脚本问题

可行的Azure资源创建者详情查询脚本

原脚本存在几个关键问题:未筛选一年前创建的资源、错误解析createdBy字段(该字段实际是字符串而非带属性的对象)、未覆盖创建者为服务主体/组的场景。以下是修正后的完整脚本:

# 设置时间范围:一年前的今天
$oneYearAgo = (Get-Date).AddYears(-1)

# 获取当前订阅中一年前创建的所有资源
$resources = Get-AzResource | Where-Object { $_.ResourceCreationTime -le $oneYearAgo }

foreach ($resource in $resources) {
    # 查询资源的创建事件日志,获取创建者的ObjectId
    $creationEvent = Get-AzLog -ResourceId $resource.ResourceId -StartTime $oneYearAgo -EndTime (Get-Date) | 
                     Where-Object { $_.OperationName.Value -eq "Microsoft.Resources/resources/write" -and $_.Status.Value -eq "Succeeded" } |
                     Select-Object -First 1

    if ($creationEvent) {
        $creatorId = $creationEvent.Claims['http://schemas.microsoft.com/identity/claims/objectidentifier']
        if ($creatorId) {
            # 根据ObjectId查询AD对象(兼容用户、服务主体、组)
            $creatorDetails = Get-AzADObjectByObjectId -ObjectId $creatorId
            
            # 输出结果
            Write-Host "资源名称: $($resource.Name) | 资源类型: $($resource.ResourceType) | 创建者: $($creatorDetails.DisplayName) ($($creatorDetails.UserPrincipalName ?? $creatorDetails.AppId))"
        }
        else {
            Write-Host "资源名称: $($resource.Name) | 无法获取创建者ID"
        }
    }
    else {
        Write-Host "资源名称: $($resource.Name) | 未找到创建事件日志"
    }
}

关键说明:

  • 用ResourceCreationTime筛选一年前创建的资源,确保只处理目标资源
  • 通过Get-AzLog获取资源的创建操作日志,从Claims中提取创建者的ObjectId
  • 使用Get-AzADObjectByObjectId替代单一的Get-AzADUser,支持查询用户、服务主体、组三种类型的创建者
  • 处理了日志缺失、创建者ID为空的异常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:01