获取一年前创建的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
相关产品推荐
相关产品推荐

