Обратимся к базе данных, выполним запрос и отобразим на веб-странице состояние присутствия всех пользователей Skype for Business для наглядности, а также выведем время отсутствующих.

В системе Skype for Business имеется возможность видеть статус сотрудника, по которому можно определять его доступность в реальном времени. То ли он на месте (в сети), то ли отошёл (скоро вернусь), толи отсутствует (не на работе, нет на месте), то ли участвует в видеоконференции, то ли просто занят (занят, не беспокоить). Также клиент выдаёт данные, когда пользователь последний раз входил в систему (компьютер). Например, в списке контактов можно увидеть, что работник был в сети 150 часов назад. Значит можно предположить, что он либо в отпуске, либо клиентская часть по какой-то причине не запущена. При большом количестве сотрудников удобно иметь весь перечень перед глазами, а не отдельно по каждому просматривать состояние присутствия. Так как в нашей компании имеется корпоративный веб-портал, то решено было отобразить такую информацию на одной из веб-страниц.  

 

Настройка состояния присутствия

По умолчанию статус присутствия Skype for Business включён и синхронизируется с почтовой системой Exchange. То есть при использовании клиента Outlook статус присутствия также виден. Однако, чтобы быть до конца уверенным в правильных настройках, нужно в этом убедиться.

В клиентской части Skype for Business заходим в Сервис->Параметры, в появившемся окне заходим в раздел Личные, проверяем или активируем галочки Синхронизировать контакты между Скайп для бизнеса и Exchange, Обновлять моё состояние присутствия на основе данных календаря и другие (см. рис. 1) по необходимости.

Рисунок 1. Настройки клиента Skype for Business.

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

 

Где хранится информация?

Данные о состоянии присутствия пользователей Skype for Business хранятся в таблице PublishedInstance, базы данных rtcdyn, инстанса rtclocal.

