两个AD用户帐户上的Compare-Object

时间:2014-09-19 02:28:09

标签: powershell active-directory comparison

有人可以就PowerShell中的两个ADAccount对象(v2)提供一些建议。

每当我与Compare-Object进行比较时,它只会显示可分辨名称的差异,而不会显示这些帐户字段的差异。

如果没有单独比较我想检查的每个字段的$ ADUser.Modified或$ ADUser.DisplayName等,我不知所措。

有没有办法比较两个帐户中ADUser对象中的每个字段,显示哪些字段不同?

(如果你很好奇......这实际上是用于比较两个同名的帐户,但在不同的域中)

提前致谢。

3 个答案:

答案 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 用户。

作为参数,您只需提供任何有效值,该值也可以被 -IdentityGet-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)

这是比较对象属性的绝佳解决方案:

https://blogs.technet.microsoft.com/janesays/2017/04/25/compare-all-properties-of-two-objects-in-windows-powershell/

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