PowerShell Get-AzureADAuditSignInLogs多条件筛选报无效筛选子句问题
问题根因
报错和无法匹配未登录用户的问题来自两处逻辑错误:
Get-AzureADAuditSignInLogs对应的Azure AD审计登录日志接口,只会返回实际发生过的登录事件记录,从未产生登录行为的用户不会在该日志表中存在任何条目,不可能通过在日志查询的筛选条件中加空值判断匹配到这类用户- 你写的筛选子句
CreatedDateTime eq '$null'本身不符合接口要求的OData筛选语法:$null被单引号包裹后会被识别为普通字符串而非空值,直接触发「Invalid filter clause」错误;即便写对空值筛选语法,也会因为日志中不存在对应用户行,无法返回目标结果。
正确实现代码
不需要强行修改日志接口的筛选逻辑,正确思路是先拿到全量全局管理员列表,逐个查询其最新登录记录,若查询不到结果则手动标记为「从未登录」即可,可直接运行的代码如下:
# 执行前请先安装Azure AD模块:Install-Module AzureAD Connect-AzureAD # 获取全局管理员角色对象 $globalAdminRole = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq 'Global Administrator'} # 拉取所有全局管理员成员,过滤掉服务主体、组等非用户对象 $globalAdmins = Get-AzureADDirectoryRoleMember -ObjectId $globalAdminRole.ObjectId | Where-Object ObjectType -eq 'User' | Select-Object DisplayName, UserPrincipalName # 初始化结果集 $signInResult = @() foreach ($admin in $globalAdmins) { # 查询该用户最新的1条登录记录,不需要加空值筛选条件 $latestLog = Get-AzureADAuditSignInLogs -Filter "UserPrincipalName eq '$($admin.UserPrincipalName)'" -Top 1 | Select-Object -First 1 # 组装单用户结果 $signInResult += [PSCustomObject]@{ 显示名称 = $admin.DisplayName 用户主体名 = $admin.UserPrincipalName 最后登录时间 = if ($latestLog) { $latestLog.CreatedDateTime } else { "从未登录" } } } # 控制台输出结果,需要导出CSV可取消下一行注释 $signInResult | Format-Table -AutoSize # $signInResult | Export-Csv -Path ".\全局管理员最后登录时间.csv" -NoTypeInformation -Encoding UTF8
补充注意事项
- Azure AD免费版的审计登录日志默认仅保留30天,Premium P1/P2版本最长也仅保留有限周期的历史日志,如果用户最后一次登录时间超出日志保留范围,上述代码也会将其标记为「从未登录」
- 如果需要获取不受日志保留期限制的准确最后登录时间,可以改用Microsoft Graph模块读取用户属性自带的
signInActivity.lastSignInDateTime字段,该字段直接存储用户账号维度的最后登录时间,不需要遍历审计日志。
内容的提问来源于stack exchange,提问作者overflowed
相关产品推荐
相关产品推荐