Чтобы получить информацию о статусе присутствия работников компании, можно написать свой SQL-запрос либо же выполнить уже готовый [https://gist.github.com/Eun/942e02fc909483b94584cf510eb656da]:

 

SELECT LOWER(UserAtHost) AS UserAtHost, Status=

CASE

WHEN Availability BETWEEN 0 AND 2999 THEN Availability

WHEN Availability BETWEEN 3000 AND 4499 THEN 'Available'

WHEN Availability BETWEEN 4500 and 5999 THEN 'Available - Idle'

WHEN Availability BETWEEN 6000 and 7499 THEN 'Busy'

WHEN Availability BETWEEN 7500 and 8999 THEN 'Busy - Idle'

WHEN Availability BETWEEN 9000 and 11999 THEN 'Do not Disturb'

WHEN Availability BETWEEN 12000 and 14999 THEN 'Be right back'

WHEN Availability BETWEEN 15000 and 17999 THEN 'Away'

WHEN Availability >= 18000 THEN 'Offline'

END,

LastPubTime

FROM rtc.dbo.Resource Resource RIGHT JOIN (SELECT Instance.PublisherId, SUBSTRING(Instance.Data,  CHARINDEX('<availability>', Instance.Data) + 14,  CHARINDEX('</availability>', Instance.Data) - CHARINDEX('<availability>', Instance.Data) - 14) AS Availability, Instance.LastPubTime

FROM (SELECT PublisherId, cast(substring(Data, 0, 256) AS varchar(256)) AS Data, LastPubTime

FROM rtcdyn.dbo.PublishedInstance

WHERE ContainerNum = 2 AND CategoryId = 4 UNION ALL

SELECT PublisherId, cast(substring(Data, 0, 256) AS varchar(256)) AS Data, LastPubTime

FROM rtc.dbo.PublishedStaticInstance

WHERE ContainerNum = 2 AND CategoryId = 4) AS Instance

WHERE CHARINDEX('aggregateState', Data) > 0) AS UserAndAvailability ON Resource.ResourceId = PublisherId

ORDER BY UserAtHost, LastPubTime DESC

 

Может возникнуть ситуация, что сразу не получится выполнить данный запрос и SQL-сервер выдаст ошибку: The SELECT permission was denied on the object 'PublishedStaticInstance', database 'rtc', schema 'dbo', а при попытке добавить права группе или пользователю выдаст другую ошибку: can`t alter the server role 'sysadmin', because its does not exist or you do not have permissions.

Чтобы добавить права [http://winitpro.ru/index.php/2015/05/12/reset-sa-password-ms-sql-server-2012/], нужно запустить службу SQL Server (RTCLOCAL) в однопользовательском режиме. Для этого сначала останавливаем службу SQL Server (RTCLOCAL), в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MSSQL$RTCLOCAL параметру ImagePath добавляем ключ “m”, который как раз и отвечает за запуск службы в однопользовательском режиме. То есть должно быть C:\Program Files\Microsoft SQL Server\MSSQL12.RTCLOCAL\MSSQL\Binn\sqlservr.exe” -m sRTCLOCAL.

Далее включаем службу, открываем консоль Microsoft SQL Server Management Studio, заходим в раздел Security->Logins, в свойствах пользователя или группы в разделе Server Roles активируем галочку напротив sysadmin. После этого проделываем обратные действия – убираем в реестре ключ “m” и запускаем консоль управления под учётными данными с полными правами, выполняем запрос, результат которого можно увидеть на рисунке 2.

Рисунок 2. Результат выполнения SQL-запроса.

 

Отобразить информацию на веб-странице

Ранее [http://corpadmin.pp.ua/sccm/post/16-uchet-setevyh-printerov-ili-snova-sccm-sql-server-extjs-chast-1 http://corpadmin.pp.ua/sccm/post/27-uchet-setevyh-printerov-ili-snova-sccm-sql-server-extjs-chast-2 ] мы уже рассматривали вариант отображения данных в удобном табличном виде, используя связку ExtJs+PHP+SQL. Данный случай не будет исключением, только сейчас не нужно использовать поля для редактирования, а значит процесс облегчается.

Скопируем все необходимые папки и файлы от учёта сетевых принтеров. В файле index. html изменим название заголовка на “Пользователи Skype for Business”. В файле data.php правке подлежат разделы с подключением к базе данных, с выборкой полей, с изменением цвета при наведении. В файле table.js, отвечающий за отображение данных в табличном виде, код уменьшится в разы, так как выводить нужно гораздо меньше полей, не нужны поля для редактирования и выпадающее меню.

Полезно иметь соответствие логина и ФИО. Много информации относительно пользователя хранится в поле Value таблицы dbo.AbAttributeValue базы данных rtcab инстанса rtc. ФИО также можно выкачать из базы данных ActiveDirectory. Также желательно отобразить не только время последнего входа, но и полное время отсутствия.

Сначала нам нужно добиться правильного отображения времени последней регистрации или последнего входа в систему (поле LastPubTime), так как по умолчанию используются разные часовые пояса. В нашем случае время отстаёт на 3 часа, прибавим их с помощью функции cast('3:00' as datetime). Далее добавим ещё одно поле (TimeOut), где будет храниться фактическое время отсутствия работника. Тут применим функцию datediff (), которая показывает разницу между текущим и указанным временем. Затем преобразуем значение даты в символьное значение с помощью функции cast() и допишем слово “минут”. После доработки полная строка получилось такой:

cast (datediff (minute, LastPubTime, getutcdate()) as varchar)+' '+'min' as TimeOut, (LastPubTime + cast('3:00' as datetime)) as LastPubTime

Сейчас будет отображаться все временные данные всех пользователей, что тоже не совсем правильно. Ведь достаточно выводить информацию только о тех сотрудниках, которые не в сети, а остальные поля сделать пустыми. Такие преобразования кода будут делаться в файле data.php, где заодно и применится эффект “жирного текста” при наведении мыши:

 

while ($row = mssql_fetch_assoc($result))

{   

  if(strcmp($row[Status],"Offline")==0)

   {

     $row[Status]="Не в сети";

     $row[Status]="<font color='#ff0000;'>".$row[Status]."</font>"; 

   }

  if(strcmp($row[Status],"Away")==0)

   {

     $row[Status]="Нет на месте";

     $row[Status]="<font color='#D2691E;'>".$row[Status]."</font>";

     $row[TimeOut]=NULL;

   }

  if(strcmp($row[Status],"Available")==0)

   {

     $row[Status]="В сети";

     $row[Status]="<font color='#2E8B57;'>".$row[Status]."</font>";

     $row[TimeOut]=NULL;

   }

     $output[]=$row;

    }

После этого новый столбец TimeOut необходимо добавить в таблицу, то есть в файл table.js. Здесь достаточно скопировать и вставить код от предыдущего столбца и переименовать поле, то есть сделать следующее:

{

header: 'Время отсутствия',

cls: 'columnHeaderTextBold',

cls: 'columnHeaderTextAlignCenterAndBold',

sortable: true,

align: 'center',

width: 130,

dataIndex: 'TimeOut'                

 }

В результате в таблице мы увидим необходимую информацию относительно статуса присутствия пользователя (см. рис. 3).

Рисунок 3. Отображение данных на веб-странице.

Табличное представление можно доводить до совершенства ещё и ещё. Например, можно в коде файла data.php добавить дополнительные проверки, чтобы в поле TimeOut выводить не только значения в минутах, а и в часах, и днях:

 

if ($NetNo || $Away)

       {

         $s=$row[TimeOut];

         $m=floor($s/60);

           if(strlen($row[TimeOut])>0&&$m>0)

            {

               if ($m<60)

                  {

                      $row[TimeOut]=$m." мин";

                   }

                else

                   {

                     if ($m<24*60)

                      {

                       $h=floor($m/60);

                        $row[TimeOut]=$h." ч";

                      }

                     else

                       {

                          $d=floor($m/(24*60));

                          $row[TimeOut]=$d." дн";

                        }    

                    }

                   }

            }

Можно добавить ещё столбец после поля Status и отображать только иконки, соответствующие статусу присутствия. После некоторых преобразований результат работы над корпоративным телефонным справочником можно увидеть на рисунке 4.

Рисунок 4. Телефонный справочник.

Ещё один способ вывести данные на веб-страницу – это использовать Skype Web SDK [http://www.matthewproctor.com/skype-web-sdk-creating-a-presence-dashboard].

 

Достоинства: удобное отображение информации о состоянии присутствия всех пользователей Skype for Business.

Недостатки: нет стандартного способа вывести данную информацию в понятном виде, нет полного описания баз данных, а только совсем поверхностные [  https://insidemstech.com/tag/rtclocal/ , http://lyncdude.com/2014/12/31/understand-lync-databases/index.html ].

Вывод: очень удобно использовать функцию состояния присутствия пользователя из клиента Skype for Business. Можно видеть, когда сотрудник был последний раз за компьютером и занят ли сейчас. Однако, в системе Skype for Business нет стандартных средств отображения данных относительно всех сотрудников. В этом случае системному администратору приходится изучать продукт более глубоко, чтобы понять где и какие данные хранятся, как к ним обратиться, какие технологии и продукты применить для отображения их в читабельном виде.