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 值,它就可以正常工作了。
感谢史蒂文的努力。我很感激他们。
我正在构建一个工具,用于使用 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 值,它就可以正常工作了。
感谢史蒂文的努力。我很感激他们。