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

使用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

问题根源

  1. 未筛选创建类操作:Activity Log包含资源的所有操作记录(修改、删除、权限变更等),直接取最后一条$log[-1]大概率拿到的不是创建操作的日志。
  2. 排序逻辑错误:Get-AzActivityLog默认返回的日志按时间降序排列,$log[-1]是最早的条目,但这段时间内若有其他操作,最早的也不一定是创建操作。
  3. 未处理异常情况:部分系统级操作(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:30:11