如何在PowerShell中合并不同对象的ID与DisplayName?
解决用户ID与DisplayName匹配合并的最佳实现方式
核心思路
用**哈希表(Hashtable)**建立用户ID到DisplayName的映射关系,实现O(1)的查询效率,避免多次遍历用户列表,尤其是数据量较大时能显著提升处理速度,同时减少Graph API的调用次数。
改造后的完整代码
Connect-MgGraph -Scopes "User.ReadWrite.All", "Group.ReadWrite.All", "EntitlementManagement.ReadWrite.All" Import-Module Microsoft.Graph.Beta.Identity.Governance # 1. 构建用户ID到DisplayName的哈希映射表 $UserHash = @{} Get-MgUser -All | ForEach-Object { $UserHash[$_.Id] = $_.DisplayName } # 2. 读取并预处理资源角色数据 $ResourceRoles = Get-MgBetaEntitlementManagementAccessPackageAssignmentResourceRole <#-- -all --#> | Select-Object OriginId, OriginSystem, Status $ResourceRoles | Export-Csv 'C:\ResourceRolesBefore.csv' -NoTypeInformation $ResourceRoles_trim = $ResourceRoles.OriginId -split ',\s*' | ForEach-Object Trim # 3. 生成包含DisplayName的输出对象 $OutputFile = $ResourceRoles_trim | ForEach-Object { $Type,$ResourceRole,$Target = $_ -split '_' # 通过哈希表快速匹配DisplayName,无匹配时显示兜底文本 $displayName = if ($UserHash.ContainsKey($Target)) { $UserHash[$Target] } else { "未找到用户" } [pscustomobject]@{ "Role" = $Type "ResourceRole Objectid" = $ResourceRole "Target Objectid" = $Target "Target DisplayName" = $displayName } } # 4. 导出最终结果到CSV $OutputFile | Export-Csv 'C:\ResourceRoles.csv' -NoTypeInformation
关键说明
- 哈希表优势:一次性加载所有用户数据到哈希表,后续匹配无需重复调用Graph API,既提升效率又降低API请求开销。
- 匹配逻辑:通过
$UserHash[$Target]直接获取对应用户名,若目标ID不存在于用户列表中,会显示"未找到用户"作为兜底。 - 输出设计:保留原
Target Objectid列的同时新增Target DisplayName列,兼顾原始数据的可追溯性和可读性。
可选调整
如果不需要保留Target Objectid列,可直接移除该字段,修改后的对象定义如下:
[pscustomobject]@{ "Role" = $Type "ResourceRole Objectid" = $ResourceRole "Target DisplayName" = $displayName }
内容的提问来源于stack exchange,提问作者vipfafen
相关产品推荐
相关产品推荐

