2014-05-20 15 views
8

Tôi đã có đoạn mã sau:EWS - Truy cập tất cả Shared Calendars

private void ListCalendarFolders(ref List<EBCalendar> 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); 
     } 
    } 

đâu service là một ví dụ ExchangeService. Thật không may, nó vẫn liệt kê các thư mục đã bị xóa và nó không liệt kê các lịch được chia sẻ.

Tôi làm cách nào để có thể liệt kê tất cả các lịch được chia sẻ và làm cách nào để tôi không bao gồm các thư mục đã bị xóa?

Trả lời

13

By Shared Calendars bạn có nghĩa là lịch dưới nút lịch khác trong Outlook?

Other Calendars Node

Nếu vậy những mục là NavLinks được lưu trữ trong thư mục xem thường gặp trong một Mailbox mà là dưới NonIPMSubtree (root) thấy http://msdn.microsoft.com/en-us/library/ee157359(v=exchg.80).aspx. Bạn có thể sử dụng EWS để lấy NavLinks từ một Mailbox và sử dụng thuộc tính mở rộng PidTagWlinkAddressBookEID để lấy địa chỉ X500 của Mailbox mà các Liên kết này đề cập đến và sau đó sử dụng Resolve Name để giải quyết nó đến một Địa chỉ SMTP. Sau đó, tất cả các bạn cần làm là Bind to rằng thư mục ví dụ

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

Cheers Glen

+0

Ồ, thật tuyệt vời. Tôi sẽ thử ngay bây giờ. Cảm ơn bạn! – synic

+0

Điều này hoạt động tuyệt vời để có được các thư mục lịch được chia sẻ. Nhưng bây giờ tôi gặp sự cố khi tôi cố truy cập các mục trong lịch được chia sẻ. Về cơ bản tôi cần có trạng thái rảnh/bận. Tôi đã gọi 'service.FindItems (SharedCalendaFolder.Id, iCalenderview)' và tôi nhận được "Quyền truy cập bị từ chối. Hãy kiểm tra thông tin đăng nhập và thử lại." lỗi. Nhưng trong ứng dụng web triển vọng, tôi có thể xem các sự kiện lịch được chia sẻ. – Dimuthu

+0

Để truy cập lịch, bạn sẽ cần ít nhất quyền truy cập đọc vào lịch, tôi cho rằng bạn chỉ có quyền FreeBusy vào lúc này để bạn chỉ có thể sử dụng thao tác GerUseravailiblity trong trường hợp đó trừ khi bạn gán nhiều quyền hơn cho thư mục lịch cho tài khoản của mình. –

1

Bạn cần chỉ định bộ lọc tìm kiếm. điều này được mô tả here, mặc dù tôi không chắc Schema là đúng, nhưng phỏng đoán của tôi sẽ được Lưu trữ.

Vì vậy, bạn sẽ làm điều gì đó như thế này:

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

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

Cảm ơn! Điều này giải quyết những người bị xóa hiển thị. Có bất kỳ ý tưởng nào về các thư mục được chia sẻ không hiển thị không? – synic

+0

Tôi báo rằng bạn không thể thực hiện việc này bằng cách sử dụng chế độ xem thư mục, thay vào đó bạn cần xác định FolderId bằng hộp thư đang chia sẻ thư mục. – CSharpie

+0

Nhưng tôi không biết ID thư mục. Tôi muốn có một danh sách tất cả các thư mục được chia sẻ/công khai/thuộc sở hữu. – synic

0

Glen bài được hoàn hảo nhưng ràng buộc folder cho lỗi. Tuy nhiên tôi đã giải quyết vấn đề này. Thay vì dòng này:

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

sử dụng dòng sau cho thư mục chia sẻ liên kết

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

Đây OwnerEmailAddress là Địa chỉ email của Chủ đầu tư hoặc bạn có thể viết ncCol [0] .Mailbox.Address nếu sử dụng mã của Glen .

Các vấn đề liên quan