使用Powershell比较2个ActiveDirectory属性

smdnsysy  于 2022-11-29  发布在  Shell
关注(0)|答案(1)|浏览(118)

我的目标是列出属性proxyAddresses包含邮件属性值的所有ADusers。
我的第一步是让所有同时具有这两个值的用户填写:

$ADUser = Get-ADUser -Properties Name,Mail,proxyAddresses -Filter {proxyAddresses -like '*' -and mail -like '*'}

然后我尝试通过一个foreach循环和一个完整的if语句来运行它

$result = foreach ($User in $ADUser){
$proxystring = $User.proxyAddresses
    $Mailstring = $User.Mail

    $Mailstring = $Mailstring.ToString()
                
    if ($proxystring -contains '*$Mailstring*'){

    Write-Host 'läuft'
    }
    
    else{
    
    Write-Output($User).Name

    }
}

在if语句中我尝试

if ($proxystring -contains '*$Mailstring*')
if ($proxystring -contains $Mailstring)
if ($proxystring -like $Mailstring)
if (($proxystring).contains($Mailstring))

正如在代码的主要部分所看到的,我还试图将它传递给一个字符串,因为我认为格式可能是一个问题。
我所看到的每一个变量都只与字符串匹配,而不是与其他变量匹配。
如果有人碰巧知道我的错误是什么,我将不胜感激。

mqkwyuun

mqkwyuun1#

您需要从proxyAddresses中的每个地址中删除前面的SMTP:/smtp:,这样才能正常工作:

$result = :outer foreach ($User in $ADUser){
    foreach($address in $user.proxyAddresses) {
        # remove the leading `smtp:` from each address
        $mail = $address -replace '^smtp:'
        # and compare, if the user's mail was in the `proxyAddresses` array
        if($mail -eq $User.mail) {
            # there is no need to keep checking, we can skip this user
            # and go next
            continue outer
        }
    }
    # if the user's `mail` wasn't found in the `proxyAddresses` array
    # output this user
    $user
}

您也可以使用-notcontains来大大简化上面的代码,但这需要将smtp:前置到用户的mail属性:

$result = foreach ($User in $ADUser){
    if($user.proxyAddresses -notcontains ('smtp:' + $user.mail)) {
        $User
    }
}

相关问题