2017-01-17 4 views
0

Я разрабатываю надстройку Outlook VSTO на C#. Мне нужно прочитать существующие встречи из общих календарей, чтобы увидеть занятые временные интервалы. У меня есть разрешение редактора публикации на все общие календари, и он работает с неединственными встречами без проблем.Доступ к частным встречам в общем календаре из надстройки Outlook

Моя единственная проблема в том, что CalendarFolder.Items коллекция не содержит предметы, имеющие назначение olPrivate или настройки olPersonal чувствительности. В то время как встроенный просмотр календаря Outlook показывает эти элементы с маленьким значком блокировки.

Я понимаю, что частные встречи выставляют только время начала и окончания, и для меня это было бы абсолютно для меня.

Основная версия Обмен сервера 2013. Мы используем Outlook 2013 и 2016.

Любая идея, что может привести к этому?

спасибо.


UPDATE:

Наконец я нашел решение этой проблемы с помощью EWS Managed API 2.0.

using Microsoft.Exchange.WebServices.Data; 
// ...... 
ExchangeService EWSService = new ExchangeService(); 
EWSService.Credentials = new WebCredentials("EXCHUser", "EXCHPW"); 
EWSService.Url = new Uri("https://...../EWS/Exchange.asmx"); 

Mailbox primary = new Mailbox(Tools.MainWindow.SelectedConsultant.Email); 
var calendar = Microsoft.Exchange.WebServices.Data.CalendarFolder.Bind(EWSService, 
       new FolderId(WellKnownFolderName.Calendar, primary)); 
ItemView cView = new ItemView(100); 

// Limit the properties returned to the appointment's subject, 
//      start time, end time and sensitivity. 
cView.PropertySet = new PropertySet(AppointmentSchema.Subject, 
            AppointmentSchema.Start, 
            AppointmentSchema.End, 
            AppointmentSchema.Sensitivity); 

// Filter by sensitivity and retrieve a collection of appointments by using the item view. 
String SearchFilterValue = Sensitivity.Private.ToString(); 
SearchFilter.IsEqualTo filter = new SearchFilter.IsEqualTo(AppointmentSchema.Sensitivity, SearchFilterValue); 
FindItemsResults<Item> appointments = calendar.FindItems(filter, cView); 
foreach (Appointment a in appointments) 
{ 
    if (a.Sensitivity == Sensitivity.Private) 
    { 
     // Do what you want with the matched item 
    } 
} 
// ...... 
+0

Имейте в виду, что EWS требует, чтобы вы предоставили учетные данные, и, поскольку вы работаете с онлайн-почтовым ящиком, данные могут быть не синхронизированы с тем, что вы видите в Outlook. Данные есть локально, вам просто нужно обойти OOM с Extended MAPI или Redemption. –

+0

Да, я знаю, спасибо. В моей нынешней ситуации это приемлемый компромисс. – Hudgi

ответ

1

Это по дизайну. В этих встречах нет ничего особенного, и их свойства по-прежнему доступны с помощью Extended MAPI (C++ или Delphi). Если опция Redemption является опцией (она переносит Extended MAPI и может использоваться с любого языка), ее объект RDOAppointment (который может быть получен из RDOFolder) вернет все доступные свойства.

Вы можете увидеть данные на уровне MAPI, если вы посмотрите на него, используя OutlookSpy (нажмите кнопку «Сообщение» или нажмите кнопку «IMAPIFolder» и откройте встречи на вкладке GetContentsTable)?

+0

Спасибо, Димитрий, у меня есть OutlookSpy (отличная работа)! Нет. Я не могу использовать OutlookSpy в этом случае, потому что я даже не могу выбрать элемент в папке календаря, он не будет полностью фокусироваться. – Hudgi

+0

Вы все еще можете нажать IMAPIFolder, перейдите на вкладку GetContentsTable и откройте встречу оттуда. –

+0

Ах, да, теперь я вижу это. Он указан как _IPM.Appointment_ в левой части. PR_SENSITIVITY имеет значения 2 (SENSITIVITY_PRIVATE). PR_START_DATE и PR_END_DATE имеют значимые значения. – Hudgi

Смежные вопросы