使用PowerShell统计多公司Azure AD租户下各公司SKU许可证数量
Azure AD 多公司许可证聚合统计方案
你现有脚本已经拿到了用户和许可证的对应明细,只需要加分组统计逻辑就能直接输出各公司各SKU的计数结果,顺便把原脚本的两个问题一起修复:
- 原写法循环每个SKU都会拉取一次全量用户,租户用户数多的时候执行效率极低
- 原写法用
-Match匹配SkuId存在字符串误判风险,可能统计到错误的许可证
可直接使用的优化后脚本
# 初始化明细结果列表 $Report = [System.Collections.Generic.List[Object]]::new() # 一次性拉取所有已订阅SKU,构建ID到名称的哈希映射表,避免重复查询 $SkuMap = @{} Get-AzureADSubscribedSku | ForEach-Object { $SkuMap[$_.SkuId] = $_.SkuPartNumber } # 一次性拉取全量用户的必要字段,不需要每个SKU重复拉取 $AllUsers = Get-AzureADUser -All $True | Select-Object DisplayName, UserPrincipalName, CompanyName, Country, AssignedLicenses Write-Host "开始遍历用户许可证分配关系" ForEach ($User in $AllUsers) { # 跳过未分配任何许可证的用户 if (-not $User.AssignedLicenses) { continue } # 遍历用户实际持有的所有许可证,不存在匹配误差 ForEach ($AssignedSku in $User.AssignedLicenses) { $ReportLine = [PSCustomObject] @{ User = $User.DisplayName UPN = $User.UserPrincipalName Companyname = $User.Companyname Country = $User.Country SKU = $AssignedSku.SkuId SKUName = $SkuMap[$AssignedSku.SkuId] } $Report.Add($ReportLine) } } # 按公司、SKU维度分组聚合,自动统计分配数量 $AggregatedReport = $Report | Group-Object -Property Companyname, SKU, SKUName | ForEach-Object { $GroupInfo = $_.Name -split ', ' [PSCustomObject]@{ Companyname = $GroupInfo[0] SKU = $GroupInfo[1] SKUName = $GroupInfo[2] Amount = $_.Count } } | Sort-Object Companyname, SKUName # 控制台输出格式化结果 $AggregatedReport | Format-Table -AutoSize # 可选:可视化窗口查看 # $AggregatedReport | Out-GridView # 可选:导出为CSV文件用于账单核算 # $AggregatedReport | Export-Csv -Path ".\公司许可证统计.csv" -NoTypeInformation -Encoding UTF8
核心逻辑说明
聚合计数完全依赖PowerShell内置的Group-Object命令实现,不需要手动逐行计数:指定Companyname、SKU、SKUName三个属性作为分组维度后,每个分组下的条目数Count就是对应公司对应SKU的总分配量,输出结构和你给出的预期示例完全一致。
注意:如果统计结果中出现公司名为空的分组,说明对应用户的
Companyname属性未填写,补全用户属性后统计结果就会准确。
内容的提问来源于stack exchange,提问作者Elly
相关产品推荐
相关产品推荐

