You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

关键问题修复说明

  1. 经理信息显示异常:
    • 通过Get-MgUserManager明确获取经理的DisplayName和UPN,同时捕获无经理的异常场景,避免空值导致的显示问题。
  2. 登录时间变量赋值错误:
    • 直接从登录活动记录的SignInDateTime属性取值,增加空值判断,避免因无登录记录导致的变量异常。
  3. 查询速度过慢:
    • 用ForEach-Object -Parallel并行查询经理信息,减少单线程等待时间;
    • 批量拉取登录活动记录,避免循环单用户查询登录数据;
    • 设置-ThrottleLimit控制并发数,规避Microsoft Graph的API限流机制。

注意事项

  • 确保安装最新版Microsoft Graph PowerShell模块:Update-Module Microsoft.Graph
  • 根据实际需求调整用户过滤条件(Get-MgUser的-Filter参数)和登录时间范围($startDate)
  • 若用户量极大,可拆分用户分批处理,进一步降低API负载

内容的提问来源于stack exchange,提问作者Bradley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:22:34