Главная > Office Communications Server > Централизованное заполнение контакт-листов в Office Communicator

Централизованное заполнение контакт-листов в Office Communicator

В процессе развертывания Office Communications Server в организации, и, соответственно, развертывания пользователям Office Communicator, мы сталкиваемся с одной неприятной особенностью. Любой пользователь, запустивший Communicator в первый раз, увидит пустой контакт-лист, и ему придется добавлять другие контакты в список вручную. А он чаще всего хочет обратного – чтобы он сразу видел список своих коллег.

Дело в том, что контакт-листы в Office Communicator хоть и хранятся на сервере, но вовсе не заполняются автоматически, как, например offline address book в Exchange. А заполнять контакты вручную ни пользователь, ни (тем более) администратор не хотят и не имеют времени. Следовательно, рассмотрим вопрос, как нам автоматизировать такую задачу.

Вообще есть два способа организации контакт-листов – мы можем добавить контакт, например, по его SIP-адресу. Либо – мы можем создать на сервере distribution-группу, в которую уже будут добавлены различные контакты, и добавить пользователю эту группу рассылки. Каждый вариант имеет свои плюсы и минусы, и каждый вариант добавляет определенной работы администратору в случае появления в организации нового сотрудника :)

Способ №1 – добавление в контакт-лист отдельных контактов

Мы можем централизованно – скриптом на сервере – добавить в список контактов пользователя определенный набор контактов. Плюс этого – пользователь сразу видит перед собой все контакты с их статусами, может переорганизовать их как он хочет, распихав по группам, созданным по своему разумению и удобству. Минус этого - когда мы создадим нового пользователя для нового сотрудника, и активируем его для объединенных коммуникаций – нам придется запускать процесс добавления этого контакта во все существующие на данный момент контакт-листы пользователей.

Добавляются пользователи в контакт-лист следующим образом:

  1. Открываем на сервере Office Communications Server программу cmd и переходим в каталог C:\Program Files\Microsoft Office Communications Server 2007 R2\ResKit\WMI Samples\. Как – что значит, у вас нет этого каталога? Вы до сих пор не поставили OCS Resource Kit? Бегом ставить!
  2. В этом каталоге лежит скрипт LCSAddContacts.wsf, который нас и интересует. Для его работы нужно создать два текстовых файла – один файл со списком пользователей, которых мы добавляем, второй файл со списком пользователей, к кому в контакт-листы мы добавляем пользователей из первого файла. Назовем первый файл contacts.txt, а второй – users.txt. Файлы должны содержать всего лишь SIP-адреса, по одному на строчку, например:
    sip:user01@domain.com
    sip:user02@domain.com
    sip:user03@domain.com
  3. Запускаем на выполнение нужный скрипт следующей командой:
    cscript LCSAddContacts.wsf /usersfile:файл_списка_пользователей /contactsfile:файл_списка_контактовв нашем случае эта команда будет выглядеть так:
    cscript LCSAddContacts.wsf /usersfile:users.txt /contactsfile:contacts.txt

Можно дописать еще аргумент /contactsgroup:имя_группы – тогда контакты будут добавлены не в группу «Все контакты», а в группу с указанным именем.

Ну а еще можно дописать аргумент /delete – тогда перечисленные в файле контакты будут не добавлены, а удалены из контакт-листов указанных пользователей.

Способ №2 – использование групп рассылки

Помимо контакта мы можем добавить в контакт-лист группу рассылки. Это даст нам несколько очевидных преимуществ, но и несколько очевидных минусов. Плюсы – контакты пользователя сразу организованы по группам. Когда в организации появится новый сотрудник, нам всего лишь надо добавить его в нужную distribution-группу в Active Directory, и он (при следующем обновлении адресной книги) окажется в контакт-листах пользователей самостоятельно.

Минусы такого подхода тоже присутствуют. Например – клиент не может ни добавить, ни удалить пользователя из группы рассылки – само собой, это можно сделать, только изменив состав группы средствами Active Directory. Также в качестве групп рассылки, которые можно добавить в Communicator, не поддерживаются динамические группы рассылки Exchange. А жаль – как было бы удобно например, создать динамический список рассылки «Все», и добавить его пользователям! А в дальнейшем даже не заморачиваться добавлением свежезаведенного пользовательского аккаунта ни в какие группы рассылки.

Еще одним существенным минусом добавления групп рассылки в контакт-лист пользователя является то, что автоматизированного средства, подобного используемому в вышеприведенном примере №1, в поставке OCS не присутствует. На помощь пришел написанный товарищем Sver и выложенный на форумы TechNet собственный скрипт – за что ему (или ей) огромное спасибо.

Важное условие использования скрипта – группа должна быть distributed, и группе должен быть присвоен адрес e-mail, по которому она и добавляется в контакт-лист. Проще всего использовать те же самые группы рассылки, которые используются и в Exchange.

Вот текст скрипта – назовем его LCSAddGroups.wsf:


