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

Powershell and Exchange: Detecting When Values Don't Need To Change

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

我使用脚本的一部分来根据提供的信息构建适当的 UPN/PrimarySMTPAddress 值,这些信息检查是否与其他 AD 用户对象中的值冲突,returns 可用且适合脚本使用的值。

考虑到 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 {

#... Loop for crazy UPN checking/creation stuff. Not relevant

    }
}

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

错误:即使我知道当前的 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
            }
        }
    }
}

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

我希望你能体会到措辞难以理解。检查两件事是否相等就是这样,如果后面的代码正在寻找“潜在的”重复项,我不会称之为重复检查。即使是后来的代码也比检查更多的重复预防。

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

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

一开始这是一个 PEBKAC 错误,如果您愿意,可以是 ID10T。

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

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

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