使用Microsoft Graph PowerShell生成所有用户的Microsoft许可证分配报告
Microsoft Graph PowerShell生成所有用户的Microsoft许可证分配报告
看起来你已经找对了方向,用Microsoft Graph PowerShell来导出用户和对应的许可证,但脚本里有几个小问题导致输出格式混乱,还出现了多余的PSObject属性。我来帮你修正一下,同时实现你想要的“用户UPN + 对应许可证”的逐行格式。
问题分析
你的原脚本有两个主要问题:
- 多余的嵌套循环:
$x.SkuPartNumber本身就是单个许可证的编号(比如FLOW_FREE),不是数组,所以foreach ($license in $licenses)这个循环完全没必要,反而可能导致无效的对象创建。 - 没有收集结果到集合:你每次创建
$result对象但没有把它们存到一个数组里,导致PowerShell自动输出每个对象时格式混乱,最后还输出了PSObject的元数据。
修正后的脚本
这个脚本会帮你生成清晰的用户-许可证对应列表,还支持导出到CSV方便后续整理:
# 连接到Microsoft Graph,需要足够的权限 Connect-MgGraph -Scopes "User.Read.All" # 方式1:指定测试用户列表 $users = "user1@example.com", "user2@example.com", "user3@example.com", "user4@example.com" # 方式2:获取租户内所有用户(注释掉上面的$users,用下面这行) # $users = Get-MgUser -All | Select-Object -ExpandProperty UserPrincipalName # 创建空数组,用来存储所有报告条目 $licenseReport = @() foreach ($user in $users) { Write-Host "正在处理用户: $user" # 可选:显示当前处理的用户,方便跟踪进度 # 获取该用户的所有许可证详情 $userLicenses = Get-MgUserLicenseDetail -UserId $user # 遍历每个许可证,生成报告条目 foreach ($license in $userLicenses) { $reportEntry = [PSCustomObject]@{ UPN = $user License = $license.SkuPartNumber } # 将条目添加到报告数组 $licenseReport += $reportEntry } } # 输出格式化的报告 Write-Host "`n=== 许可证分配报告 ===" $licenseReport # 可选:将报告导出到CSV文件(替换为你想要的路径) # $licenseReport | Export-Csv -Path "C:\Temp\O365UserLicenses.csv" -NoTypeInformation -Encoding UTF8 # 断开Graph连接 Disconnect-MgGraph
运行效果
执行后你会得到这样的清晰输出:
UPN License --- ------- user1@example.com FLOW_FREE user1@example.com SPE_E5 user2@example.com PBI_PREMIUM_PER_USER_ADDON user2@example.com FLOW_FREE user2@example.com SPE_E5 ...
额外提示
- 如果你的租户用户很多,
Get-MgUser -All会自动处理分页,不用担心遗漏用户。 - 导出CSV时加上
-Encoding UTF8可以避免中文乱码问题(如果你的UPN包含中文)。 - 确保你运行脚本的账号有
User.Read.All权限,否则无法获取所有用户的信息。
备注:内容来源于stack exchange,提问作者Chmmi_Kukot
相关产品推荐
相关产品推荐

