Укороченная версия

Я пытаюсь получить доступ к TimeZoneStruct с помощью VSTO из встречи Outlook. При попытке доступа к нему выдается следующая ошибка.

System.Runtime.InteropServices.COMException (0x80040102): Object does not support property "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102".

Интересно, что я могу получить аналогичное свойство, TimeZoneDescription, используя тот же метод без исключений: http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F

Мой код ниже; первый вызов GetProperty завершается успешно, а второй - нет.

//OK returns TimeZone Description string
dynamic tz1 = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F"); 

//NOK throws a COMException
dynamic tzStruct = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102");

Длинная версия

Я разрабатываю плагин, который читает календарь Outlook.

В настоящее время проблема связана с повторяющимися встречами, которые были созданы для разных часовых поясов с разными настройками перехода на летнее время.

Чтобы найти все встречи из серии повторяющихся встреч, мне нужна информация о часовом поясе.

Первый подход, который я использовал, заключался в получении информации о часовом поясе путем извлечения имени часового пояса. Это работает в большинстве случаев, но не идеально.

Outlook.PropertyAccessor pa = appointment.PropertyAccessor;
dynamic tz1 = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F");

Это возвращает строку, подобную (UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen.

Это работает правильно, но встречи, которые были отправлены с ПК с разными языками, или в случае «старых» встреч с «устаревшими» часовыми поясами, которые были удалены в Центре обновления Windows, это не работает так хорошо.

Я буду получать встречи с компьютеров на других языках, например, этот часовой пояс на французском языке, и мой компьютер его не найдет. (UTC+03:00) Moscou, Saint-Pétersbourg, Volgograd

Также есть обновления; этот часовой пояс ниже больше не существует. В 2016 году Волоград был переведен в свой часовой пояс в UTC + 04:00. См. ссылка от Microsoft .

  • Старый: (UTC+03:00) Moscow, St. Petersburg, Volgograd
  • Новое: (UTC+03:00) Moscow, St. Petersburg

Очевидно, сопоставление имени часового пояса никогда не сработает.

Я сосредотачиваюсь на получении полной информации с помощью TimeZoneStruct вместо этого; что должно позволить мне создать собственный объект TimeZoneInfo; а потом я смогу преобразовать его в местное время.

Моя проблема в том, что при попытке доступа к этой структуре я получаю следующую ошибку: System.Runtime.InteropServices.COMException (0x80040102): Object does not support property "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102".

Я посмотрел OutlookSpy и вижу, что свойство действительно доступно.

Я использую .NET Framework 4.6; Outlook 2016; Visual Studio 2015; Windows 8.1.

Какие-либо предложения?

ОБНОВИТЬ

Я пытаюсь получить доступ к этому свойству с помощью VBscript в Outlook Spy и получаю аналогичную ошибку. Свойства, которые не являются PT_BINARY, по какой-то причине работают. Любые идеи?

Вот как повторить эксперимент

Используя OutlookSpy, выберите повторяющуюся встречу. Убедитесь, что вы выбираете мастер и открываете «Текущий элемент», чтобы запустить сценарий для текущего AppointmentItem.

Введите следующий код. Смотрите скриншот для справки.

set msg = AppointmentItem
set pa = msg.PropertyAccessor

debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F")
debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82310003")
debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102")

Trying to obtain property with OutlookSpy

1
idocgreen 13 Мар 2019 в 08:51

1 ответ

Лучший ответ

Outlook любит играть в Большого брата, чтобы помешать вам изменить или даже получить доступ к некоторым свойствам, которые он считает особенными.

Использование расширенного MAPI (C ++ или Delphi) или Redemption (любой язык, я являюсь его автором) вместо OOM это единственный обходной путь.

1
Dmitry Streblechenko 13 Мар 2019 в 22:28