<?xml version="1.0"?>
<package>

<comment>
LCSAddGroups.wsf
This WMI script progmatically adds Distribution Lists for LCS Users.
</comment>

<job>
<?job error="True" debug="True" ?>

<script language="VBScript">
<![CDATA[
' VBScript source code
Option Explicit

' Contant decleration section
Const cComputer = "."
Const cWMINameSpace = "root/cimv2"
Const cWMIUserClass = "MSFT_SIPESUserSetting"
Const cWMIUserContactGroupClass = "MSFT_SIPESUserContactGroupData"
Const cWMIUserContactClass = "MSFT_SIPESUserContactData"
Const cWMIUserACEClass = "MSFT_SIPESUserACEData"
Const cGroupNameAllContacts = "~"

 

 
'-------------------------------------------------------------------------------
' Function: GetUserInstanceID
' Description: This function will return the InstanceID of SIP User
' Parameters: ByVal strPrimaryURI - SIP address of User
' whoes InstanceID has to be retrived
' Returns: Variant string - (either -1 or InstanceID of SIP User)
'-------------------------------------------------------------------------------
Function GetUserInstanceID (ByVal strPrimaryURI)
Dim vReturn : vReturn = -1
If Not IsEmpty(strPrimaryURI) Then
Dim oUserInstances : Set oUserInstances = GetObject("winmgmts:\\" & cComputer).ExecQuery("SELECT * FROM " & cWMIUserClass & " WHERE PrimaryURI = '" & strPrimaryURI & "'")
If Not oUserInstances.Count < 1 Then
Dim oInstance
For Each oInstance In oUserInstances
vReturn = oInstance.InstanceID
Next
End If
End If
GetUserInstanceID = vReturn
End Function

 
'-------------------------------------------------------------------------------
' Function: ParseUserLineItem
' Description: This function will parse each line item from text file
' with the users and add contacts for them.
' Parameters: ByVal strLineItem - Line item that has to be parsed
' for user for which contacts have to be added.
' Returns:
'-------------------------------------------------------------------------------
Function ParseUserLineItem (strLineItem)
Dim vItems : vItems = Split(strLineItem, ":")
If UBound(vItems) > 0 Then
Dim vUsers
Dim vUser
Select Case UCase(vItems(0))
Case "SIP"
vUser = "sip:" & Trim(vItems(1))
If fDelete Then
Wscript.echo vUser
DeleteContacts(vUser)
DeleteGroups(vUser)
Else
AddContactGroups(vUser)
End If
Case Else
WScript.Echo ""
WScript.Echo "@------------------------------------------------------------"
WScript.Echo "[Err] Invalid Line item in " & strUsersFile & ": '" & strLineItem & "'"
WScript.Echo "@------------------------------------------------------------"
End Select
Else
WScript.Echo ""
WScript.Echo "@------------------------------------------------------------"
WScript.Echo "[Err] Invalid Line in " & strUsersFile & ": '" & strLineItem & "'"
WScript.Echo "@------------------------------------------------------------"
End If
End Function

 

 

'-------------------------------------------------------------------------------
' Function: AddContactGroup
' Description: Adds Contact for given User
' Parameters: UserInstanceID, Name
' Returns: Variant rReturn - (Either null or GroupID)
'-------------------------------------------------------------------------------
Function AddContactGroup(ByVal UserInstanceID, ByVal Name, ByVal strDistributionGroupEmailAddress)
Set oInstances = GetObject("winmgmts:\\" & cComputer).ExecQuery("SELECT * FROM " & cWMIUserContactGroupClass & " WHERE UserInstanceID = '" & UserInstanceID & "'")
For Each oInstance In oInstances
Wscript.echo "GroupID: " & oInstance.GroupID
Wscript.echo "Name: " & oInstance.Name
Wscript.echo "ExternalURL: " & oInstance.ExternalURL
Wscript.echo "UserInstanceID: " & oInstance.UserInstanceID
Wscript.echo "NewGroup: " & Name
Wscript.echo ""
Next

Wscript.Echo "User groups: " & oInstances.Count
Dim vReturn : vReturn = null

Dim oInstances
Dim oInstance

Set oInstances = GetObject("winmgmts:\\" & cComputer).Get(cWMIUserContactGroupClass)
Set oInstance = oInstances.SpawnInstance_

oInstance.UserInstanceID = UserInstanceID
oInstance.ExternalURL = "<groupExtension groupType=" & Chr(34) & "dg" & Chr(34) & "><email>" & strDistributionGroupEmailAddress & "</email></groupExtension>"
oInstance.Name = Name

On Error Resume Next
oInstance.Put_ 2 'Put flag 2 for createOnly

If Err.Number = 0 Then
strCounter = strCounter + 1
End If
Err.Clear
On Error Goto 0

AddContactGroup = vReturn
End Function

 

 

Function DeleteContacts(ByVal strPrimaryURI)
Dim UserInstanceId
UserInstanceId = GetUserInstanceID(strPrimaryURI)

Dim oInstances
Dim oInstance

Set oInstances = GetObject("winmgmts:\\" & cComputer).ExecQuery("SELECT * FROM " & cWMIUserContactClass & " WHERE UserInstanceID = '" & UserInstanceID & "'")
If Not oInstances.Count < 1 Then
For Each oInstance In oInstances
On Error Resume Next
oInstance.Delete_
If Err.number = vbEmpty Then
WScript.Echo "[+] Delete successful for contact: " & oInstance.SIPURI
vReturn = 0
Else
WScript.Echo "[-] Delete failed for contact: " & oInstance.SIPURI & " " & Err.number & ": " & Err.Description
vReturn = Err.number
End If
On Error Goto 0
Next
End If
End Function

 

 

Sub DeleteGroups (ByVal strPrimaryURI)
Dim UserInstanceId
UserInstanceId = GetUserInstanceID(strPrimaryURI)

Dim oInstances
Dim oInstance

Set oInstances = GetObject("winmgmts:\\" & cComputer).ExecQuery("SELECT * FROM " & cWMIUserContactGroupClass & " WHERE UserInstanceID = '" & UserInstanceID & "'")
For Each oInstance In oInstances
If Not oInstance.Name = "~" Then
On Error Resume Next
oInstance.Delete_
If Err.number = vbEmpty Then
WScript.Echo "[+] Delete successful for group: " & oInstance.Name
vReturn = 0
Else
WScript.Echo "[-] Delete failed for group: " & oInstance.Name & " " & Err.number & ": " & Err.Description
vReturn = Err.number
End If
On Error Goto 0
End If
Next
End Sub

 
Sub AddContactGroups (ByVal strPrimaryURI)
Dim strUserInstanceId
strUserInstanceId = GetUserInstanceID(strPrimaryURI)

Dim strGroupID
Wscript.echo strPrimaryURI
strGroupID = AddContactGroup(strUserInstanceId, "ИМЯ_ГРУППЫ_1", "group_1_mail@domain.ru")
strGroupID = AddContactGroup(strUserInstanceId, "ИМЯ_ГРУППЫ_2", "group_2_mail@domain.ru")
strGroupID = AddContactGroup(strUserInstanceId, "ИМЯ_ГРУППЫ_3", "group_3_mail@domain.ru")
End Sub

 
]]>
</script>

