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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:19:56