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
相关产品推荐
相关产品推荐

