如何用Where-Object过滤AzureAD登录日志中的嵌套设备ID数据?
解决Azure AD登录日志嵌套设备ID筛选问题
问题核心原因
你遇到的筛选失效,主要是两个常见问题:
- 部分登录日志可能没有
DeviceDetail属性(比如非设备发起的登录),直接访问$_.DeviceDetail.DeviceId会触发空引用错误,导致有效数据被跳过 - 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
相关产品推荐
相关产品推荐

