我有两个对象,想比较它们以查找在两者中都找到的用户。 在我测试输出之前,下面的内容似乎可以正常工作。我发现虽然返回的用户数是正确的,但实际值却不是。
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 组对象中删除在离开者对象中找到的用户。
答案 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 '=='}