有人可以就PowerShell中的两个ADAccount对象(v2)提供一些建议。
每当我与Compare-Object进行比较时,它只会显示可分辨名称的差异,而不会显示这些帐户字段的差异。
如果没有单独比较我想检查的每个字段的$ ADUser.Modified或$ ADUser.DisplayName等,我不知所措。
有没有办法比较两个帐户中ADUser对象中的每个字段,显示哪些字段不同?
(如果你很好奇......这实际上是用于比较两个同名的帐户,但在不同的域中)
提前致谢。
答案 0 :(得分:5)
这应该为您提供属性名称,每个用户拥有的属性以及是否相同或不同。
$user1 = get-aduser Test.User1 -Properties *
$user2 = get-aduser Test.User2 -Properties *
$Usercomparison = @()
$user1.GetEnumerator() | ForEach-Object {
If ($User2.($_.Key) -eq $_.Value)
{
$Comparison = 'Equal'
}
else
{
$Comparison = 'Different'
}
$UserObj = New-Object PSObject -Property ([ordered]@{
Property = $_.Key
User1 = $_.Value
User2 = $User2.($_.Key)
Comparison = $Comparison
})
$UserComparison += $UserObj
}
$UserComparison
答案 1 :(得分:0)
根据之前的回答,我做了一个函数来比较两个 AD 用户。
作为参数,您只需提供任何有效值,该值也可以被 -Identity
的 Get-ADUser
参数接受。 (函数本身会查询 AD 的属性)
-Property
参数可以是任何有效的 AD/ldap 属性,也可以是所有属性的 *
。
由于某些属性的值可能非常长,我建议将结果用管道传输到 Format-List
而不是默认的表输出中。
用法如下:
Compare-ADUser -ReferenceUser <user1> -DifferenceUser <user2>
Compare-ADUser -ReferenceUser <user1> -DifferenceUser <user2> -Property *
Compare-ADUser -ReferenceUser <user1> -DifferenceUser <user2> -Property "City","state","c"
.
Function Compare-ADUser {
[cmdletbinding(SupportsShouldProcess)]
Param(
[parameter(Mandatory = $true)]
[string]$ReferenceUser,
[parameter(Mandatory = $true)]
[string]$DifferenceUser,
[parameter()]
[string[]]$Property
)
begin {}
process {
if ($pscmdlet.ShouldProcess("$ReferenceUser & $DifferenceUser", "Comparing users")) {
$ReferenceUserSplat = @{ Identity = $ReferenceUser }
$DifferenceUserSplat = @{ Identity = $DifferenceUser }
if ($PSBoundParameters.ContainsKey("Property")) {
$ReferenceUserSplat.Properties = $Property
$DifferenceUserSplat.Properties = $Property
}
$ReferenceObject = Get-ADUser @ReferenceUserSplat
$DifferenceObject = Get-ADUser @DifferenceUserSplat
$properties = $ReferenceObject.GetEnumerator() | % { $_.Key }
$properties += $DifferenceObject.GetEnumerator() | % { $_.Key }
foreach ($prop in $properties | Sort | Select -Unique ) {
$ReferenceProperty = $ReferenceObject.($prop)
$DifferenceProperty = $DifferenceObject.($prop)
try {
Remove-Variable comparison -ErrorAction SilentlyContinue
$comparison = Compare-Object -ReferenceObject $ReferenceProperty -DifferenceObject $DifferenceProperty -IncludeEqual -ErrorAction SilentlyContinue
}
catch {
}
finally {
if ( (($comparison.sideindicator -notcontains "<=") -and ($comparison.sideindicator -notcontains "=>")) -and -not
($null -eq $ReferenceProperty -xor $null -eq $DifferenceProperty)) {
$comparison = "Equal"
}
else {
$comparison = "Different"
}
}
[pscustomobject]@{
Property = $prop
Comparison = $comparison
ReferenceUser = $ReferenceProperty
DifferenceUser = $DifferenceProperty
}
}
}
}
end {}
}
答案 2 :(得分:-1)
这是比较对象属性的绝佳解决方案:
Jamie Nelson编写了一个函数来比较2个AD对象的属性。
因此,通过一些额外的逻辑,我们可以轻松完成此操作。首先,我们定义Compare-ObjectProperties函数。该函数将获取任何两个源对象,并获得我们正在比较的两个对象的所有属性名称的唯一列表。这是必要的,因为对象并不总是具有相同的属性集。在这种情况下,我们希望看到其中一个为空值,而另一个为空值。有了唯一的属性名称列表,我们的函数可以通过Compare-Object迭代处理它们,并且仅返回不同的属性。
Function Compare-ObjectProperties { Param( [PSObject]$ReferenceObject, [PSObject]$DifferenceObject ) $objprops = $ReferenceObject | Get-Member -MemberType Property,NoteProperty | % Name $objprops += $DifferenceObject | Get-Member -MemberType Property,NoteProperty | % Name $objprops = $objprops | Sort | Select -Unique $diffs = @() foreach ($objprop in $objprops) { $diff = Compare-Object $ReferenceObject $DifferenceObject -Property $objprop if ($diff) { $diffprops = @{ PropertyName=$objprop RefValue=($diff | ? {$_.SideIndicator -eq '<='} | % $($objprop)) DiffValue=($diff | ? {$_.SideIndicator -eq '=>'} | % $($objprop)) } $diffs += New-Object PSObject -Property $diffprops } } if ($diffs) {return ($diffs | Select PropertyName,RefValue,DiffValue)} } $ad1 = Get-ADUser amelia.mitchell -Properties * $ad2 = Get-ADUser carolyn.quinn -Properties * Compare-ObjectProperties $ad1 $ad2