2

我将两个Get-ADUser查询的结果存储在变量中(它们正在查询两个 Active Directory)。

比较它们寻找特定属性并在匹配时导出到 CSV 的最佳方法是什么?我试图让它工作使用嵌套forEach循环并将属性与 an 进行比较,if但它只是将来自两个 AD 的所有结果附加到 csv 中。

我现在不在家,当我到达时我会上传我当前的代码,但在伪代码中是这样的:

$res1 = get-adUser -filter{enabled -eq $true} -Properties     samAccountName, displayname, mail | select-object samAccountName, displayname, mail
$res2 = get-adUser -server ABC -filter{enabled -eq $true} -Properties samAccountName, displayname, mail | select-object samAccountName, displayname, mail

ForEach($u1 in $res1){
  ForEach($u2 in $res2){
    If($u1.mail -eq $u2.mail){
      Write-host $u1.mail $u2.mail
    }
  }
}
4

2 回答 2

0

当您导出相同的属性集时,您可以使用Compare-Object

$props = @("samAccountName","displayName","mail")
$res1 = Get-ADUser -filter 'GivenName -eq "Robert"' -properties $props | Select-Object $props
$res2 = Get-ADUser -filter 'GivenName -like "Rob*"' -properties $props | Select-Object $props
$comp = Compare-Object -ReferenceObject $res1 -DifferenceObject $res2 -IncludeEqual -ExcludeDifferent

默认情况下,Compare-Object显示对象之间的差异,因此您必须包含相同的对象并排除不同的对象。

如果由于某种原因,您不想比较所有可以指定-Property参数的属性,如下所示:

# In that example you you want compare only displayName and mail
# SamAccountName might be different
$comp = Compare-Object -ReferenceObject $res1 -DifferenceObject $res2 -IncludeEqual -ExcludeDifferent -Property displayName,mail

笔记:

您可能已经注意到,我为您的脚本添加了一项改进 - 我将所有属性保存到变量中,然后在Get-ADUserand中使用它Select-Object(想法来自这个答案)。如果您想添加/删除任何属性,它可能会很有用。你也可以这样做:

$props = "samAccountName","displayName","mail"

但这仅适用于多个参数,因此我喜欢明确地将其设为数组(在另一个有用的答案中对此进行了更多介绍)。

于 2019-06-14T07:24:08.243 回答
0
Compare-Object -ReferenceObject $res1 -DifferenceObject $res2 -IncludeEqual -ExcludeDifferent
于 2019-06-14T04:32:32.340 回答