PowerShell:如何将获取的用户许可列表转换为单个独立字符串
问题根因
你之前循环处理失败的核心原因,是错误将Format-List渲染生成的展示文本,作为了数据处理的源对象。Format-List的输出是专为人工查看设计的格式化字符串,完全丢失了原对象的层级结构,基于文本做循环匹配自然无法稳定提取目标值。
原生对象提取方案(推荐)
Get-MsolUser返回的原生用户对象中,Licenses属性本身是结构化的对象数组,每个数组元素自带AccountSkuId字段,存储格式为租户标识:许可SKU名称,也就是你看到的testmailorg:FLOW_FREE这类值。
注意:所有Format-*系列命令的输出都仅适用于人工查看,不要作为后续逻辑处理的数据源,这类输出会完全丢失原对象的结构化属性,是PowerShell脚本处理中非常常见的踩坑点。
提取时不要把对象管道给Format-List作为中间处理步骤,直接基于原生属性做遍历即可:
- 把获取到的用户对象直接赋值给变量,保留完整结构
- 遍历Licenses数组元素,拆分
AccountSkuId字段的冒号分隔符,取后半段的许可值 - 示例代码:
# 获取保留完整结构的用户对象 $user = Get-MsolUser -UserPrincipalName $UPN # 提取独立许可字符串 $targetLicenses = $user.Licenses | ForEach-Object { # 拆分字符串时最多拆2段,取最后一段即纯许可名 $_.AccountSkuId -split ':',2 | Select-Object -Last 1 } # 输出结果即为你需要的 FLOW_FREE、M365EDU_A3_FACULTY 这类独立值 $targetLicenses
兜底文本解析方案
如果手里只有已经渲染完成的纯文本输出(比如Licenses : {testmailorg:FLOW_FREE, testmailorg:M365EDU_A3_FACULTY}),可以用正则匹配提取目标值,无需复杂循环判断:
$rawOutput = "Licenses : {testmailorg:FLOW_FREE, testmailorg:M365EDU_A3_FACULTY}" # 匹配冒号后到逗号、右大括号之前的文本片段 $targetLicenses = [regex]::Matches($rawOutput, ':(?<LicenseValue>[^,}]+)') | ForEach-Object { $_.Groups['LicenseValue'].Value.Trim() }
其他替代获取方式
- 目前旧版
Msol管理模块已停止官方维护,迁移到Microsoft Graph PowerShell模块后,可直接调用Get-MgUserLicenseDetail接口获取用户许可明细,返回的结构化字段和Msol模块完全兼容,上述提取逻辑可以直接复用。 - 如果需要批量获取多用户的许可信息,不要逐次循环调用
Get-MsolUser,可直接通过Get-MsolUser -All拉取全量用户对象后统一提取,效率远高于单用户遍历。
内容的提问来源于stack exchange,提问作者Callum Taylor
相关产品推荐
相关产品推荐

