C# 如何从Outlook加载项中接受的ICS文件中检索UID?

C# 如何从Outlook加载项中接受的ICS文件中检索UID?,c#,vsto,outlook-addin,mapi,C#,Vsto,Outlook Addin,Mapi,谢谢你的关注 我正在开发Outlook加载项,需要在用户接受时访问嵌入在.ics文件中的UID值: 如果我查看.ICS文件中的原始数据,我可以看到UID在那里: 我想知道当用户接受会议时会触发什么事件(我可以附加到该事件),并且,一旦我有了被接受的outlook对象,如何从中检索UID 更新: 多亏了Dmitry Streblechenko的帮助,我现在明白了全局约会Id只是UID的一个编码版本。他的工具在看到这一点时非常有用。尽管如此,我仍然停留在最后一部分,那就是将全局约会ID转换为C#

谢谢你的关注

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

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

我想知道当用户接受会议时会触发什么事件(我可以附加到该事件),并且,一旦我有了被接受的outlook对象,如何从中检索UID

更新: 多亏了Dmitry Streblechenko的帮助,我现在明白了全局约会Id只是UID的一个编码版本。他的工具在看到这一点时非常有用。尽管如此,我仍然停留在最后一部分,那就是将全局约会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!!!
    }
 }

您可以从AppointItem.GlobalAppointId属性中提取它。其格式记录在。如果数据段以“vCal Uid”开头,则Uid随后出现

谢谢,但当我访问GlobalAppointmentId属性时(放置一个断点,当用户接受会议请求时会命中该断点),它实际上是一个不同的、更长的字符串。这是我问题的原始原因实际上,我们正在尝试通过公共ID同步在线创建的会议和outlook中创建的会议。例如,原始邀请中的UID为“augkaa383mj7v641rdikluit70@google.com“但是Outlook对象中的全局约会ID为”“040000082000E00074C5B7101A82E008000000000000000000000000000000000000000320000007643616C2D55696401000006175676B613338336D6A3776343172646966C756974373040676F6F676C652E636F6D00“。再次感谢。是的,正如我之前提到的,UID iss嵌入在二进制属性中。您需要解析它。使用OutlookSpy查看数据-单击IMessage按钮,选择GlobalObjectId属性,单击Value属性旁边的“…”按钮。好的,我明白了,谢谢!我已经安装了OutlookSpy,现在就试试。它就在那里,谢谢!现在想知道如何在C#中抓住它。