MS Exchange server cloud, getting all items in a different - c#

I am trying to figure out how to access all items from a 'room' account.
Is it possible to somehow access the data from the room when that user isn't a real user?
I can get all rooms but the question is how to query the finditems using the room account.

You will need to authenticate as some user with a Mailbox and then grant that user access to the Room's Calendar (or the whole mailbox using Add-MailboxPermissions) or make it a delegate. Then you can just use the FolderId overload to specify you want to query that Room's Calendar folder eg
FolderId RoomMailboxCalendarFolderId = new FolderId(WellKnownFolderName.Calendar, "room#domain.com");
CalendarView cvCalView = new CalendarView(DateTime.Now, DateTime.Now.AddDays(31));
FindItemsResults<Appointment> appointments = service.FindAppointments(RoomMailboxCalendarFolderId, cvCalView);
Cheers
Glen

Related

VSTO - How get account email address from Outlook.Store entity

Some time ago to get Outlook accounts and account info (e.g. Email address, SMTP address) i was use Outlook.Accounts entity, but Outlook.Accounts caches data and doesn't support events like Add/Remove. Here I was offered to switch to Outlook.Stores (Outlook.Store) entity, but I don’t understand how I can get the Email address from Outlook.Store at least.
If the store is associated with any account configured in Outlook you can use the following code which iterates over all accounts configured and finds the required one where you may ask for an email address:
Outlook.Account GetAccountForFolder(Outlook.Folder folder)
{
// Obtain the store on which the folder resides.
Outlook.Store store = folder.Store;
// Enumerate the accounts defined for the session.
foreach (Outlook.Account account in Application.Session.Accounts)
{
// Match the DefaultStore.StoreID of the account
// with the Store.StoreID for the currect folder.
if (account.DeliveryStore.StoreID == store.StoreID)
{
// Return the account whose default delivery store
// matches the store of the given folder.
return account;
}
}
// No account matches, so return null.
return null;
}
The Account.SmtpAddress property returns a string representing the Simple Mail Transfer Protocol (SMTP) address for the Account. The purpose of SmtpAddress and Account.UserName is to provide an account-based context to determine identity. If the account does not have an SMTP address, SmtpAddress returns an empty string.
Generally, stores do not have an intrinsic identity - imagine a standalone PST store: there is no user identity associated with it. Or you can have multiple POP3/SMTP accounts delivering to the same PST store - you now have multiple identities associated with the PST store.
Or imagine having a PF store - it is accessible to multiple users without having its own identity.
Only Exchange stores have a notion of an owner. You can go from an Exchange store to an email account by looping through the Namespace.Accounts collection and comparing (using Namespace.CompareEntryIDs) the entry id of your store in question and the store exposed by the Account.DeliveryStore property.
If using Redemption is an option (I am its author), it exposes the Exchange mailbox owner directly through the RDOExchangeMailboxStore.Owner property (returns RDOAddressEntry object).

EWS: Mailbox address from a Calendar FolderId, is it possible?