<script language="VBScript">
<![CDATA[
Option Explicit

Dim strCounter : strCounter = 0
Dim strPrimaryURI
Dim fDelete : fDelete = WScript.Arguments.Named.Exists("delete")

If Not WScript.Arguments.Named.Exists("usersfile") Then
strPrimaryURI = "sip:" & InputBox("Enter SIP address of user." & VbCrLf & _
"You can use /UsersFile:C:\users.txt parameter if you want to add groups to many users." & VbCrLf & _
"Each line in users.txt need to have the format sip:users@domain.com", "SIP address")
If fDelete Then
DeleteContacts(strPrimaryURI)
DeleteGroups(strPrimaryURI)
Else
AddContactGroups(strPrimaryURI)
End If

Else
Dim strUsersFile : strUsersFile = LCase(Trim(WScript.Arguments.Named.Item("usersfile")))

WScript.Echo "@------------------------------------------------------------"
WScript.Echo "@ Text file with Users: " & strUsersFile
WScript.Echo "@------------------------------------------------------------"
WScript.Echo ""
Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject")
Dim oUsersFile
Dim i : i = 0

'Reading Users from file and adding contacts
If oFS.FileExists(strUsersFile) Then
Set oUsersFile = oFS.OpenTextFile(strUsersFile, 1, false)

Dim strUserSIPAddress
Dim strLineItem

Do Until oUsersFile.AtEndOfStream
strLineItem = Trim(oUsersFile.ReadLine)
ParseUserLineItem(strLineItem) ' Parse each line item and add contacts for it
Loop
Else
fShowUsage = True
WScript.Echo "[Err] Invalid users input file: " & strUsersFile
End If
End If

Wscript.Echo "Created " & strCounter & " groups."
]]>
</script>
</job>
</package>

Обратите внимание – в процедуре AddContactGroups нужно прописать необходимое количество строчек вызова, указав имя добавляемой группы (как оно будет отображаться в Communicator), и e-mail адрес группы рассылки.

Далее. Для вызова данного скрипта необходимо подготовить файл списка пользователей, которым мы добавляем данные группы. Файл должен быть таким же, как и для примера №1 – один SIP-адрес на одной строчке.

Затем – запускаем скрипт:

cscript LCSAddGroups.wsf /UsersFile:файл_список_пользователей

После отработки можно запускать Communicator и увидеть свежедобавленные группы с пользователями.

  1. Пока что нет комментариев.
Необходимо войти на сайт, чтобы написать комментарий.