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

如何用Where-Object过滤AzureAD登录日志中的嵌套设备ID数据?

解决Azure AD登录日志嵌套设备ID筛选问题

问题核心原因

你遇到的筛选失效,主要是两个常见问题:

  1. 部分登录日志可能没有DeviceDetail属性(比如非设备发起的登录),直接访问$_.DeviceDetail.DeviceId会触发空引用错误,导致有效数据被跳过
  2. PowerShell默认字符串比较区分大小写,若日志中设备ID大小写与你传入的不一致,会匹配失败

解决方案1:本地过滤时处理空值与大小写

修改Where-Object逻辑,先排除无设备信息的日志,再进行设备ID匹配,可选启用不区分大小写比较:

$DeviceId = "123456789-1234-1234-1234-123123123123"
Get-AzureAdAuditSigninLogs -Filter "appdisplayname eq 'Windows Sign In'" | 
    Where-Object { $_.DeviceDetail -ne $null -and $_.DeviceDetail.DeviceId -ieq $DeviceId } | 
    Select-Object UserDisplayName
  • -ieq实现不区分大小写匹配,避免大小写差异导致的匹配失败
  • 先判断$_.DeviceDetail -ne $null,彻底规避空引用错误

解决方案2:API端直接筛选(更高效)

Azure AD的OData查询支持嵌套属性筛选,直接在Get-AzureAdAuditSigninLogs的-Filter参数中指定设备ID,减少本地数据处理量,大幅提升效率:

$DeviceId = "123456789-1234-1234-1234-123123123123"
Get-AzureAdAuditSigninLogs -Filter "appdisplayname eq 'Windows Sign In' and deviceDetail/deviceId eq '$DeviceId'" |
    Select-Object UserDisplayName
  • OData中嵌套属性用斜杠/而非点.
  • 字符串类型的设备ID必须用单引号包裹

多设备ID批量处理(foreach循环场景)

如果是遍历设备ID列表,可将API筛选逻辑直接嵌入循环:

# 定义设备ID列表
$deviceIds = @(
    "123456789-1234-1234-1234-123123123123",
    "987654321-4321-4321-4321-321321321321"
)

foreach ($deviceId in $deviceIds) {
    Write-Host "查询设备 [$deviceId] 的登录记录:"
    Get-AzureAdAuditSigninLogs -Filter "appdisplayname eq 'Windows Sign In' and deviceDetail/deviceId eq '$deviceId'" |
        Select-Object UserDisplayName, CreatedDateTime, @{Name='DeviceId'; Expression={$_.DeviceDetail.DeviceId}}
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:37:55