I have stored Calendar FolderIds in order report on calendar events which a user has access to. I'm using Exchange Web Services via c# (using Microsoft.Exchange.WebServices)
These calendars can be associated with the authenticated user's mailbox, a shared mailbox, an impersonated|delegated mailbox, or a public mailbox. And now I'd like to go from the FolderId to the mailbox address.
Ideally there'd be a function to
string address = getMailboxAddress(new FolderId("AAJk...AA="));
If you have the FolderId what you have is the EWS version of this https://msdn.microsoft.com/en-us/library/ee217297(v=exchg.80).aspx which means with the data you have doesn't contain the Email Address. You would be better at the time you store the CalendarId store the Email address its associated with.
You can try using ConvertId with a generic non resolvable email Address this should return the EmailAddress the folder belongs (won't work for Public Folder) to eg
AlternateId aiAlternateid = new AlternateId(IdFormat.EwsId, SharedFoder.Id.UniqueId, "mailbox#domain.com");
AlternateIdBase aiResponse = service.ConvertId(aiAlternateid, IdFormat.EwsId);
Console.WriteLine(((AlternateId)aiResponse).Mailbox);
Cheers
Glen

Creating appointments on other calendars, shared with me, using EWS API

I hope this is the right forum to ask this question.
My requirement is as mentioned below:
-> I need to create an appointment on my Default calendar and the same on other calendars that are shared with me (or created by me and shared with others) by using Exchange Services (EWS).
-> By shared, i mean all those calendars that I can see under my 'Other Calendars' group in Office 365.
-> Now, I have reffered many links which help to create appointments on my mailbox, default Calendar. This part works fine(Link : (http://technico.qnownow.com/how-to-create-appointment-using-ews-exchange-web-services/)
-> Then I moved on to access shared calendars so that I can create the same appointment on them.
Used this : EWS - Access All Shared Calendars
-> However I do not get the PidTagWlinkAddressBookEID property in any of the items fetched.
The code works fine till I get the fiResults collection.
I get names of all the calendars under Other Calendars section in this collection.
The problem is when I iterate over this collection (as you can see in the code) , i am trying to get the PidTagWlinkAddressBookEID property value in each item and its not present in the item.
And this is the reason I am not able to retrieve the FolderID at the end.
But i tried number of ways to do it since i get the collection of items and I can see my shared calendars' names in those items.
Since i created the shared calendars, I tried to use my mailbox address at the end in this part of the code :
FolderId SharedCalendarId = new FolderId(WellKnownFolderName.Calendar, ncCol[0].Mailbox.Address);
However the calendar retrieved in this case is the default calendar with displayName as Calendar.
Since each item in the itemcollection ( fiResults collection) represents the corresponding shared calendar
Please let me know if we can use any property in the Item class to create an appointment.
I tried one more approach to create appointments on shared calendars:
First i tried to access all the calendar folders by using:
private void ViewCalendarFolders(string mailBox)
{
ExtendedPropertyDefinition PR_Folder_Path = new ExtendedPropertyDefinition(26293, MapiPropertyType.String);
PropertySet psPropSet = new PropertySet(BasePropertySet.FirstClassProperties);
psPropSet.Add(PR_Folder_Path);
FolderId rfRootFolderid = new FolderId(WellKnownFolderName.Root, mailBox);
FolderView fvFolderView = new FolderView(1000);
fvFolderView.Traversal = FolderTraversal.Deep;
fvFolderView.PropertySet = psPropSet;
SearchFilter sfSearchFilter = new SearchFilter.IsEqualTo(FolderSchema.FolderClass, "IPF.Appointment");
FindFoldersResults ffoldres = exchangeService.FindFolders(rfRootFolderid, sfSearchFilter, fvFolderView);
var res = ffoldres.Where(f => f is CalendarFolder).ToList();
if (res.Any())
{
foreach (Folder fld in res)
{
Console.WriteLine(fld.DisplayName);
}
}
}
Then I tried to create appointments on the CalendarFolders fetched.
I succeeded in creating appointments on two calendars:
1) My default calendar
2) The calendar which I have created and shared with others.
the piece of code shown above fetches all the calendar folders except those which are created by other users and shared with me. (Even though I can see them under the Other Calendars section in office 365 and can even create appointments on them through UI i.e. manually)
Kindly let me know how to create appointments on such calendars which are shared by others with me.
Note: I have Editor rights on these type of calendars
Thanks

How to use Microsoft Exchange Web Services to retrieve meeting form other contacts in the same domain?

I would like to retrieve calender items from Outlook 2010. Currently I could only retrieve items from my own calender by following this tutorial. But I want to get meeting from my colleagues calender. I have tried many option so far but nothing is working. Could you please show me how to use these api to get all calender meeting from the same exchange server? Thanks in advance!
Well, there is no answer within 2 days. Meanwhile I found a way to access others calender. I want to share my solution so that other can get a helsp:-
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
service.Credentials = new WebCredentials();
Mailbox principle = new Mailbox("usedr#domain.com");
CalendarFolder calendar2 = CalendarFolder.Bind(service, new FolderId(WellKnownFolderName.Calendar, principle), new PropertySet());
// Retrieve a collection of appointments by using the calendar view.
FindItemsResults<Appointment> appointments2 = calendar2.FindAppointments(cView2);
appointments2 should have all the calender meeting.

Accessing a Resource Calendar with no mailbox via EWS and C#

Our Exchange Admins (Exchange 2010 SP1) have setup a shared resource calendar. There is no mailbox assigned to this resource calendar. I want to be able to read the meetings using EWS and C#.
Snippet:
ExchangeService esvc = new ExchangeService(ExchangeVersion.Exchange2010);
esvc.Credentials = new WebCredentials(username, password, "ourplace.org");
esvc.Url = new Uri("https://OWA.OURPLACE.ORG/EWS/Exchange.asmx");
FolderId shareFolderId = new FolderId(WellKnownFolderName.Calendar, "Shared Calendar Name");
CalendarFolder.Bind(esvc, shareFolderId);
the bind statement throws the error: "The SMTP address has no mailbox associated with it."
How can I read the items on a Share Resource Calendar that has no associated mailbox... or is it even possible?
Thanks !!
Bind to that Calendar with a mail-Adress
Create first of all a FolderId:
FolderId parkplatzCalendarId = new FolderId(WellKnownFolderName.Calendar,"de.calendar.name#company.com");
Then bind to this one:
CalendarFolder calendar = CalendarFolder.Bind(_service, parkplatzCalendarId);
Now you can use this calendar!
CalendarView cView = new CalendarView(start, end, int.MaxValue);
cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End, AppointmentSchema.Duration, AppointmentSchema.LastModifiedName, AppointmentSchema.Organizer, AppointmentSchema.Categories);
FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);
With something like that ;D
If the calendar is actually not in any particular mailbox, then it should be in a public folder, and you should look in a subfolder WellKnownFolderName.PublicFoldersRoot.
Otherwise, please tell where exactly does it appear in Outlook folders hierarchy.

Categories