从 Outlook 外接程序访问共享日历中的私人约会



我用C#开发了一个Outlook VSTO加载项。我需要从共享日历中读取现有约会以查看繁忙的时间段。我拥有所有共享日历的发布编辑权限,并且可以无缝处理非私人约会。

我唯一的问题是CalendarFolder.Items集合不包含具有olPrivateolPersonal Sensitivity设置的约会项目。而内置的Outlook日历视图则显示带有小锁图标的这些项目。

我知道私人约会只暴露开始和结束时间,这对我来说绝对足够了。

基础 Exchange 服务器版本为 2013。我们使用 Outlook 2013 和 2016。

知道什么会导致这种情况吗?

谢谢。


更新:

最后,我通过使用 EWS 托管 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
    }
}
// ...... 

这是设计使然。这些约会没有什么特别之处,其属性仍可使用扩展 MAPI(C++ 或 Delphi)进行访问。如果使用 Redemption(我是它的作者)是一个选项(它包装扩展 MAPI 并且可以从任何语言使用),则其 RDOAppointment 对象(可以从 RDOFolder 检索)将返回所有可用属性。

如果您使用 OutlookSpy 查看 MAPI 级别的数据(我也是它的作者 - 单击 IMessage 按钮或单击 IMAPIFolder 按钮并从 GetContentTable 选项卡打开约会)?

最新更新