比较对象 - 我如何知道哪个是差异对象,哪个是参考对象?

时间:2021-04-09 15:08:41

标签: powershell

我有两个对象,想比较它们以查找在两者中都找到的用户。 在我测试输出之前,下面的内容似乎可以正常工作。我发现虽然返回的用户数是正确的,但实际值却不是。

Compare-Object -ReferenceObject $PilotUsers -DifferenceObject $Leavers -IncludeEqual |
                        Where-Object {$_.sideindicator -eq '=='}

如果我切换 ref 和 diff 对象,我会得到正确的结果。由于我只对两者中的用户感兴趣,因此我不明白它们的设置方式有什么关系。显然,需要了解这在未来的情况下是如何工作的。不幸的是,在线搜索并没有说明这一点。

我的对象创建如下。两者都返回一个具有一个属性的 pscustomobject。

$PilotUsers = Get-aduser -Filter * -Properties memberof |
                Select-Object  samaccountname, memberof | 
                Where-Object {$_.memberof -like "*Licensing_Pilot Users*"}|
                Select-Object @{n='ID'; e={$_.samaccountname}} 

$Leavers = Import-Csv -Path $LeaverFile.FileName |
                Select-Object @{n='ID'; e={$_.payroll.substring(2,5).trimstart('0')}}

请有人解释或指出我正确的方向吗?最终目标是从 AD 组对象中删除在离开者对象中找到的用户。

2 个答案:

答案 0 :(得分:2)

首先,您对 $pilotUsers 的查询效率非常低。查询的正确语法应该是:

$PilotUsers = Get-ADuser -Filter * -Properties MemberOf |
              Where-Object {$_.memberof -like "*Licensing_Pilot Users*"} |
              Select-Object @{n='ID'; e={$_.samaccountname}}

搜索名称为 like Licensing_Pilot Users 的组的直接成员(非递归)的用户的更有效方法是:

$PilotUsers = Get-ADGroup -Filter {Name -like "*Licensing_Pilot Users*"} | Get-ADGroupMember |
              Where-Object {$_.ObjectClass -eq 'user'} |
              Select-Object @{n='ID'; e={$_.samaccountname}}

现在为了进行比较,我假设您从 CSV 文件中获取了 sAMAccountNames 的列表。这是您可以过滤两个变量以找到所需结果的方法。

# To get all pilotUsers that are in leavers
$pilotUsers.ID | Where-Object {$_ -in $leavers.ID}
$pilotUsers.ID.Where({$_ -in $leavers.ID})

# To get all leavers that are in pilotUsers
$leavers.ID | Where-Object {$_ -in $pilotUsers.ID}
$leavers.ID.Where({$_ -in $pilotUsers.ID})

# To get all users that are in both arrays
@(
    $pilotUsers.ID | Where-Object {$_ -in $leavers.ID}
    $leavers.ID | Where-Object {$_ -in $pilotUsers.ID}
) | select -Unique

答案 1 :(得分:0)

您需要指定要用于比较的属性名称,在本例中为 -Property ID:

# Emulating your data sets
$ref = 1..10|Select @{Name='ID';Expression={"$_"}}
$dif = 6..15|Select @{Name='ID';Expression={"$_"}}

# This will return pure nonsense
Compare-Object -ReferenceObject $ref -DifferenceObject $dif -IncludeEqual |
                        Where-Object {$_.sideindicator -eq '=='}

# This will return the results you're expecting
Compare-Object -ReferenceObject $ref -DifferenceObject $dif -IncludeEqual -Property ID |
                        Where-Object {$_.sideindicator -eq '=='}