Mode включен, пакет Outlook обладает большей надежностью в случае сбоя в работе сети. Данная настройка может иногда снижать сетевой трафик между клиентом и сервером Exchange. Кроме того, режим Cached Exchange Mode необходим для работы службы Outlook Junk E-mail Filter. Однако данный режим не всегда оптимален для работы. В окружении, где пользователи нечасто регистрируются на территориально разнесенных компьютерах, эта настройка может спровоцировать появление дополнительного сетевого трафика, вызванного синхронизацией файлов OST с сервером. При работе с медленными сетевыми соединениями просмотр обновленной папки Inbox займет у пользователей некоторое время. В таких случаях режим Cached Exchange Mode лучше отключить (или не включать).

Данный режим довольно легко настроить как профиль службы Outlook, установленный по умолчанию. Достаточно просто открыть в Control Panel приложение Mail и щелкнуть мышью на кнопке E-mail Accounts (или выбрать пункт E-mail Accounts из меню Tools в службе Outlook). Выберите пункт View or change existing e-mail accounts и нажмите Next. Из предложенного списка требуется выбрать Microsoft Exchange Server и нажать кнопку Change. Затем нужно поставить или снять флажок в поле Use Cached Exchange Mode, нажать Next, после чего щелкнуть Finish. Если приложение Outlook запущено, необходимо закрыть его, прежде чем изменения вступят в силу. Настройка режима Cached Exchange Mode для новых профилей Outlook также достаточно очевидна. Можно использовать мастер Office Custom Installation Wizard или шаблон outlk11.adm (административный шаблон Outlook). К сожалению, эти методы годятся только для новых профилей и не позволяют изменить настроенный режим Cached Exchange Mode для существующих профилей. Для выполнения этой задачи необходимо изменить соответствующие настройки в реестре. Хотя такой метод и не является лучшим вариантом для простого изменения настроек, он предоставляет данные диагностики, которые иначе недоступны, и может использоваться для изменения произвольных профилей почты или множества профилей — задача, которую трудно решить другими методами.

Настройка режима кэширования

Данные для настройки режима Cached Exchange Mode хранятся в разделе реестра HKEY_CURRENT_USER SoftwareMicrosoftWindows NTCurrentVersionWindows Messaging SubsystemProfilesProfile13dbb0c8aa05101 a9bb000aa002fc45a (здесь Profile — имя профиля Outlook). В записи реестра 00036601 имеется значение формата REG_BINARY, содержащее 32 бит (4 байт). Записи типа REG_BINARY иногда обрабатываются как массивы битов, где каждый бит содержит отдельное двоичное значение.

Чтобы определить, какой бит или какие биты контролируют режим Cached Exchange Mode, я задействовал приложение Regedit для экспорта раздела реестра до и после включения и отключения данной настройки. Я обнаружил, что 17-й бит массива (если считать справа налево) соответствует режиму Cached Exchange Mode. Когда бит установлен в 1, режим Cached Exchange Mode включен, и наоборот, 32-й бит (то есть крайний слева) должен совпадать с 17-м битом. Так как 4 байт данных зависят от профиля и могут различаться даже на одной системе, использовать файл .reg или тому подобные методы для переопределения данных не следует. Более приемлемое решение — считывать, включать и отключать соответствующие биты без изменения остальных битов.

Для этого я написал сценарий на VBScript, CachedExchange.vbs, который можно использовать для чтения записи реестра и определения того, включен или отключен режим Cached Exchange Mode. Также можно задействовать сценарий для включения или отключения режима. Для запуска сценария используется следующий синтаксис:

cscript CachedExchange.vbs [/P:]
[/enable | /disable] [/V]

Сценарий требует наличия среды исполнения Windows Script Host (WSH) CScript; ключевое слово cscript в начале команды необходимо только в том случае, если CScript не является по умолчанию средой исполнения сценариев. Остальные параметры команды могут появляться в любом порядке и нечувствительны к регистру. Переключатель /p позволяет указать определенный профиль Outlook (в случае, если используется множество профилей). Если имя профиля содержит пробелы, нужно заключить его в двойные кавычки (например, ??My Profile??). Если имя профиля не указано, сценарий будет считывать или изменять настройки режима Cached Exchange Mode для профиля, указанного по умолчанию. Следует указать параметры /enable или /disable для включения или отключения режима Cached Exchange Mode. Если не указать ни один из переключателей, сценарий сообщит о текущем режиме. Параметр /v заставляет сценарий использовать детализированный вывод, полезный при отладке. Перед работой со сценарием необходимо убедиться, что все его функции вам ясны.

