Powershell和Exchange:检测何时不需要更改值

问题描述

我正在构建用于使用Powershell在AD和Exchange中处理用户重命名的工具。

我有一部分脚本用于根据提供的信息来构建适当的UPN / PrimarySMTPAddress值,该信息检查是否与其他AD用户对象中的值发生冲突,并返回可用和适当的值供脚本使用。

解决以下情况:从脚本中较早收集的新值生成的UPN / PrimarySMTPAddress可能导致新提议的UPN与当前值相同,脚本的当前方法是简单地找到下一个可用的适当UPN,不够好。

解决此问题,我添加一个简单的If检查以查看生成的UPN值是否与当前AD用户对象的UPN相同,但这失败了,我不确定为什么。

这是我当前的完整代码,试图捕获重复的代码

$UPNGivenname是名字,仅包含字母和破折号。
$UPNSurname是提供的姓氏(仅字母字符和破折号)。
$SMTPDomain是域电子邮件后缀:例如 @ contoso.com
$UserAdUpn从目标AD对象的UniversalPrincipalName中拉出。在脚本的前面,我已经确认找到了有效的AD对象,并将其UniversalPrincipalName值直接拉到$ UserAdUpn中。

If ($ChangeUPN -eq 'Y') {
    $ProposedUPNBase = $UPNGivenname + "." + $UPNSurname
    $checkNewUPNDupe = "$ProposedUPNBase$SMTPDomain"

    If ($UserAdUpn -eq $checkNewUPNDupe) {
        # Generated UPN matches current UPN
        Write-Host "New UPN matches current UPN. No change."
        $ChangeUPN = 'N'
    }
    Else {

#...循环进行疯狂的UPN检查/创建。不相关

    }
}

编辑:(我本来应该考虑包括的东西)

错误:即使我知道当前的UPN和建议的UPN相同,重复检查也不会触发,并且会创建新的UPN。

在上面添加了有关UserAdUpn来源的信息。

解决方法

也许是因为没有找到您要用Get-Mailbox测试的地址而导致流血的红色错误。您可以仅将-ErrorAction SilentlyContinue添加到该命令。仍然可以在布尔值评估中使用。

If ($ChangeUPN -eq 'Y') {
    $ProposedUPNBase = $UPNGivenName + "." + $UPNSurname
    $checkNewUPNDupe = "$ProposedUPNBase$SMTPDomain"

    If ($UserAdUpn -eq $checkNewUPNDupe) {
        # Generated UPN matches current UPN
        Write-Host "New UPN matches current UPN. No change."
        $ChangeUPN = 'N'
    }
    Else {
        # Check for and select available UPN
        Write-Host "Finding avaialble appropriate UPN"
        $i = 0
        While (1) {
            # Check if i is >=1
            If ($i) {
                # Update username with number
                $testProposedUPN = "$ProposedUPNBase$i$SMTPDomain"
            }
            Else {
                # Otherwise,check base username (no number)
                $testProposedUPN = "$ProposedUPNBase$SMTPDomain"
            }
            # Check if user exists
            If ( (Get-ADUser -Filter { EmailAddress -eq $testProposedUPN -or  UserPrincipalName -eq $testProposedUPN }) -or 
                (get-mailbox $testProposedUPN -ErrorAction SilentlyContinue )) 
            {   # If so,increment the number and re-loop
                $i++
            }
            Else { 
                # Otherwise,update ProposedUPN to the non-existant user
                $NewUPN = $testProposedUPN
                # Exit the loop
                break
            }
        }
    }
}

我还通过在过滤器中使用Get-ADUser简化为1条-or命令。此代码在我的环境中测试良好。

,

希望您能体会到难以理解的措辞。检查两件事是否相等仅仅是一个问题,如果以后的代码正在寻找“潜在的”重复,我不会称之为重复检查。即使后来的代码也可以防止重复,然后再进行检查。

无论如何,-eq运算符会使您失败的唯一方法是,如果操作数确实不同。如果检查时不明显,则可能是编码问题。我曾经度过漫长的夜晚,-eq看起来好像失败了,但是我最终意识到其中一个值的Unicode长破折号看上去与控制台中的常规破折号相同。阴暗的记忆,但我认为我是通过将字符转换为数字并通过肉眼检查结果来隔离它的。类似于:[Int[]][Char[]]$var

我认为比较只是在某些时候失败了。我认为您需要仔细查看两个未按预期比较的值。

,

这首先是PEBKAC错误,如果您愿意,则为ID10T。

我的想法一直停留在将“ UPN”读为“通用主体名称”,而实际上是“用户主体名称”,当我使用该错误术语尝试构建小检查脚本时,错误就开始了,当然,它永远不会注册匹配的值,因为它正在寻找一个不存在的值。

一旦我将$UserAdUpn的来源更正为UserPrincipalName值,它就可以正常工作。

谢谢您的努力,史蒂文。我很感谢他们。