Powershell ForEach对象更改SearchUnifiedAuditLog的结果

Powershell ForEach对象更改SearchUnifiedAuditLog的结果,powershell,azure-active-directory,foreach-object,Powershell,Azure Active Directory,Foreach Object,我有一个powershell脚本来检索来宾用户的最新登录。它很好用。 (基于) 产出如预期: User user1@external.com#EXT#@tenant.onmicrosoft.com | Last Login Date - user1@external.com#EXT#@tenant.onmicrosoft.com User user2@external.com#EXT#@tenant.onmicrosoft.com | Last Login Date - 11/04/202

我有一个powershell脚本来检索来宾用户的最新登录。它很好用。 (基于)

产出如预期:

User user1@external.com#EXT#@tenant.onmicrosoft.com  | Last Login Date - 
user1@external.com#EXT#@tenant.onmicrosoft.com
User user2@external.com#EXT#@tenant.onmicrosoft.com  | Last Login Date - 11/04/2020 12:02:12 
user2@external.com#EXT#@tenant.onmicrosoft.com
...
User userNNNN@external.com#EXT#@tenant.onmicrosoft.com  | Last Login Date - 12/04/2020 14:22:25
userNNNN@external.com#EXT#@tenant.onmicrosoft.com
...
find_last_login_date中的额外写入输出仅用于调试

现在,当我把它改为ForEach对象时,它会做一些奇怪的事情。也许这对专家来说是有意义的,但对我来说不是

替换

ForEach($externalUser in $allExternalUsers) {
    find_last_login_date($externalUser)
}

输出变成

User userX@external.com#EXT#@tenant.onmicrosoft.com | Last Login Date - 10/01/2021 14:05:36 05/01/2021 20:48:45 05/01/2021 16:09:25 04/01/2021 07:36:26 22/12/2020 08:01:07 19/12/2020 10:24:08 18/12/2020 14:20:51 18/12/2020 08:05:55 16/12/2020 17:32:28 14/12/2
020 08:20:56 13/12/2020 07:58:13 11/12/2020 10:58:58 10/12/2020 08:08:28
user1@external.com#EXT#@tenant.onmicrosoft.com
user2@external.com#EXT#@tenant.onmicrosoft.com
...
userNNNN@external.com#EXT#@tenant.onmicrosoft.com
...
因此,它似乎会触发脚本只查找最后一次登录日期,并且选择Top1失败,等等

知道我做错了什么吗?起初,我认为这是关于“嵌套”ForEach对象的,但即使有代码在函数中进行搜索,它也会一直这样做。 默认情况下是并行工作吗?我是否需要等待所有任务的完成?有什么事吗

我正在研究ForEach对象来并行化上述脚本,因为在大型租户上运行需要很长时间。

来自:

将InputObject参数用于ForEach对象时,将InputObject值视为单个对象,而不是将命令结果管道化到ForEach对象。即使该值是命令(如-InputObject(Get Process))的结果集合,也是如此。由于InputObject无法从数组或对象集合返回单个属性,因此,如果使用ForEach对象对定义属性中具有特定值的对象的对象集合执行操作,建议在管道中使用ForEach对象

改变

ForEach-Object -InputObject $allExternalUsers {
    find_last_login_date($_)
}
进入

发件人:

将InputObject参数用于ForEach对象时,将InputObject值视为单个对象,而不是将命令结果管道化到ForEach对象。即使该值是命令(如-InputObject(Get Process))的结果集合,也是如此。由于InputObject无法从数组或对象集合返回单个属性,因此,如果使用ForEach对象对定义属性中具有特定值的对象的对象集合执行操作,建议在管道中使用ForEach对象

改变

ForEach-Object -InputObject $allExternalUsers {
    find_last_login_date($_)
}
进入


ForEach对象-InputObject$allExternalUsers{…}
->
$allExternalUsers | ForEach对象{…}
谢谢。我一开始是这样做的,但它不起作用,但现在它似乎起作用了:-)
ForEach对象-InputObject$allExternalUsers{…}
->
$allExternalUsers | ForEach对象{…}
谢谢。我一开始是这样做的,但没有起作用,但现在似乎起作用了:-)谢谢。我一开始是这样做的,但它不起作用,但现在它似乎起作用了:-)但在执行$allExternalUsers | ForEach对象时,-Parallel{…}抛出“ForEach对象:无法使用指定的命名参数解析参数集”。啊,看起来它在完全更新的windows 10上还不可用,谢谢。我一开始是这样做的,但它不起作用,但现在它似乎起作用了:-)但在执行$allExternalUsers | ForEach对象时,-Parallel{…}抛出“ForEach对象:无法使用指定的命名参数解析参数集”。啊,看起来它在完全更新的windows 10上还不可用
ForEach-Object -InputObject $allExternalUsers {
    find_last_login_date($_)
}
$allExternalUsers | ForEach-Object {
    find_last_login_date($_)
}