修改PowerShell脚本实现Microsoft Graph用户去重及SKU列添加
解决Microsoft Graph PowerShell脚本的用户去重与动态SKU列需求
以下是修改后的PowerShell脚本,已实现用户去重和动态添加SKU布尔列的功能:
Connect-MgGraph -Scopes "User.Read.All","Group.ReadWrite.All" -NoWelcome # 获取目标SKU并构建SkuId与SkuPartNumber的映射表 $targetSkus = Get-MgSubscribedSku -All | Where-Object { $_.SkuPartNumber -in ('SKU1', 'SKU2', 'SKU3', 'SKU4', 'SKU5') } $skuMap = @{} $targetSkus | ForEach-Object { $skuMap[$_.SkuId] = $_.SkuPartNumber } # 收集所有拥有目标SKU的用户并去重(用哈希表确保每个用户仅出现一次) $uniqueUsers = @{} foreach ($sku in $targetSkus) { $usersWithSku = Get-MgUser -Filter "assignedLicenses/any(x: x/skuId eq $($sku.SkuId))" ` -Select 'DisplayName', 'Id', 'Mail', 'UserPrincipalName', 'JobTitle', 'AssignedLicenses' ` -All $true foreach ($user in $usersWithSku) { if (-not $uniqueUsers.ContainsKey($user.Id)) { $uniqueUsers[$user.Id] = $user } } } # 生成包含动态SKU布尔列的结果集 $result = foreach ($user in $uniqueUsers.Values) { # 初始化基础属性 $outObject = [ordered]@{ Id = $user.Id DisplayName = $user.DisplayName UserPrincipalName = $user.UserPrincipalName Mail = $user.Mail JobTitle = $user.JobTitle } # 为每个目标SKU添加布尔列 foreach ($skuId in $skuMap.Keys) { $skuName = $skuMap[$skuId] $hasSku = $user.AssignedLicenses.SkuId -contains $skuId $outObject[$skuName] = $hasSku } [pscustomobject]$outObject } Write-Host "Found $($uniqueUsers.Count) unique licensed users." $result
关键改动说明:
用户去重实现:
- 使用哈希表
$uniqueUsers,以用户Id作为唯一键,遍历每个SKU的用户列表时,仅添加未出现过的用户,从根源避免重复。 - 相比事后用
Select-Object -Unique,哈希表去重效率更高,尤其在用户量较大时更明显。
- 使用哈希表
动态SKU布尔列实现:
- 先构建
$skuMap存储SKU ID与名称的对应关系,方便后续快速匹配。 - 在生成结果对象时,遍历所有目标SKU,检查当前用户的
AssignedLicenses中是否包含该SKU ID,动态添加以SKU名称为列名的布尔属性(True表示拥有,False表示未拥有)。 - 当目标SKU列表修改时(比如新增或删除SKU),只需修改
Where-Object中的SkuPartNumber列表,脚本会自动适配列的数量,无需手动调整后续逻辑。
- 先构建
内容的提问来源于stack exchange,提问作者Mayhem
相关产品推荐
相关产品推荐

