Локальный Exchange: как устроена синхронизация календарей
Статья описывает, как устроена синхронизация броней UnSpot с календарями на своём сервере Microsoft Exchange — что переносится в календарь и обратно, как приходят изменения, какие требования это накладывает на сеть, и чем отличаются два способа подключения: под сервисной учётной записью с правами на календарь и через имперсонализацию. Для облака Microsoft 365 механика другая — см. статью «Облако Microsoft 365: как устроена синхронизация календарей».
Общая схема
UnSpot обращается к серверу Exchange по протоколу EWS (Exchange Web Services) под сервисной учётной записью. Синхронизация двусторонняя:
- Из UnSpot в календарь. Бронь переговорной создаёт встречу в календаре её ресурсного ящика. Изменение и удаление брони уходят в календарь сразу.
- Из календаря в UnSpot. Встреча, созданная в Outlook напрямую в календаре комнаты, попадает в UnSpot бронью. Сервер Exchange сам уведомляет UnSpot об изменениях — по подписке, которую UnSpot оформляет при подключении календаря.
Обмен идёт изменениями, а не полной выгрузкой: UnSpot запрашивает у сервера только то, что поменялось с прошлой сверки — до тысячи изменений за один запрос, и повторяет запросы, пока сервер не отдаст всё. Если сервер сообщает, что состояние сверки устарело, UnSpot вычитывает календарь заново.
Требования к серверу и сети
| Требование | Подробности |
|---|---|
| Версия Exchange | 2010, 2010 SP1, 2010 SP2, 2013, 2013 SP1, 2016. Версия выбирается в форме подключения. Exchange 2019 в списке отсутствует |
| Доступ от UnSpot к серверу | исходящие запросы EWS на адрес сервера, который вы указываете в форме. Адрес вводится без схемы |
| Доступ от сервера к UnSpot | обязателен: уведомления об изменениях инициирует сам Exchange и отправляет их на адрес UnSpot. Если сервер не может обратиться к UnSpot, входящая синхронизация работать не будет — брони будут уходить в календарь, но события из календаря в UnSpot не попадут |
| Аутентификация | по умолчанию доменная (NTLM); переключатель включает Basic. Подпись зависит от варианта: в окне подключения — «Использовать базовую авторизацию (Basic Auth)», в окне переговорной — «Использовать basic авторизацию» |
| Сертификат | по умолчанию проверяется. Переключатель отключает проверку — только для самоподписанных сертификатов. Подпись зависит от варианта: в окне подключения — «Не проверять SSL-сертификат», в окне переговорной — «Не проверять SSL» |
| Таймауты | UnSpot ждёт установления соединения до 15 секунд и ответа на запрос до 60 секунд |
Что уезжает из брони в событие
| Поле брони UnSpot | Куда попадает в событии | Оговорки |
|---|---|---|
| Начало и конец | время события | — |
| Название брони | тема события | — |
| Ссылка на встречу и комментарий | описание события | обычным текстом, без форматирования |
| Участники | только необязательные участники | Exchange рассылает им приглашения |
| Признак приватной брони | уровень конфиденциальности события | обычная бронь — «Обычная», приватная — «Личное» |
| Повторяемость | правило повторения события | переносится при создании |
При изменении брони в календарь уходит меньше, чем при создании. Обновляются время, тема и уровень конфиденциальности; заодно у события принудительно снимается признак «весь день». Не уходят:
- изменённый состав участников — добавленный или удалённый в UnSpot гость в календаре Exchange не появится и не исчезнет;
- изменённое правило повторения;
- изменённое описание.
Если состав участников важен, надёжнее удалить бронь и создать заново — тогда событие в календаре создаётся с нуля и получает актуальный список.
Что приходит из события в бронь
| Поле события | Что становится в UnSpot | Оговорки |
|---|---|---|
| Тема | название брони | если тема пустая, бронь называется Engaged |
| Начало и конец | время брони | — |
| Обязательные и необязательные участники | участники брони | сводятся в один список, деление не сохраняется |
| Организатор | организатор брони | — |
| Уровень конфиденциальности | признак приватной брони | всё, кроме «Обычная», делает бронь приватной |
| Правило повторения | повторяющаяся бронь | обрабатывается серия целиком |
| Отмена встречи | бронь удаляется | — |
Что не переносится
- Место встречи — переговорная определяется календарём, в который попало событие.
- Признак «весь день»: событие на весь день становится бронью с конкретным временем.
- Категории и статус занятости («Занят», «Под вопросом» и прочие).
- Вложения и форматирование описания.
Как приходят изменения из календаря
При подключении календаря UnSpot оформляет на сервере push-подписку на созданные, изменённые и удалённые события. Дальше инициатива на стороне Exchange: сервер сам обращается к UnSpot, когда в календаре что-то поменялось, и, кроме того, присылает статусные обращения примерно раз в час — даже если изменений не было. Каждое такое обращение продлевает подписку.
Из этого следуют две практические вещи:
- Если сеть между Exchange и UnSpot закрыта, входящая синхронизация не работает вообще — и это выглядит не как ошибка, а как тишина: брони уходят в календарь, а события из календаря не приходят.
- Если обращения от сервера прервались надолго (перезапуск сервера, работы на сети, изменение правил межсетевого экрана), подписка перестаёт действовать. Дальше поведение зависит от варианта подключения: для «On-premise Microsoft» подписку заново оформляет фоновая задача UnSpot, для «Microsoft Exchange» (имперсонализация) — не оформляет никто, и календарь нужно отключить и подключить заново. Ручная сверка в обоих случаях разово подтянет пропущенные встречи, но подписку не пересоздаёт.
Два способа подключения и чем они отличаются
Всё описанное выше одинаково для обоих вариантов локального Exchange: поля, направления, ограничения обновления, механика подписок. Различие — в том, кому выдаются права и от чьего имени UnSpot обращается к календарю комнаты.
Подключение с имперсонализацией создаётся карточкой в разделе «Синхронизация календарей»:

