AzureAD(EntraID)非本地非来宾闲置用户监控脚本无结果求助
问题解决与修正脚本
核心问题分析
你的脚本无返回结果主要有三个原因:
- 空值判断错误:PowerShell中空值是
$null而非未定义的$none,原条件永远不成立 - 属性未主动获取:
Get-MgUser默认不返回SignInActivity和OnPremisesImmutableId,导致筛选时无法读取这些字段 - 闲置用户逻辑不全:未覆盖从未登录过的原生用户场景
修正后的脚本
# 预设闲置天数阈值 $inactiveDays = 180 $cutoffDate = (Get-Date).AddDays(-$inactiveDays) # 获取包含必要属性的用户数据,显式指定属性确保能读取到同步标识和登录记录 $users = Get-MgUser -All -Select UserPrincipalName, UserType, OnPremisesImmutableId, SignInActivity | Where-Object { # 筛选Azure原生用户:本地同步用户会有OnPremisesImmutableId,原生用户为空 $_.OnPremisesImmutableId -eq $null -and # 排除来宾用户 $_.UserType -ne "Guest" -and # 筛选闲置用户:超过180天未登录,或从未登录过 ($_.SignInActivity.LastSignInDateTime -lt $cutoffDate -or $_.SignInActivity -eq $null) } # 格式化输出结果,增加同步状态标识 $users | Select-Object UserPrincipalName, @{Name="是否本地同步"; Expression={if($_.OnPremisesImmutableId){$true}else{$false}}}, @{Name="最后登录时间"; Expression={if($_.SignInActivity){$_.SignInActivity.LastSignInDateTime}else{"从未登录"}}}
关键说明
- 用OnPremisesImmutableId识别原生用户:本地AD同步的用户会被填充该属性(对应本地AD对象的objectGUID),Azure原生用户此属性为空,比
OnPremisesSyncEnabled更可靠,避免属性为空的问题 - 显式指定-Select参数:必须主动指定要获取的属性,否则
Get-MgUser不会返回登录活动和同步标识数据,导致筛选条件失效 - 覆盖从未登录的场景:部分原生用户可能从未登录,
SignInActivity会为空,这类用户也属于闲置范畴,需要加入筛选逻辑 - 权限要求:运行脚本需拥有MgGraph的
User.Read.All(读取用户信息)和AuditLog.Read.All(读取登录记录)权限
内容的提问来源于stack exchange,提问作者29yannic
相关产品推荐
相关产品推荐

