我用C#开发了一个Outlook VSTO加载项。我需要从共享日历中读取现有约会以查看繁忙的时间段。我拥有所有共享日历的发布编辑权限,并且可以无缝处理非私人约会。
我唯一的问题是CalendarFolder.Items集合不包含具有olPrivate或olPersonal 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 选项卡打开约会)?