我将两个Get-ADUser
查询的结果存储在变量中(它们正在查询两个活动目录)。
比较它们以查找特定属性并如果匹配则导出为CSV的最佳方法是什么?我试图通过嵌套的forEach
循环使其工作并与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
}
}
}
答案 0 :(得分:0)
Compare-Object -ReferenceObject $res1 -DifferenceObject $res2 -IncludeEqual -ExcludeDifferent
答案 1 :(得分: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-ADUser
和Select-Object
中使用了它(此思想取自this answer )。如果要添加/删除任何属性,则可能会很有用。您也可以这样:
$props = "samAccountName","displayName","mail"
但这仅适用于多个参数,因此我想明确地将其设置为数组(another helpful answer中对此有更多介绍)。