如何通过PowerShell获取Azure RBAC角色分配的被授权用户信息?
获取Azure RBAC角色分配变更中的被授权用户信息
你写的脚本已经能抓到基础的操作记录,但被授予权限的用户/主体信息其实藏在日志条目的Properties字段里——这个字段是序列化的JSON格式,里面包含了请求的详细内容,比如角色分配的目标主体信息。
我帮你调整一下脚本,把这部分关键信息提取出来:
Get-AzureRmLog -StartTime (Get-Date).AddDays(-7) | Where-Object {$_.Authorization.Action -like 'Microsoft.Authorization/roleAssignments/*'} | ForEach-Object { # 解析Properties中的JSON内容,获取请求的详细数据 $requestDetails = $_.Properties | ConvertFrom-Json # 从请求体中提取被授权的主体ID $assignedPrincipalId = $requestDetails.properties.principalId # 根据ID查询主体的名称(兼容AD用户、服务主体等多种类型) $assignedPrincipalName = try { # 优先尝试查询AD用户 (Get-AzureRmADUser -ObjectId $assignedPrincipalId -ErrorAction Stop).UserPrincipalName } catch { try { # 如果不是用户,查询服务主体 (Get-AzureRmADServicePrincipal -ObjectId $assignedPrincipalId -ErrorAction Stop).DisplayName } catch { # 都查不到的话,直接显示ID(比如主体已被删除) $assignedPrincipalId } } # 输出整合后的所有信息 [PSCustomObject]@{ Caller = $_.Caller Resource = $_.Authorization.Scope Action = Split-Path $_.Authorization.Action -Leaf EventTimestamp = $_.EventTimestamp AssignedPrincipalId = $assignedPrincipalId AssignedPrincipalName= $assignedPrincipalName } }
几个关键点说明:
- 解析Properties字段:Azure活动日志的
Properties字段存储的是请求/响应的JSON字符串,必须用ConvertFrom-Json转成可操作的对象,才能提取内部的主体信息。 - 兼容多种主体类型:角色分配的主体可能是AD用户、服务主体甚至安全组,脚本里做了多层查询尝试,确保能拿到最直观的名称;如果主体已被删除查不到,就回退显示ID。
- 权限要求:运行脚本的账号需要有
Microsoft.Authorization/roleAssignments/read权限(读取活动日志),以及Microsoft.AzureAD/users/read、Microsoft.AzureAD/servicePrincipals/read权限(查询主体名称)。
另外,如果是删除角色分配的记录,请求体里可能没有主体信息——这种情况可以从Resource字段最后一段的角色分配ID去查询历史快照,但如果角色分配已经被删除,可能只能拿到主体ID了。
内容的提问来源于stack exchange,提问作者tester81
相关产品推荐
相关产品推荐

