如何使用Get-MgUser报告用户登录活动及直属经理信息
解决PowerShell + Microsoft Graph 用户登录活动与经理信息报告问题
核心优化思路
由于Microsoft Graph无法在单次查询中同时返回用户、经理和登录活动数据,单用户循环查询会导致API调用量过大、速度缓慢。优化方案聚焦于批量与并行处理:
- 批量拉取目标用户集合
- 并行查询用户经理信息(缩减等待时长)
- 批量获取登录活动记录后与用户匹配
- 整合数据生成结构化报告
完整优化脚本
# 1. 初始化模块与权限(需预先安装Microsoft Graph模块:Install-Module Microsoft.Graph) Connect-MgGraph -Scopes "User.Read.All", "AuditLog.Read.All" # 2. 获取目标用户集合(示例:所有启用用户,可按需修改过滤条件) $users = Get-MgUser -Filter "AccountEnabled eq true" -Select Id, UserPrincipalName, DisplayName -All # 3. 并行获取用户经理信息(大幅提升查询效率) $userManagers = $users | ForEach-Object -Parallel { $userId = $_.Id try { $manager = Get-MgUserManager -UserId $userId -ErrorAction Stop [PSCustomObject]@{ UserId = $userId ManagerDisplayName = $manager.DisplayName ManagerUPN = $manager.UserPrincipalName } } catch { # 处理无经理的场景 [PSCustomObject]@{ UserId = $userId ManagerDisplayName = "无直属经理" ManagerUPN = "" } } } -ThrottleLimit 10 # 调整并发数,避免触发API限流 # 4. 批量获取最近30天的登录活动记录(可修改时间范围) $startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ssZ") $signIns = Get-MgAuditLogSignIn -Filter "CreatedDateTime ge $startDate" -Select Id, UserId, UserPrincipalName, SignInDateTime, SignInType -All # 5. 合并用户、经理、登录活动数据 $report = foreach ($user in $users) { # 匹配当前用户的经理信息 $manager = $userManagers | Where-Object UserId -eq $user.Id # 匹配当前用户的交互式/非交互式最近登录记录 $userSignIns = $signIns | Where-Object UserId -eq $user.Id $lastInteractive = $userSignIns | Where-Object SignInType -eq "interactive" | Sort-Object SignInDateTime -Descending | Select-Object -First 1 $lastNonInteractive = $userSignIns | Where-Object SignInType -eq "non-interactive" | Sort-Object SignInDateTime -Descending | Select-Object -First 1 # 构造报告对象 [PSCustomObject]@{ UserDisplayName = $user.DisplayName UserUPN = $user.UserPrincipalName ManagerDisplayName = $manager.ManagerDisplayName ManagerUPN = $manager.ManagerUPN LastInteractiveLogin = if ($lastInteractive) { $lastInteractive.SignInDateTime } else { "无记录" } LastNonInteractiveLogin = if ($lastNonInteractive) { $lastNonInteractive.SignInDateTime } else { "无记录" } } } # 6. 输出报告(可导出为CSV:$report | Export-Csv -Path "UserLoginReport.csv" -NoTypeInformation -Encoding UTF8) $report | Format-Table -AutoSize
关键问题修复说明
- 经理信息显示异常:
- 通过
Get-MgUserManager明确获取经理的DisplayName和UPN,同时捕获无经理的异常场景,避免空值导致的显示问题。
- 通过
- 登录时间变量赋值错误:
- 直接从登录活动记录的
SignInDateTime属性取值,增加空值判断,避免因无登录记录导致的变量异常。
- 直接从登录活动记录的
- 查询速度过慢:
- 用
ForEach-Object -Parallel并行查询经理信息,减少单线程等待时间; - 批量拉取登录活动记录,避免循环单用户查询登录数据;
- 设置
-ThrottleLimit控制并发数,规避Microsoft Graph的API限流机制。
- 用
注意事项
- 确保安装最新版Microsoft Graph PowerShell模块:
Update-Module Microsoft.Graph - 根据实际需求调整用户过滤条件(
Get-MgUser的-Filter参数)和登录时间范围($startDate) - 若用户量极大,可拆分用户分批处理,进一步降低API负载
内容的提问来源于stack exchange,提问作者Bradley
相关产品推荐
相关产品推荐

