PowerShell中Graph API获取指定组用户及经理信息的优化方法
PowerShell + Microsoft Graph API 脚本优化方案
需求说明
你需要通过Microsoft Graph API获取符合条件的用户(示例中是DisplayName以Joe Bloggs开头),导出Get-MgUser的所有字段,同时在结果末尾追加用户的经理信息、用户所属含VIP关键词的组信息,最终输出为CSV文件。
原脚本存在的问题
- 变量错误:循环中使用未定义的
$CurrentID,实际应引用循环变量$Id.Id - 手动拼接CSV字符串:容易出现格式错误(比如字段含逗号时会乱序),且无法保留Get-MgUser的所有字段
- API请求冗余:逐个用户调用
Get-MgUserMemberOf和Get-MgUserManager,未利用Graph的$expand参数减少请求次数 - Graph连接方式繁琐:手动请求token,可直接使用Microsoft Graph模块的内置认证方式
优化后的脚本
# 检查Microsoft Graph模块是否已安装 if (Get-InstalledModule Microsoft.Graph -ErrorAction SilentlyContinue) { # 配置认证参数 $appId = 'BLAH' $tenantId = 'BLAH' $secret = ConvertTo-SecureString 'BLAH' -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($appId, $secret) # 连接Microsoft Graph(使用客户端凭证流) Connect-MgGraph -ClientCredential $credential -TenantId $tenantId # 若使用正式环境,注释下方beta版本选择 Select-MgProfile -Name 'beta' # 获取用户,同时展开经理信息(减少单独调用Get-MgUserManager的次数) $users = Get-MgUser -Filter "startsWith(DisplayName, 'Joe Bloggs')" -ExpandProperty manager # 初始化结果数组 $results = @() foreach ($user in $users) { # 获取用户所属的VIP组 $vipGroups = Get-MgUserMemberOf -UserId $user.Id | Where-Object { $_.AdditionalProperties['displayName'] -like '*VIP*' } | Select-Object -ExpandProperty AdditionalProperties -Property displayName # 处理多组情况,用逗号分隔组名 $vipGroupNames = $vipGroups.displayName -join ', ' # 处理经理信息:如果有经理则取显示名,否则显示"N/A" $managerName = if ($user.Manager) { $user.Manager.AdditionalProperties['displayName'] } else { "N/A" } # 将用户所有字段转换为自定义对象,追加经理和组信息 $userObj = $user | Select-Object *, @{Name='经理姓名'; Expression={$managerName}}, @{Name='所属VIP组'; Expression={$vipGroupNames}} $results += $userObj } # 导出到CSV(-NoTypeInformation避免添加类型头) $results | Export-Csv -Path 'C:\Temp\Result.csv' -NoTypeInformation -Encoding UTF8 } else { Write-Host "请先安装Microsoft Graph模块:Install-Module Microsoft.Graph -Scope CurrentUser -Force" }
核心优化点
- 简化认证流程:使用
Connect-MgGraph -ClientCredential直接完成客户端凭证认证,无需手动请求token,代码更简洁可靠 - 减少API请求:获取用户时通过
-ExpandProperty manager直接拉取经理信息,避免逐个用户调用Get-MgUserManager - 保留所有用户字段:通过
Select-Object *保留Get-MgUser返回的全部字段,再追加自定义的经理和组字段 - CSV生成更规范:用
Export-Csv替代手动拼接字符串,自动处理特殊字符(如逗号、引号),保证CSV格式正确 - 容错处理:添加经理不存在时的默认值,处理用户属于多个VIP组的场景
- 变量修正:修正原脚本中
$CurrentID的未定义错误,使用正确的循环变量$user.Id
内容的提问来源于stack exchange,提问作者Matthew Ringsell
相关产品推荐
相关产品推荐

