【问题标题】:Modifying phone number variable from Active Directory in Powershell在 Powershell 中从 Active Directory 修改电话号码变量
【发布时间】:2018-12-14 19:28:43
【问题描述】:

我们有一个 Powershell 脚本,可以使用从 Active Directory 中提取的数据自动创建 Outlook 签名。

目前我们正在使用以下行提取电话号码:

Update-Sig -attribute "TelephoneNumber" -value "$([string]($ADUser.TelephoneNumber))"

这将返回一个格式为 +61112345678 的数字。

我想做的是更改该字符串,使其始终采用带空格的 +61 1 1234 5678 格式。

这可能吗?我在想我需要获取字符串,将其转换为变量,然后在一定数量的字符后添加一个空格。但我不确定该怎么做。

谢谢

【问题讨论】:

  • 由于字符限制,我将在两个 cmets 中执行此操作。 TelephoneNumber 是 AD 用户的字符串属性。事实上,该属性的 PowerShell 名称是 OfficePhone,而 LDAP 名称是 telephoneNumber。由于这是一个字符串,因此不知道它在某些时候以什么格式输入。您已经测试并看到它为一个用户返回了+61112345678,但这并不意味着这种格式适用于所有用户..
  • 恐怕你的代码必须决定字符串值是否以+ 符号开头,所以后面的应该是国家代码。但是,由于Country Calling Codes 的列表非常广泛,因此很难定义正确的代码,但如果幸运的话,您的大多数用户都在澳大利亚(代码 61)。在伪代码中,您检查字符串是否以+ 开头,然后使用$number -replace '\D','' 从剩余部分中删除所有非数字并使用@Lee_Dailey 答案格式化。
  • 嗨@Theo,是的,所有数字都以+612开头。

标签: powershell outlook active-directory


【解决方案1】:

您可以使用字符串格式运算符来执行此操作。它有一个“数字占位符”选项。但是,这只适用于实际的 numbers 并且您的数据几乎可以肯定是一个字符串。所以...我将数字部分转换为[int64]。 [咧嘴一笑]

$SourceValue = '+61112345678'
'+{0:## # #### ####}' -f ([int64]$SourceValue.TrimStart('+'))

输出=+61 1 1234 5678

【讨论】:

  • 嘿,为了清楚起见,号码是那种没有空格的格式,但它并不总是返回 +61112345678,它会返回任何 $ADUser.TelephoneNumber 是什么。我尝试将数字更改为变量,但得到“错误:“输入字符串格式不正确。”
  • @MarcusB - 你提供给我发布的代码的价值是什么?如果它是一个以+ 开头的字符串并且其中只有数字,那么它应该 工作。所以......你怎么调用我发布的代码?
  • 我尝试通过将您的代码块放在我上面发布的 Update-Sig 命令并执行 $SourceValue = "TelephoneNumber" '+{0:## # #### ####}' -f ([int64]$SourceValue.TrimStart('+')) 来调用它
  • @MarcusB - 好吧...TelephoneNumber 是一个字符串。 [grin] 我认为您需要使用$ADUser.TelephoneNumber 作为字符串格式运算符的输入。
  • @MarcusB - 好的,$ADUser.TelephoneNumber 返回的究竟是什么?
【解决方案2】:

由于字符串格式,因此应归功于@Lee_Daily。 您可以执行以下操作来格式化预期的“+61”数字,如果属性中还有其他内容,它将打印出来以便您检查。

$phone = '+61112345678'

# test if the string starts with a `+` or at least the digits `61`
if ($phone.Trim() -match '^(\+|61)') {
    $phone = '+{0:## # #### ####}' -f ([int64]($phone -replace '\D',''))
    Write-Host "Formatted TelephoneNumber: '$phone'" -ForegroundColor Green
}
else {
    # not a '+61' number. Write it out so you can check/correct manually
    Write-Host "Unexpected TelephoneNumber: '$phone'" -ForegroundColor Red
}


更新

为了回答您的最新评论,确实,上面的代码没有设置 ADUser 属性中新格式化的电话号码。
我认为问题全在于格式,而不是设置。

虽然您的链接已损坏,但在 AD 中设置它很容易。
看来您已经有一个名为 $ADUser 的对象,我想这来自您之前的 Get-ADUser 调用。 设置使用上述代码获得的格式化数字,您可以简单地使用例如更新用户编号:

# using piping the user object to Set-ADUser
$ADUser | Set-ADUser -OfficePhone $phone

# using one of the users properties as 'Identity' and update using the LDAP attribute name
# for parameter Identity, the cmdlet accepts either the DistinguishedName, objectGUID, objectSid, or the SamAccountName
Set-ADUser -Identity $ADUser.DistinguishedName -Replace @{telephoneNumber = $phone }

附言还有一个名为HomePhone(LDAP 名称homePhone)的属性,但这不是您在代码中使用的属性。

希望有帮助

【讨论】:

  • 这似乎说它有效,但实际上并没有按预期更新电话号码。您和@Lee_Dailey 建议的事情很可能是正确的,但我认为鉴于查找/替换代码的性质,它可能会覆盖您正在做的事情。如果您想查看 [codepad.co/snippet/JFGO49gI](Automatic Outlook 签名),脚本就在这里。如果您查看第 49-66 行,那就是替换发生的地方。
  • @MarcusB 我添加了用于更新用户电话号码的代码。尽管您的链接已损坏 (404),但我认为这会对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多