EWS: acceda a todos los calendarios compartidos

Tengo el siguiente código:

private void ListCalendarFolders(ref List items, int offset) { var pageSize = 100; var view = new FolderView(pageSize, offset, OffsetBasePoint.Beginning); view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties); view.PropertySet.Add(FolderSchema.DisplayName); view.PropertySet.Add(FolderSchema.EffectiveRights); view.Traversal = FolderTraversal.Deep; FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, view); foreach (Folder myFolder in findFolderResults.Folders) { if (myFolder is CalendarFolder) { var folder = myFolder as CalendarFolder; items.Add(EBCalendar.FromEWSFolder(folder)); } } if (findFolderResults.MoreAvailable) { offset = offset + pageSize; ListCalendarFolders(ref items, offset); } } 

Donde el service es una instancia de ExchangeService service . Desafortunadamente, todavía muestra las carpetas que se han eliminado y no enumera los calendarios compartidos.

¿Cómo puedo obtener una lista de todos los calendarios compartidos, y cómo puedo conseguir que no incluya las carpetas que se han eliminado?

Por Calendarios Compartidos ¿te refieres a los calendarios en el otro nodo de calendarios en Outlook?

Nodo de otros calendarios

Si es así, estos elementos son NavLinks almacenados en la carpeta Vistas comunes en un buzón que se encuentra debajo de NonIPMSubtree (raíz), consulte http://msdn.microsoft.com/en-us/library/ee157359(v=exchg.80). .aspx . Puede usar EWS para obtener NavLinks de un buzón y usar la propiedad extendida PidTagWlinkAddressBookEID para obtener la dirección X500 del buzón al que hacen referencia estos enlaces y luego usar Resolver Name para resolverlo en una dirección SMTP. Entonces todo lo que tiene que hacer es enlazar a esa carpeta, por ejemplo

  static Dictionary GetSharedCalendarFolders(ExchangeService service, String mbMailboxname) { Dictionary rtList = new System.Collections.Generic.Dictionary(); FolderId rfRootFolderid = new FolderId(WellKnownFolderName.Root, mbMailboxname); FolderView fvFolderView = new FolderView(1000); SearchFilter sfSearchFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Common Views"); FindFoldersResults ffoldres = service.FindFolders(rfRootFolderid, sfSearchFilter, fvFolderView); if (ffoldres.Folders.Count == 1) { PropertySet psPropset = new PropertySet(BasePropertySet.FirstClassProperties); ExtendedPropertyDefinition PidTagWlinkAddressBookEID = new ExtendedPropertyDefinition(0x6854, MapiPropertyType.Binary); ExtendedPropertyDefinition PidTagWlinkGroupName = new ExtendedPropertyDefinition(0x6851, MapiPropertyType.String); psPropset.Add(PidTagWlinkAddressBookEID); ItemView iv = new ItemView(1000); iv.PropertySet = psPropset; iv.Traversal = ItemTraversal.Associated; SearchFilter cntSearch = new SearchFilter.IsEqualTo(PidTagWlinkGroupName, "Other Calendars"); // Can also find this using PidTagWlinkType = wblSharedFolder FindItemsResults fiResults = ffoldres.Folders[0].FindItems(cntSearch, iv); foreach (Item itItem in fiResults.Items) { try { object GroupName = null; object WlinkAddressBookEID = null; // This property will only be there in Outlook 2010 and beyond //https://msdn.microsoft.com/en-us/library/ee220131(v=exchg.80).aspx#Appendix_A_30 if (itItem.TryGetProperty(PidTagWlinkAddressBookEID, out WlinkAddressBookEID)) { byte[] ssStoreID = (byte[])WlinkAddressBookEID; int leLegDnStart = 0; // Can also extract the DN by getting the 28th(or 30th?) byte to the second to last byte //https://msdn.microsoft.com/en-us/library/ee237564(v=exchg.80).aspx //https://msdn.microsoft.com/en-us/library/hh354838(v=exchg.80).aspx String lnLegDN = ""; for (int ssArraynum = (ssStoreID.Length - 2); ssArraynum != 0; ssArraynum--) { if (ssStoreID[ssArraynum] == 0) { leLegDnStart = ssArraynum; lnLegDN = System.Text.ASCIIEncoding.ASCII.GetString(ssStoreID, leLegDnStart + 1, (ssStoreID.Length - (leLegDnStart + 2))); ssArraynum = 1; } } NameResolutionCollection ncCol = service.ResolveName(lnLegDN, ResolveNameSearchLocation.DirectoryOnly, false); if (ncCol.Count > 0) { FolderId SharedCalendarId = new FolderId(WellKnownFolderName.Calendar, ncCol[0].Mailbox.Address); Folder SharedCalendaFolder = Folder.Bind(service, SharedCalendarId); rtList.Add(ncCol[0].Mailbox.Address, SharedCalendaFolder); } } } catch (Exception exception) { Console.WriteLine(exception.Message); } } } return rtList; } 

Cheers Glen

Debe especificar un filtro de búsqueda. esto se describe aquí , aunque no estoy seguro de qué esquema es el correcto, supongo que sería Archivado.

Entonces harías algo como esto:

 SearchFilter searchFilter = new SearchFilter.IsEqualTo(FolderSchema.Archieved, false); FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot,searchFilter, view); 

La publicación de Glen es perfecta pero la carpeta de enlace da error. Sin embargo, resolví esto. En lugar de esta línea:

 Folder SharedCalendaFolder = Folder.Bind(service, SharedCalendarId); 

utilice la siguiente línea para el enlace de carpetas compartidas

 CalendarFolder calendar = CalendarFolder.Bind(service, new FolderId(WellKnownFolderName.Calendar, OwnerEmailAddress), new PropertySet()); 

Aquí OwnerEmailAddress es la dirección de correo electrónico del propietario o puede escribir ncCol [0] .Mailbox.Address si usa el código de Glen.