Where-Object(或类似的)通过嵌套数据进行过滤?

问题描述 投票:0回答:1
$DeviceId = "123456789-1234-1234-1234-123123123123"
Get-AzureAdAuditSigninLogs -top 1 -filter "appdisplayname eq 'Windows Sign In'" | where-object {$_.DeviceDetail.DeviceID -eq $DeviceID} | select-object userdisplayname

作为较大脚本的一部分,我将 AzureAD 设备 ID 列表拉入 foreach 循环中。然后我想运行上面的命令来仅显示与该设备 ID 匹配的每个设备的详细信息。问题是设备 ID 隐藏在“设备详细信息”下。我想添加一个 where-object 或类似的东西来将 $DeviceID 与 $DeviceDetail.DeviceID 进行比较,但这不起作用。我知道我错过了一些简单的东西,但我并没有真正处理这样的数据。

例如(见下文)

ResourceDisplayName              : Windows Azure Active Directory
ResourceId                       : 00000002-0000-0000-c000-000000000000
AuthenticationMethodsUsed        : {}
Status                           : class SignInStatus {
                                     ErrorCode: 0
                                     FailureReason: Other.
                                     AdditionalDetails: 
                                   }
                                   
DeviceDetail                     : class SignInAuditLogObjectDeviceDetail {
                                     DeviceId: 123456789-1234-1234-1234-123123123123
                                     DisplayName: xxxxxxxxxx
                                     OperatingSystem: Windows
                                     Browser: 
                                     IsCompliant: True
                                     IsManaged: True
                                     TrustType: Azure AD joined
                                   }
                                   
Location                         : class SignInAuditLogObjectLocation {
                                     City: xxxxx
                                     State: xxxxxxx
                                     CountryOrRegion: US
                                   }

在非嵌套数据上,我只能使用 where-object 引用数据属性,但我尝试检索的数据是数组的一部分,因此我无法获取Where-object 来过滤它。

$DeviceId = "123456789-1234-1234-1234-123123123123"
Get-AzureAdAuditSigninLogs -top 1 -filter "appdisplayname eq 'Windows Sign In'" | where-object {$_.DeviceDetail.DeviceID -eq $DeviceID} | select-object userdisplayname
powershell nested expression where-object
1个回答
0
投票

我不确定,但我认为您正在使用 PowerShell 并尝试根据嵌套属性 (

Get-AzureAdAuditSigninLogs
) 过滤
DeviceDetail.DeviceID
的输出。 PowerShell 的
Where-Object
cmdlet 确实是完成此任务的正确工具,但您需要确保正确引用嵌套属性。

在您的情况下,对

DeviceID
属性中的
DeviceDetail
属性的正确引用将是
$_.DeviceDetail.DeviceId
(请注意“DeviceId”中的小写“d”)。 PowerShell 区分大小写,因此使用正确的属性名称大小写至关重要。

这是更正后的代码:

$DeviceId =“123456789-1234-1234-1234-123123123123” Get-AzureAdAuditSigninLogs -Top 1 -Filter“appdisplayname eq 'Windows 登录'”| Where-Object { $_.DeviceDetail.DeviceId -eq $DeviceId } |选择对象 UserDisplayName

确保使用

$_.DeviceDetail.DeviceId
而不是
$_.DeviceDetail.DeviceID
。如果大小写不正确,则无法进行比较。

这应该根据指定的

$DeviceId
过滤结果。如果您仍然遇到问题,您可能需要检查
Get-AzureAdAuditSigninLogs -Top 1 -Filter "appdisplayname eq 'Windows Sign In'"
的输出,以了解您正在使用的数据的结构并确保属性名称正确。

© www.soinside.com 2019 - 2024. All rights reserved.