使用Get-AzLog获取资源创建者标签时出现错误调用者问题求助
解决通过Get-AzLog获取资源创建者并添加createdBy标签的问题
问题描述
尝试通过Get-AzLog获取Caller日志条目,以此为资源组/资源添加createdBy标签,但偶尔会得到错误或无关的调用者信息。
原代码
$log = Get-AzActivityLog -ResourceGroupName rg-pf-functions -StartTime $startTime -EndTime $endTime $owner = $log[-1] | Select -ExpandProperty Caller | Group-Object | Sort-Object | Select -ExpandProperty Name Update-AzTag -Tag @{"createdBy"=$owner} -ResourceId $rg.ResourceId -Operation Merge
问题根源
- 未筛选创建类操作:Activity Log包含资源的所有操作记录(修改、删除、权限变更等),直接取最后一条
$log[-1]大概率拿到的不是创建操作的日志。 - 排序逻辑错误:
Get-AzActivityLog默认返回的日志按时间降序排列,$log[-1]是最早的条目,但这段时间内若有其他操作,最早的也不一定是创建操作。 - 未处理异常情况:部分系统级操作(如Azure后台维护)的调用者是系统账户,并非实际创建资源的用户。
解决方案
1. 精准筛选创建操作
根据目标资源类型,筛选对应的Write操作(创建/更新类操作的标识):
- 资源组创建:
Microsoft.Resources/subscriptions/resourcegroups/write - 虚拟机创建:
Microsoft.Compute/virtualMachines/write - 存储账户创建:
Microsoft.Storage/storageAccounts/write
2. 按时间升序排序,取第一条有效创建日志
创建操作是资源生命周期中最早的有效操作,按时间升序排序后取第一条,确保拿到实际创建者。
3. 处理调用者为空或系统账户的情况
判断Caller是否为有效的用户邮箱格式,避免将系统账户标记为创建者。
优化后的代码示例
# 定义目标资源组名称和时间范围(建议设置为资源组创建前后的时间段,缩小日志范围) $rgName = "rg-pf-functions" $startTime = (Get-Date).AddDays(-7) # 可根据实际情况调整时间范围 $endTime = Get-Date # 获取资源组的创建操作日志,筛选指定操作类型并按时间升序排序 $createLogs = Get-AzActivityLog -ResourceGroupName $rgName ` -StartTime $startTime ` -EndTime $endTime ` | Where-Object { $_.OperationName.Value -eq "Microsoft.Resources/subscriptions/resourcegroups/write" } ` | Sort-Object -Property StartTime # 提取有效创建者并添加标签 if ($createLogs.Count -gt 0) { $createdBy = $createLogs[0].Caller # 判断是否为有效用户邮箱(排除系统账户) if ($createdBy -match "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$") { $rg = Get-AzResourceGroup -Name $rgName Update-AzTag -Tag @{"createdBy" = $createdBy} -ResourceId $rg.ResourceId -Operation Merge Write-Host "已成功为资源组添加createdBy标签:$createdBy" } else { Write-Host "未识别到有效用户创建者,当前调用者为系统账户或无效格式:$createdBy" } } else { Write-Host "未找到资源组的创建操作日志,请检查时间范围是否正确" }
额外注意事项
- 时间范围不宜过大:过大的时间范围会返回大量日志,降低效率,建议设置为资源组创建前后的1-7天。
- 权限要求:执行
Get-AzActivityLog需要Monitoring Reader或Reader以上权限。 - 资源级别的标签添加:如果要给资源(而非资源组)添加标签,需调整
Get-AzActivityLog的筛选条件,指定资源ID和对应的资源类型Write操作。
内容的提问来源于stack exchange,提问作者Michael Garstenauer
相关产品推荐
相关产品推荐

