如何用PowerShell准确获取Azure AD中90天未登录的活跃用户?
准确筛选Azure AD中90天未登录的活跃用户
你的脚本问题出在两方面:一是AzureAD模块已被微软弃用,它返回的SignInActivity.DateTime数据准确性和时效性都差;二是没处理那些从未登录过的用户(这类用户的SignInActivity会是空值,会被误判为符合条件)。
改用Microsoft Graph PowerShell模块能解决这个问题,它能获取更精准的用户登录数据。以下是可行的操作方案:
操作步骤与脚本
- 首次运行需安装并导入Microsoft Graph模块:
Install-Module Microsoft.Graph -Force -AllowClobber Import-Module Microsoft.Graph.Users, Microsoft.Graph.Reports
- 连接到Microsoft Graph,需要
User.Read.All和AuditLog.Read.All权限:
Connect-MgGraph -Scopes "User.Read.All", "AuditLog.Read.All"
- 查询并筛选符合条件的用户:
# 定义90天前的UTC时间点(避免时区误差) $90DaysAgo = (Get-Date).AddDays(-90).ToUniversalTime() # 获取所有启用的用户,包含最近登录时间字段 $activeUsers = Get-MgUser -All:$true -Filter "accountEnabled eq true" -Property DisplayName, UserPrincipalName, UserType, CreationType, LastSignInDateTime # 筛选90天未登录的用户:要么最近登录早于90天前,要么从未登录过 $inactiveUsers = $activeUsers | Where-Object { ($_.LastSignInDateTime -lt $90DaysAgo) -or ($null -eq $_.LastSignInDateTime) } | Select-Object DisplayName, UserPrincipalName, UserType, CreationType, @{Name="LastSignInDateTime"; Expression={$_.LastSignInDateTime}} $inactiveUsers
关键说明
LastSignInDateTime是UTC时间,必须转成UTC再比较,否则会出现时区偏差- 微软的登录数据最多有7天延迟,刚登录的用户可能不会立刻更新该字段
- 如果不需要包含从未登录过的用户,把筛选条件改成
($_.LastSignInDateTime -lt $90DaysAgo) -and ($null -ne $_.LastSignInDateTime)
内容的提问来源于stack exchange,提问作者Confuseis
相关产品推荐
相关产品推荐