Базовые функции

Объект WshShell оболочки WSH предоставляет методы RegRead и RegWrite для чтения и записи данных в реестр. Когда для считывания значения типа REG_BINARY (одно из значений, определяющих настройки режима Cached Exchange Mode) используется метод RegRead, он возвращает значение в виде массива байтов. Однако метод RegWrite не поддерживает запись массива: необходимо указать единое значение. Из-за этого ограничения я решил использовать методы класса StdRegProv оболочки Windows Management Instrumentation (WMI) для чтения из реестра и записи в него данных.

Использование класса StdRegProv для операций с реестром требует вызова методов в соответствии с типом данных реестра. Чтобы упростить вызов метода, я написал набор из трех интерфейсных функций: ReadValue(), KeyExists() и ByteArrayToString().

Функция ReadValue() проверяет раздел реестра с помощью вызова метода EnumValues класса StdRegProv, который возвращает два массива, содержащие имена параметров и типы данных. Эта функция просматривает массив имен параметров в поисках запрашиваемого значения. Если обнаружено совпадение, функция использует метод класса StdRegProv, соответствующий типу возвращаемых данных. Затем функция возвращает значение параметра реестра и тип данных параметра в код вызова, модифицируя аргументы ByRef, передаваемые функции. Если данные получены успешно, на выходе функции будет 0. Функция WriteValue аналогична функции ReadValue и вызывает соответствующий метод класса StdRegProv, в зависимости от типа записываемых данных.

Функция KeyExists() вызывает метод EnumKey класса StdRegProv, который возвращает массив имен разделов. Функция просматривает массив и возвращает значение True, если находит совпадение.

Функция ByteArrayToString() требует параметра, который содержит массив байтов. Функция возвращает строчную интерпретацию этого массива в виде серий шестнадцатеричных пар цифр. Сценарий использует эту функцию для записи байтовых пар в значение типа REG_BINARY.

Получение информации об Outlook

Для получения профиля Outlook, установленного по умолчанию, функция GetDefaultProfile() сценария использует функцию ReadValue, чтобы считать значение DefaultProfile из раздела реестра HKEY_CURRENT_ USERSoftwareMicrosoftWindows NTCurrentVersion Windows Messaging SubsystemProfiles. Функция возвращает пустую строку, если она не может найти значений DefaultProfile или тип значения отличен от типа REG_SZ.

Функция ProfileKeyExists() использует функцию KeyExists() для определения того, существует ли указанный профиль службы Outlook в реестре. Если существует — функция возвращает значение True. Подпрограмма Main, приведенная в листинге 1, задействует функцию ProfileKeyExists() для проверки корректности имени профиля.

Чтобы определить, какая используется версия службы Outlook (и таким образом подтвердить, что система поддерживает режим Cached Exchange Mode), функция сценария GetDefaultProfile() применяет функцию ReadValue для получения пути к программе outlook.exe из подключа реестра HKEY_CLASSES_ROOTCLSID{0006F03A-0000-0000-C000-000000000046}LocalServer32. Этот раздел существует, если установлена служба Outlook и его значение по умолчанию содержит имя папки и имя исполняемого файла Outlook. Функция возвращает строковую интерпретацию номера используемой версии, по аналогии с работой метода GetFileVersion класса FileSystemObject. В дальнейшем подпрограмма Main использует функцию GetVersionPortion() для определения того, какая установлена версия программы outlook.exe — 11 или более поздняя.

Функция GetExchangeConfig() получает данные типа REG_BINARY из указанного профиля Outlook. Эта функция возвращает значение, содержащее массив байтов, который применяется сценарием как параметр функции GetCachedExchangeMode(). Эта функция сначала проверяет, содержит ли параметр arrBytes массив и включает ли массив более одного элемента. Если эти условия выполнены, функция определяет, установлен ли первый бит второго байта в 1. Если это так, функция возвращает значение vbTrue (-1); если нет — vbFalse (0). Если параметр arrBytes не содержит массив хотя бы с одним элементом, функция возвращает значение -2.

