2017-02-15 4 views
1

Merci de votre visite.Comment extraire un UID d'un fichier ICS accepté dans un ajout Outlook?

Je développe une Add-in Outlook et ont besoin d'accéder à la valeur UID intégré dans un fichier .ics lorsque l'utilisateur accepte:

enter image description here

Si je considère les données brutes du .ics, je peux voir que l'UID est là:

enter image description here

Je voudrais savoir ce que les incendies événement (que je peux attacher) lorsqu'un utilisateur accepte la réunion et, une fois que je les perspectives objet que est accepté, comment puis-je récupérer l'UID?

MISE À JOUR:

Merci à l'aide de Dmitry Streblechenko Je comprends maintenant que le rendez-vous mondial Id est juste une version codée de l'UID. Son outil OutlookSpy était très utile pour voir cela. Cela dit, je suis toujours coincé sur la dernière partie qui est de convertir l'ID de rendez-vous global à l'UID en C#. Google me conduit à cet exemple pour convertir la propriété EntryId, mais je ne trouve pas le schéma ou le code hexadécimal approprié pour obtenir la propriété ID de rendez-vous global et la valeur décodée. Toute suggestion sur la façon de modifier le code ci-dessous pour l'ID de rendez-vous global serait appréciée:

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)); 

Merci d'avance.

UNE SOLUTION

Je me rends compte que cela peut ne pas être la meilleure façon d'atteindre l'objectif, mais il fonctionne donc je suis annonce dans le cas où il aide à quelqu'un d'autre:

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!!! 
    } 
} 

Répondre

1

Vous pouvez extraire à partir de la propriété AppointmentItem.GlobalAppointmentID. Son format est documenté au https://msdn.microsoft.com/en-us/library/ee157690(v=exchg.80).aspx. Si la section Données commence par "vCal-Uid", l'UID suit.

+0

Merci, mais lorsque j'accède à la propriété GlobalAppointmentId (en plaçant un point d'arrêt qui est frappé lorsque l'utilisateur accepte la demande de réunion), il s'agit en fait d'une chaîne différente, beaucoup plus longue. C'était en fait la cause initiale de ma question, nous essayons de synchroniser les réunions créées en ligne et les réunions créées dans Outlook via un ID commun. –

+0

Par exemple, l'UID dans l'invitation d'origine est « [email protected] » mais l'ID global de rendez-vous dans l'objet Outlook est « 040000008200E00074C5B7101A82E0080000000000000000000000000000000000000000320000007643616C2D556964010000006175676B61613338336D6A37763634317264696B6C756974373040676F6F676C652E636F6D00 ». Merci encore. –

+0

Oui, comme je l'ai mentionné précédemment, l'UID est intégré dans cette propriété binaire. Vous auriez besoin de l'analyser. Jetez un oeil aux données avec OutlookSpy - cliquez sur le bouton IMessage, sélectionnez la propriété GlobalObjectId, cliquez sur le bouton "..." à côté de la propriété Value. –