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

Azure资源自动添加CreatedBy/CreatedDate标签PowerShell脚本异常排查

解决Azure自动化Runbook标签异常问题

问题分析与修复方案

1. createdTime标签值为空的问题

原脚本通过Get-AzResourceGroup的资源集合获取CreatedTime,该方式效率低下且部分资源类型不会返回此属性。正确做法是优先从当前资源对象的Properties中提取创建时间,若该属性不存在,则从Activity Log的创建事件中获取时间戳。

2. createdBy标签包含额外ID的问题

Get-AzLog返回的Caller字段有时会呈现邮箱地址 (GUID)格式,需通过正则表达式提取纯邮箱部分,剔除附带的GUID信息。

额外问题:未定义的$cnt变量

原脚本中$cnt变量未初始化,导致日志查询时间范围计算错误,需修正为合理的时间范围逻辑。


修改后的完整脚本

$Appid = "Appid"
$PSWord = ConvertTo-SecureString -String "APPSecret" -AsPlainText -Force
$tenantID = "tenantID"
$Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $Appid,$PSWord
Connect-AzAccount -Credential $Credential -Tenant $tenantID -ServicePrincipal -Subscription "SubID"
Set-AzContext -Tenant $tenantID -Subscription "SubID"

$resources = Get-AzResource
$currentTime = Get-Date
# 设置日志查询时间范围为最近7天(覆盖大部分资源创建记录)
$startTime = $currentTime.AddDays(-7)
$endTime = $currentTime

$resources.foreach{
    $resource = $_
    # 检查是否缺少createdBy或createdTime标签
    if (-not $resource.Tags.ContainsKey("createdBy") -or -not $resource.Tags.ContainsKey("createdTime")) {
        # 获取资源创建时间
        $creationTime = $null
        # 优先从资源Properties中提取CreatedTime
        if ($resource.Properties.CreatedTime) {
            $creationTime = $resource.Properties.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss")
        }
        else {
            # 若Properties中无创建时间,从Activity Log找创建事件
            $createEvent = Get-AzLog -ResourceId $resource.ResourceId -StartTime $startTime -EndTime $endTime |
                           Where-Object {$_.Authorization.Action -like "*/write*" -and $_.OperationName.Value -like "*create*"} |
                           Sort-Object EventTimestamp | Select-Object -First 1
            if ($createEvent) {
                $creationTime = $createEvent.EventTimestamp.ToString("yyyy-MM-dd HH:mm:ss")
            }
        }

        # 获取并清理创建者邮箱格式
        $owner = $null
        $callerRecords = Get-AzLog -ResourceId $resource.ResourceId -StartTime $startTime -EndTime $endTime |
                         Where-Object {$_.Authorization.Action -like "*/write*"} |
                         Select-Object -ExpandProperty Caller |
                         Where-Object {$_ -ne $null}
        
        if ($callerRecords) {
            # 取出现次数最多的调用者
            $topCaller = $callerRecords | Group-Object | Sort-Object Count -Descending | Select-Object -First 1 -ExpandProperty Name
            # 提取纯邮箱(去除括号内的GUID)
            if ($topCaller -match "^([^()]+)") {
                $owner = $matches[1].Trim()
            }
            else {
                $owner = $topCaller
            }
        }

        # 仅当获取到有效数据时更新标签
        if ($owner -and $creationTime) {
            # 初始化空标签集合,避免报错
            if (-not $resource.Tags) {
                $resource.Tags = @{}
            }
            $resource.Tags["createdBy"] = $owner
            $resource.Tags["createdTime"] = $creationTime
            $resource | Set-AzResource -Force
        }
    }
}

关键修改点说明

  • 时间范围修正:移除未定义的$cnt变量,直接设置查询最近7天的Activity Log,确保覆盖资源创建记录。
  • 创建时间获取逻辑优化:优先从资源自身Properties提取创建时间,失败则从Activity Log的创建事件中获取,提升可靠性。
  • 创建者格式清理:通过正则表达式提取纯邮箱地址,剔除附带的GUID信息。
  • 标签存在性检查优化:分别检查两个标签是否存在,避免遗漏仅缺少其中一个标签的资源。
  • 空标签处理:初始化空标签集合,避免因资源无标签导致的添加标签报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:52:37