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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:18:44