需求背景:
通常来说,当两个SIP域之间创建联盟信任,并且用户开启联盟权限之后,可以通过在Skype客户端上搜索对方用户的SIP地址来找到对方并通讯。如下所示:
但是如果我们想要和搜索SIP域内其他内部用户一样,通过显示名或者模糊搜索的方式来查找联盟用户,我们应该如何做呢?
技术实现:
我们可以通过以下几个步骤,来实现这一需求:
- 获取对方SIP域内用户的部分AD账号属性,这些属性主要包含:
Last Name
First Name
DisplayName
EmailAddress
Skype Address(msRTCSIPPrimaryUserAddress)
- 在我方域内创建AD联系人
- 为联系人配置步骤1中的属性
我们可以通过如下命令来实现:
New-ADObject -Type contact -Name "Zhang San" -DisplayName "Zhang San, HR-001" -OtherAttributes @{'givenName'="San";'sn'="Zhang";'mail'="San.Zhang@contoso.com";'msRTCSIP-PrimaryUserAddress'="San.Zhang@contoso.com"} -Path "OU=China,OU=Outside Contact List,OU=accounts,DC=contoso.com,DC=cn"
完成之后,我们通过Skype客户端即可使用显示名或者模糊搜索的方式,来查找到联盟用户,如图所示:
技术扩展:
结合一个大型企业的实际情况来考虑,需求可能更复杂,主要涉及到:
- 有更多的联系人需要创建,需要批量操作
- 对方SIP域中联系人始终在增加/减少/改变,那么这就需要我们每隔一段时间就要进行本地AD contact的信息更新
基于以上情况考虑,我们可以使用如下脚本,批量进行导入并定期更新信息,代码如下:
Function Import-SkypeContact
{
Param($List)
foreach($Contact in $Contacts){
#定义Contact属性
$Name = $Contact.Name
$DisplayName = $Contact.DisplayName
$givenName = $Contact.Last
$sn = $Contact.First
$mail = $Contact.EmailAddress
$msRTCSIPPrimaryUserAddress = $Contact.msRTCSIPPrimaryUserAddress
$Path = "OU=China,OU=Outside Contact List,OU=accounts,DC=contoso.com,DC=cn"
$ExistedContact = Get-ADObject -Filter {Name -eq $Name -and objectclass -eq 'contact'}
$ExistedContactDisplayName = Get-ADObject -Filter {Name -eq $Name -and objectclass -eq 'contact'} -Properties DisplayName
#判断如果Contact已存在
if($ExistedContact){
#判断AD是否存在与列表中DisplayName相同的Contact,存在则更新其Lync地址并导出
if($ExistedContactDisplayName.DisplayName -eq $DisplayName){
$ExistedContactProperties = Get-ADObject -Filter {DisplayName -eq $DisplayName -and objectclass -eq 'contact'} -Properties DisplayName,msRTCSIP-PrimaryUserAddress | Select-Object DisplayName,msRTCSIP-PrimaryUserAddress
$ExistedContactArray += $ExistedContactProperties
$ExistedContact | Set-ADObject -Replace @{'msRTCSIP-PrimaryUserAddress'="$msRTCSIPPrimaryUserAddress"}
}
#判断如果Contact已存在但是DisplayName不同
else{
#如果提供的列表中的Contact无邮箱属性,则创建无邮箱联系人
if(!$mail){
New-ADObject -Type contact -Name "$Name," -DisplayName $DisplayName -OtherAttributes @{'givenName'="$givenName";'sn'="$sn";'msRTCSIP-PrimaryUserAddress'="$msRTCSIPPrimaryUserAddress"} -Path $Path
}
#如果提供的列表中的Contact有邮箱属性,则创建有邮箱联系人
else{
New-ADObject -Type contact -Name "$Name," -DisplayName $DisplayName -OtherAttributes @{'givenName'="$givenName";'sn'="$sn";'mail'="$mail";'msRTCSIP-PrimaryUserAddress'="$msRTCSIPPrimaryUserAddress"} -Path $Path
}
}
}
#判断如果AD不存在列表中的联系人,且列表中的Contact无邮箱属性,则创建无邮箱联系人
elseif(!$mail){
New-ADObject -Type contact -Name $Name -DisplayName $DisplayName -OtherAttributes @{'givenName'="$givenName";'sn'="$sn";'msRTCSIP-PrimaryUserAddress'="$msRTCSIPPrimaryUserAddress"} -Path $Path
}
#判断如果AD不存在列表中的联系人,且列表中的Contact有邮箱属性,则创建有邮箱联系人
else{
New-ADObject -Type contact -Name $Name -DisplayName $DisplayName -OtherAttributes @{'givenName'="$givenName";'sn'="$sn";'mail'="$mail";'msRTCSIP-PrimaryUserAddress'="$msRTCSIPPrimaryUserAddress"} -Path $Path
}
}
}
#导入联系人列表
$fileName = Get-Date -Format yyyyMM
$list = "\\FileShare\Script\Skype for Business 2015\$fileName.csv"
$Contacts = Import-Csv $list
Import-SkypeContact -List $list