You need to enable JavaScript to run this app. PowerShell:如何将获取的用户许可列表转换为单个独立字符串
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 03:06:05