2014-05-20 8 views
8

मैं निम्नलिखित कोड मिल गया है। दुर्भाग्यवश, यह अभी भी फ़ोल्डरों को सूचीबद्ध करता है जिन्हें हटा दिया गया है, और यह साझा कैलेंडर सूचीबद्ध नहीं करता है।EWS पहुँच सभी साझा कैलेंडर

मैं इसे सभी साझा कैलेंडर सूचीबद्ध करने के लिए कैसे प्राप्त कर सकता हूं, और इसे हटाए गए फ़ोल्डर को शामिल करने के लिए मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

13

साझा कैलेंडर तक आप Outlook में अन्य कैलेंडर नोड के अंतर्गत कैलेंडर मतलब है?

Other Calendars Node

इसलिए इन आइटम NavLinks कि एक मेलबॉक्स NonIPMSubtree (रूट) के अधीन है, जिसमें आम दृश्य फ़ोल्डर में जमा हो जाती है कर रहे हैं http://msdn.microsoft.com/en-us/library/ee157359(v=exchg.80).aspx देखते हैं। आप मेलबॉक्स से NavLinks प्राप्त करने के लिए ईडब्ल्यूएस का उपयोग कर सकते हैं और मेलबॉक्स के X500 पते को प्राप्त करने के लिए PidTagWlinkAddressBookEID विस्तारित संपत्ति का उपयोग कर सकते हैं, इन लिंक का संदर्भ लें और उसके बाद किसी SMTP पते को हल करने के लिए नाम हल करें। तो फिर तुम सब करने की जरूरत है बाध्य करने के लिए उस फ़ोल्डर जैसे

 static Dictionary<string, Folder> GetSharedCalendarFolders(ExchangeService service, String mbMailboxname) 
    { 
     Dictionary<String, Folder> rtList = new System.Collections.Generic.Dictionary<string, Folder>(); 

     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<Item> 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; 
    } 

चीयर्स ग्लेन

+0

वाह, यह कमाल है। मैं इसे अभी आज़मा रहा हूं। धन्यवाद! – synic

+0

यह साझा कैलेंडर फ़ोल्डर प्राप्त करने के लिए बहुत अच्छा काम करता है। लेकिन जब मैं साझा कैलेंडर में आइटम तक पहुंचने का प्रयास करता हूं तो अब मुझे परेशानी हो रही है। असल में मुझे मुफ्त/व्यस्त स्थिति प्राप्त करने की आवश्यकता है। मैं 'सेवा पर कॉल कर रहा था। ढूँढें ITems (SharedCalendaFolder.Id, iCalenderview)' और मुझे "एक्सेस अस्वीकार कर दी गई है। प्रमाण-पत्र जांचें और पुनः प्रयास करें।" त्रुटि। लेकिन आउटलुक वेब ऐप में मैं साझा कैलेंडर ईवेंट देख सकता हूं। – Dimuthu

+0

कैलेंडर तक पहुंचने के लिए आपको कम से कम कैलेंडर तक पहुंच की आवश्यकता होगी, मैं कहूंगा कि इस समय आपके पास केवल फ्रीबुसी अधिकार हैं, इसलिए आप उस मामले में केवल GerUseravailiblity ऑपरेशन का उपयोग कर सकते हैं जब तक कि आप अपने खाते के कैलेंडर फ़ोल्डर में अधिक अधिकार नहीं देते। –

1

आपको एक खोज फ़िल्टर निर्दिष्ट करने की आवश्यकता है। यह here वर्णित है, हालांकि मुझे यकीन नहीं है कि कौन सी स्कीमा सही है, मेरा अनुमान प्राप्त होगा।

तो तुम कुछ इस तरह करना होगा:

SearchFilter searchFilter = new SearchFilter.IsEqualTo(FolderSchema.Archieved, false); 

FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot,searchFilter, view); 
+0

धन्यवाद! यह हटाए गए हटाए गए लोगों को हल करता है। साझा फ़ोल्डर के बारे में कोई जानकारी नहीं दिख रही है? – synic

+0

मुझे लगता है कि आप फ़ोल्डर दृश्य का उपयोग करके ऐसा नहीं कर सकते हैं, इसके बजाय आपको फ़ोल्डर साझा करने वाले मेलबॉक्स के साथ फ़ोल्डर आईडी को परिभाषित करने की आवश्यकता है। – CSharpie

+0

लेकिन मुझे फ़ोल्डर आईडी नहीं पता है। मुझे सभी साझा/सार्वजनिक/स्वामित्व वाले फ़ोल्डर्स की एक सूची चाहिए। – synic

0

ग्लेन पद है एकदम सही है लेकिन बाध्यकारी फ़ोल्डर त्रुटि देता है। हालांकि मैंने इसे हल किया। इस लाइन के बजाय:

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

साझा फ़ोल्डर के लिए निम्न पंक्ति का उपयोग बाध्यकारी

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

यहाँ OwnerEmailAddress मालिक का ई-मेल पता है या आप लिख सकते हैं ncCol [0] .Mailbox.Address ग्लेन के कोड का उपयोग करता है, तो ।

संबंधित मुद्दे