如何从Outlook添加的ICS文件中检索UID?

时间:2017-02-15 20:13:32

标签: c# vsto outlook-addin mapi

感谢您的光临。

我正在开发一个Outlook加载项,当用户接受它时,需要访问嵌入在.ics文件中的UID值:

enter image description here

如果我在.ICS文件中查看原始数据,我可以看到UID在那里:

enter image description here

我想知道当用户接受会议时会触发哪些事件(我可以附加),一旦我接受了outlook对象,我该如何从中检索UID?

更新:

感谢Dmitry Streblechenko的帮助,我现在明白Global Appointment Id只是UID的编码版本。他的工具OutlookSpy在看到这个时非常有用。也就是说,我仍然坚持最后一部分,即将全局约会ID转换为C#中的UID。 Google引导我使用此示例来转换EntryId属性,但我无法找到正确的架构或十六进制代码来获取全局约会ID属性和已解码的值。有关如何修改以下代码以获取全球约会ID的任何建议将不胜感激:

var oPA = appt.PropertyAccessor;

//Get EntryId Value
var entryIDProperty = "http://schemas.microsoft.com/mapi/proptag/0x0FFF0102";
var entryId= oPA.BinaryToString(oPA.GetProperty(entryIDProperty));

//Now how to get the Global Appointment ID??
var globalApptProperty = http://schemas.microsoft.com/mapi/proptag/0x????????";
var globalId= oPA.BinaryToString(oPA.GetProperty(globalApptProperty ));

提前致谢。

解决方案

我意识到这可能不是实现目标的最佳方式,但它确实有用,所以我发帖以防其他人:

var item = Item as Outlook.MeetingItem;
var appt = item.GetAssociatedAppointment(false);              
var oPA = appt.PropertyAccessor;

//This parses the Global Appointment ID to a byte array. We need to retrieve    the "UID" from it (if available).
byte[] bytes = (byte[]) oPA.StringToBinary(appt.GlobalAppointmentID);

//According to https://msdn.microsoft.com/en-us/library/ee157690(v=exchg.80).aspx we don't need first 40 bytes            
if (bytes.Length>=40)
{                    
   byte[] bytesThatContainData = new byte[bytes.Length - 40];
   Array.Copy(bytes, 40, bytesThatContainData, 0, bytesThatContainData.Length);

   //In some cases, there won't be a UID.
   var test = Encoding.UTF8.GetString(bytesThatContainData, 0, bytesThatContainData.Length);

   if (test.StartsWith("vCal-Uid"))
   {
      //remove vCal-Uid from start string and special symbols
      test = test.Replace("vCal-Uid", string.Empty);
      test = test.Replace("\u0001", string.Empty);
      test = test.Replace("\0", string.Empty);

      //Here is the result
      var uid = test;
    }else{
      // Bad format!!!
    }
 }

1 个答案:

答案 0 :(得分:1)

您可以从AppointmentItem.GlobalAppointmentID属性中提取它。其格式记录在https://msdn.microsoft.com/en-us/library/ee157690(v=exchg.80).aspx。如果数据部分以" vCal-Uid"开头,则UID如下。