Назад | Перейти на главную страницу

Поставщик услуг MAPI не работает в Outlook 2013+, но работает, если Outlook открывается через скрипт

Иметь поставщика услуг MAPI, который предоставляет настраиваемый вид папок в Outlook, отлично работает в 64-разрядной версии Outlook 2010. В Outlook 2013 64-бит и более поздних версий не удается открыть папки с ошибкой Не удается развернуть папку. Описание этой ошибки отсутствует.

Однако, если Outlook 2013+ запускается с помощью сценария PowerShell, как показано ниже, папки работают:

 Add-type -Assembly "Microsoft.Office.Interop.Outlook" | out-null
 $olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type] 
 $outlook = New-Object -ComObject Outlook.Application
 $namespace = $outlook.GetNameSpace("MAPI")
 $folder = $namespace.GetDefaultFolder($olFolders::olFolderInbox)
 $folder.Display()

В настоящее время я занимаюсь анализом различий с помощью Process Monitor, Rohitab API Monitor и Windbg, когда Outlook открывается этими способами.

Однако мне интересно узнать, знает ли кто-нибудь, чем отличается процесс запуска Outlook при запуске с помощью ярлыка от автоматизации, которая может повлиять на правильную работу поставщика услуг MAPI.

Класс olDefaultfolders в Microsoft.office.interop.outlook пространство имен - указать тип папки olFolderInbox для текущего профиля Microsoft Outlook, кроме того, единственный поддерживаемый тип пространства имен «MAPI”Из GetNameSpace Функционально эквивалентен свойству Session.

По вашему вопросу «не могу развернуть папку”И ваш сценарий, который устранил проблему, кажется, что что-то случилось с типом вашей папки профиля клиента Outlook, и сценарий, который вы публикуете, должен указать тип папки и установить сеанс папок.

Поскольку подробное описание ошибки недоступно, оно кажется наиболее близким к истине. Кроме того, если проблема все еще возникает, вы можете попробовать воссоздать профиль Outlook проблемной учетной записи в Панель управления а затем перезапустите клиент, чтобы проверить, существует ли проблема. Надеюсь, это поможет вам. :)

  • В Характеристики DLL Outlook.exe изменился между Outlook 2010 и Outlook 2013. Outlook 2010 имеет значение 8040, которое означает, что установлены свойства IMAGE_DLLCHARACTERISTICS_ DYNAMIC_BASE + IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE. Однако Outlook 2013 имеет значение 8160, которое включает те же свойства, что и Outlook 2010, но дополнительно устанавливает IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA+IMAGE_DLLCHARACTERISTICS_ NX_COMPAT свойства.

  • Обычно при запуске 64-разрядной версии Outlook 2013 все библиотеки DLL загружаются с произвольной базой изображений. Однако в 64-разрядной версии Outlook 2010 многие библиотеки DLL загружаются с базой изображений по умолчанию. 0x180000000. При запуске 64-разрядной версии Outlook 2013 через автоматизацию COM многие из этих DLL загружаются с базой изображений 0x180000000, как Outlook 2010. Однако при запуске с помощью ярлыка они каждый раз загружаются с другой базой изображений. Это можно подтвердить, прикрепив WinDbg в Outlook.exe и используя lmv команда для вывода загруженных модулей или инструмент, например Обозреватель процессов и установка Посмотреть -> Показать нижнюю панель на и настройка Посмотреть -> Нижняя панель -> в DLL затем добавляем столбцы Image Base.

  • Проверяя свойства процесса Outlook.exe с помощью Process Explorer, вы можете увидеть ключевое отличие на вкладке изображения:

Outlook 2010

  • Состояние предотвращения выполнения данных (DEP): включено (постоянно)

  • Рандомизация нагрузки адресного пространства: снизу вверх

  • Control Flow Guard: отключено

  • Контекст предприятия: N / A

Outlook 2013

  • Состояние предотвращения выполнения данных (DEP): включено (постоянно)
  • Рандомизация нагрузки адресного пространства: Высокая энтропия, Вверх дном, Принудительное перемещение
  • Control Flow Guard: отключено
  • Контекст предприятия: N / A

Вы можете использовать инструмент редактирования PE, например CFF Explorer для изменения характеристик DLL исполняемого образа. Однако, удалив некоторые из этих опций, вы увеличите площадь атаки, которой можно воспользоваться.