Get-ADUser检查是否存在冲突的proxyAddresses

时间:2018-05-14 20:31:21

标签: powershell

目前我有一个创建用户帐户的脚本。

注意:并非所有用户都拥有相同的UPN(UserPrincipalName)

用户帐户采用以下格式:<firstinit><lastname>

如果出现这种情况,则格式将更改为:<firstinit><middleinit><lastname>

最近,我遇到了用户proxyAddress与现有用户冲突的问题。这是一个问题,因为AD不会抓住这个。

问题:

如果未包含在过滤器中,则检查每个AD-User的代理地址非常耗时。但是,在过滤器中包含proxyAddresses时,结果会不一致。我假设这是因为proxyAddresses属性是一个数组。

不一致

Import-Module ActiveDirectory
$FirstLast = "jrider@ChuckNorrisKills.com"

$conflictCheck = Get-ADUser -Properties mail, proxyAddresses -Filter "mail -eq '$FirstLast' -or UserPrincipalName -eq '$FirstLast' -or proxyAddresses -eq `"smtp:'$FirstLast'`"" | measure
if($conflictCheck.Count -gt 0)
{
    Write-Host "New user conflicts with existing user" -ForegroundColor Red 
}

我想出了一个可以解决我问题的解决方案。不幸的是,这很慢(预期):

Import-Module ActiveDirectory
function Test-NewADUser
{    
    Param(
        [Parameter(Mandatory=$true)][string]$firstname, 
        [Parameter(Mandatory=$true)][string]$lastname,         
        [Parameter(Mandatory=$false)][string]$middle        
    )    
    [bool]$proxExsists = $false

    $domain = '@chuckNorrisKills.com'    
    $FirstLast = $firstname.Substring(0,1)+$lastname+$domain
    Get-ADUser -Filter * -Properties proxyAddresses | foreach {
            #xpand the proxy address and iterate through it
            foreach($address in $_.proxyAddresses)
            {
                #As you can see this goes through every user
                Write-Host "Address: " $address -ForegroundColor Yellow                
                if($address -eq "smtp:$FirstLast")
                {
                    Write-Host "Found Conflict" -ForegroundColor Red
                    $proxExsists = $true
                }
            }            
        }   
}

Test-NewADUser -firstname jack -lastname Rider

问题(S):

  1. 有没有办法展开proxyAddresses并检查-Filter中的冲突?
  2. 如果没有,我应该打扰乔布斯,还是另一种检查冲突的方式?
  3. 提前感谢您的任何帮助

1 个答案:

答案 0 :(得分:2)

您无需展开它,因为proxyAddress过滤器应该可靠。

所以,这应该非常简单:

function Validate-proxyAddress($email)
{

    if (Get-ADUser -Filter "proxyAddresses -eq 'smtp:$email'")
    {
        return $true
    }
    elseif (Get-ADUser -Filter "mail -eq '$email'")
    {
        return $true
    }
    elseif (Get-ADUser -Filter "UserPrincipalName -eq '$email'")
    {
        return $true
    }

    return $false
}

或者你可以加入一个像你的代码一样,没有测试它,所以如果你弄错了,用户不存在,应该可以继续......

另外,如果需要,可以使用-like代替-eq(如果某种方式错过了smtp前缀):

"proxyAddresses -like '*$email*'"