Настройка режима

Подпрограмма SetCachedExchangeMode должна получать два параметра: булево значение, предписывающее включить или отключить режим Cached Exchange Mode, и массив байтов, возвращаемый функцией GetExchangeConfig(). Аналогичная функции GetCachedExchangeMode() подпрограмма SetCachedExchangeMode сначала убеждается, что параметр arrBytes содержит массив, состоящий по крайней мере из двух элементов. Если эти условия выполнены, подпрограмма изменяет первые два байта в массиве, чтобы включить или отключить режим Cached Exchange Mode. Для включения режима Cached Exchange Mode сценарий использует побитовый оператор Or; для отключения — побитовый оператор And. Давайте посмотрим, как сценарий использует эти функции.

Подпрограмма Main

После объявления набора констант и единственной глобальной переменной для хранения экземпляра объекта StdRegProv сценарий вызывает подпрограмму Main. Данная подпрограмма Main отвечает за анализ параметров командной строки сценария, чтение и запись данных в реестр и так далее.

Сначала подпрограмма Main использует множество WScript.Arguments для определения параметров командной строки, переданных в сценарий. Если найден переключатель /?, подпрограмма вызывает подпрограмму Usage, которая отображает информацию по применению сценария и завершает работу. Если найден переключатель /v, подпрограмма устанавливает переменную blnVerbose в значение True, чтобы заставить сценарий выводить полезные для диагностики данные (т. е. версию программы outlook.exe, имя профиля и байты, хранящиеся в регистре).

Сценарий использует значение переменной lngCLFlags как битовую карту, а константы CL_xxx как флаги, чтобы определить, какие переключатели командной строки использовались. Если был указан параметр /enable, бит CL_ENABLE устанавливается в 1; если был указан параметр /disable, бит CL_DISABLE устанавливается в 1. Если использовались оба переключателя, сценарий выводит информацию по применению и завершает работу.

Затем сценарий пытается вызвать функцию GetOutlookVersion(), чтобы определить версию Outlook, и функцию GetVersionPortion(), чтобы определить номер основной версии. Если номер основной версии ниже 11, сценарий выводит сообщение об ошибке и завершает работу.

Если имя профиля указано не было, сценарий вызывает функцию профиля GetDefaultProfile(), чтобы определить имя профиля, используемого по умолчанию. Далее, вне зависимости от того, указано имя профиля или нет, сценарий вызывает функцию ProfileKeyExists(), чтобы определить, существует ли раздел для профиля в реестре. Если не существует, сценарий выводит сообщение об ошибке и завершает работу.

Потом сценарий вызывает функцию GetExchangeConfig(), чтобы получить содержание записи реестра 00036601 для указанного профиля. После этого сценарий вызывает функцию GetCachedExchangeMode(). Если эта функция возвращает значение ошибки (-2), сценарий выводит сообщение об ошибке и завершает работу.

Используя переменную lngCLFlags, сценарий определяет, что делать дальше. Если в команде не были указаны переключатели /enable и /disable, сценарий просто сообщает о текущем состоянии режима Cached Exchange Mode (включен или отключен). Код выхода сценария — 1 для включенного состояния; 0 — для отключенного состояния. Если один из указателей /enable или /disable был введен, сценарий вызывает подпрограмму SetCachedExchangeMode, чтобы соответственно модифицировать массив байтов, после чего вызывает функцию UpdateRegistry() для записи байтов обратно в реестр. Если данные записаны успешно, код выхода сценария — 0; в случае ошибки — любое значение, отличное от 0.

Снятие ограничений

Сценарий CachedExchange.vbs обеспечивает возможность, которой не хватает в политике Group Policy: способность включать и отключать режим Cached Exchange Mode для существующих профилей Outlook. Как и в случае любого другого сценария, изменяющего регистр, нужно обязательно делать резервные копии, проводить тщательные тестирования и использовать сценарий с осторожностью.

Билл Стюарт - Cистемный и сетевой администратор компании French Mortuary, Нью-Мехико. bill.stewart@frenchmortuary.com