【问题标题】:Powershell and Exchange: Detecting When Values Don't Need To ChangePowershell 和 Exchange:检测何时不需要更改值
【发布时间】:2020-12-21 02:45:25
【问题描述】:

我正在构建一个工具,用于使用 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 来源的信息。

【问题讨论】:

  • 你能解释一下它是如何失败的吗?乍一看,您在 $testProposedUPN 中插入了一个 0,并且似乎没有分隔用户名和域名的“@”。我认为这些查询将返回空......让我知道。谢谢。
  • 我稍后会将其添加到问题中,但基本上当我知道建议的 UPN 值与现有值相同时,检查无法触发,导致每次运行都会生成一个新的 UPN具有递增值:first.last@contoso.com、first.last1@contoso.com 等。
  • 我认为当它们相同时不会触发检查,因为:If ($UserAdUpn -eq $checkNewUPNDupe){ ... } $UserAdUpn 定义在哪里?有点混乱,因为有多个检查。

标签: powershell exchange-server


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我也遇到了措辞笨拙的问题,而且我对这个问题有点畏缩。写出来通常可以帮助我解决在我点击提交按钮之前应该很明显的事情,但是直到昨晚我的波旁威士忌,明显的部分似乎让我印象深刻。这是一个比较问题,所有其他的东西都是不必要的干扰。今晚晚些时候,我可能会重写整个问题,或者获得足够的想法来自己解决问题。我需要运行测试以查看检查是如何开始失败的。我应该先做的事情。
  • 我会留意更多消息。喝完酒后我也会尽力而为,哈哈……
【解决方案2】:

也许你得到了一个血腥的红色错误,因为你试图用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。此代码在我的环境中测试良好。

【讨论】:

  • 感谢您对测试的清理。我很感激。但是,问题在脚本的前面。我已经编辑了问题以集中和澄清。我希望这会有所帮助。
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2010-10-09
    • 2019-05-07
    • 2021-03-08
    相关资源
    最近更新 更多