Подключение под сервисной учётной записью с правами на календарь заполняется прямо в окне переговорной — своими параметрами для каждой комнаты:

| Признак | On-premise Microsoft (сервисный аккаунт) | Microsoft Exchange (имперсонализация) |
|---|---|---|
| Где настраивается | окно подключения календаря переговорной | «Настройка» → «Интеграции» → «Синхронизации» |
| Что вводится | адрес сервера, версия, email ресурсного календаря, логин и пароль — для каждой переговорной | адрес сервера, логин, пароль, email, название и версия — один раз |
| Права на стороне Exchange | учётной записи выдаются права на календарь каждой переговорной | учётной записи один раз выдаётся роль ApplicationImpersonation |
| От чьего имени идёт обращение | от имени сервисной учётной записи | от имени ресурсного ящика переговорной |
| Как указывается календарь комнаты | email ресурса вводится в форме, затем календарь выбирается из списка календарей этого ящика | email ресурса вводится вручную; списка комнат нет — Exchange его не отдаёт |
| Проверка прав при подключении календаря | не выполняется | выполняется: создаётся и сразу удаляется тестовое событие |
| Одно подключение на много переговорных | нет | да |
| Личные календари сотрудников | поддерживаются | не поддерживаются |
| Смена пароля учётной записи | ломает все календари, подключённые под ней; достаточно переподключить один — учётные данные общие | ломает подключение целиком; исправляется в одном месте — кнопкой «Изменить» на карточке |
Дополнительное ограничение варианта с имперсонализацией: пары «сервер + логин» и «сервер + email» должны быть уникальны — два подключения с одинаковым сервером и одной учётной записью создать нельзя.
В варианте с имперсонализацией при подключении календаря к переговорной в этом календаре на короткое время появляется проверочная встреча с темой [UNSPOT] Permission probe — это штатная проверка права записи, она удаляется сразу же.
Как удаляются события
Удаление брони в UnSpot по-разному действует на события, в зависимости от того, кто их создал:
- Событие создал UnSpot — оно удаляется с сервера окончательно, участникам рассылаются отмены.
- Событие создали в календаре напрямую, а UnSpot лишь подхватил его бронью — UnSpot не удаляет встречу, а отклоняет приглашение от имени ресурсного ящика комнаты. Организатор получает отказ, а сама встреча остаётся в его календаре.
Отдельно стоит знать: при отключении календаря от переговорной подписка на сервере Exchange не снимается. Сервер какое-то время продолжает присылать уведомления, а UnSpot на них отвечает просьбой прекратить рассылку. Никаких действий от администратора это не требует.
Пересечения и конфликты
- Календарь занят на это время. Бронь удаляется, организатор получает уведомление об отмене, запускается повторная сверка календаря — приоритет у того, что уже стоит в календаре.
- Событие в календаре создать не удалось. Бронь удаляется, организатор получает уведомление об отмене.
- Событие в прошлом. Бронь из события в прошлом не создаётся, если есть пересечения с другими бронями.
- Завершившиеся брони не переписываются. Идущая сейчас бронь обновляется как обычная.
Ручная сверка и признаки поломки
Кнопка «Запустить синхронизацию» в окне календаря переговорной заново вычитывает календарь и приводит брони в соответствие с ним; подписку на уведомления она не пересоздаёт. После запуска кнопка блокируется на час — рядом показывается время следующего запуска. Сверку выполняет Владелец: кнопка видна и Администратору офисов, но запрос завершится отказом по правам.
Признаки потери доступа те же, что и в облаке: отметка «Календарь недоступен» у переговорной в дереве пространств, отметка «Ошибка подключения» на карточке подключения, кнопка «Переподключить» вместо «Запустить синхронизацию». Типичные причины на локальном сервере — смена пароля сервисной учётной записи, снятая роль имперсонализации, истёкший сертификат и закрытый доступ к EWS.
Связанные статьи
- Синхронизация календарей с Microsoft: какой вариант выбрать
- Облако Microsoft 365: как устроена синхронизация календарей
- Предоставление прав на управление ресурсным календарем в Exchange
- Подключение календаря переговорной к локальному Exchange
- Exchange: сервисная учётная запись с правами имперсонализации
- Подключение Microsoft Exchange через сервисный аккаунт