A Microsoft Outlook email forum. Outlook Banter

If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

Go Back   Home » Outlook Banter forum » Microsoft Outlook Email Newsgroups » Add-ins for Outlook
Site Map Home Register Authors List Search Today's Posts Mark Forums Read Web Partners

Programmatically finding calendar folders for Exchange server users



 
 
Thread Tools Search this Thread Display Modes
  #1  
Old November 14th 06, 03:00 AM posted to microsoft.public.outlook.program_addins
Tony Gravagno
external usenet poster
 
Posts: 12
Default Programmatically finding calendar folders for Exchange server users

I'm writing a Windows Service that retrieves appointment data from a
separate application, and it posts this data into the calendar for
individual exchange users. I'm using PIA with C# for all work so far
and it seems OK. The problem is ensuring I'm posting new appointments
to the right folders. I can easily open the default calendar folder
in a PST, but I don't know the approach for Exchange.

One of the admin users manually opens other people's calendars in his
own client instance. I'm wondering what the best technique would be
for doing this programmatically. How do I discover what accounts are
available and then attach to their shared calendar?

Do I need to .Login to a user to post to their folder? Is the
password required? (They're using active directory.) Once I login
I'm sure I can use the user's namespace to navigate to their calendar.

We could setup Outlook on the server running this process so that it
is aware of all calendars that it needs to update, then I think
posting to a folder would be as simple as doing a lookup on the local
namespace for a folder with the user name. But there are (at least)
two issues he 1) I'd rather not have to put someone through that
manual exercise. 2) I don't know how I would translate a Windows user
ID to a name as we see when we look under "Other Calendars" when
sharing - I guess I'd have to store that name and use it as the folder
name when doing the search.

I hope that's not too confusing.
Thanks!
Ads
  #2  
Old November 14th 06, 06:05 AM posted to microsoft.public.outlook.program_addins
Dmitry Streblechenko
external usenet poster
 
Posts: 2,116
Default Programmatically finding calendar folders for Exchange server users

See Namespace.GetSharedDefaultFolder.
Keep in mind that Outlook cannot be used from a Windows service.

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool

"Tony Gravagno" wrote in message
...
I'm writing a Windows Service that retrieves appointment data from a
separate application, and it posts this data into the calendar for
individual exchange users. I'm using PIA with C# for all work so far
and it seems OK. The problem is ensuring I'm posting new appointments
to the right folders. I can easily open the default calendar folder
in a PST, but I don't know the approach for Exchange.

One of the admin users manually opens other people's calendars in his
own client instance. I'm wondering what the best technique would be
for doing this programmatically. How do I discover what accounts are
available and then attach to their shared calendar?

Do I need to .Login to a user to post to their folder? Is the
password required? (They're using active directory.) Once I login
I'm sure I can use the user's namespace to navigate to their calendar.

We could setup Outlook on the server running this process so that it
is aware of all calendars that it needs to update, then I think
posting to a folder would be as simple as doing a lookup on the local
namespace for a folder with the user name. But there are (at least)
two issues he 1) I'd rather not have to put someone through that
manual exercise. 2) I don't know how I would translate a Windows user
ID to a name as we see when we look under "Other Calendars" when
sharing - I guess I'd have to store that name and use it as the folder
name when doing the search.

I hope that's not too confusing.
Thanks!



  #3  
Old November 14th 06, 11:34 PM posted to microsoft.public.outlook.program_addins
Tony Gravagno
external usenet poster
 
Posts: 12
Default Programmatically finding calendar folders for Exchange server users

Thanks Dmitry! Well, a licensed instance of Outlook can be used from
a Windows service, it's just not a good idea. What's the alternative?
I've written apps that ran in the Windows tray to keep them
unobtrusive, but my users didn't like them because they needed to have
a user logged-in all the time in order to use them. I can easily
shift this code into an add-in (it's already encapsulated for this
sort of thing) which only gets run when someone is running Outlook,
maybe when they click a button. But what if that person is on
vacation? - These tasks may not get done for a couple weeks. As an
unattended service this process is independent of individuals.

Does anyone know if Outlook 2007 or some other tool (VSTO?) is better
for doing this sort of unattended, user-independent operation?

Regards,
Tony

"Dmitry Streblechenko" wrote:

See Namespace.GetSharedDefaultFolder.
Keep in mind that Outlook cannot be used from a Windows service.

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool

"Tony Gravagno" wrote in message
I'm writing a Windows Service that retrieves appointment data from a
separate application, and it posts this data into the calendar for
individual exchange users. I'm using PIA with C# for all work so far
and it seems OK. The problem is ensuring I'm posting new appointments
to the right folders. I can easily open the default calendar folder
in a PST, but I don't know the approach for Exchange.

[snip]

  #4  
Old November 15th 06, 04:19 PM posted to microsoft.public.outlook.program_addins
Ken Slovak - [MVP - Outlook]
external usenet poster
 
Posts: 5,848
Default Programmatically finding calendar folders for Exchange server users

No version of Outlook should ever be run in a Windows service. It's not that
it's not a good idea, it's a really bad idea. Outlook puts up all sorts of
user prompts and there's no way to disable them. That's aside from the user
impersonation issues. You'll never find anyone who recommends using Outlook
in a service. If you must do something like that use CDO 1.21 or Extended
MAPI or Redemption instead in the service.

--
Ken Slovak
[MVP - Outlook]
http://www.slovaktech.com
Author: Absolute Beginner's Guide to Microsoft Office Outlook 2003
Reminder Manager, Extended Reminders, Attachment Options
http://www.slovaktech.com/products.htm


"Tony Gravagno" wrote in message
...
Thanks Dmitry! Well, a licensed instance of Outlook can be used from
a Windows service, it's just not a good idea. What's the alternative?
I've written apps that ran in the Windows tray to keep them
unobtrusive, but my users didn't like them because they needed to have
a user logged-in all the time in order to use them. I can easily
shift this code into an add-in (it's already encapsulated for this
sort of thing) which only gets run when someone is running Outlook,
maybe when they click a button. But what if that person is on
vacation? - These tasks may not get done for a couple weeks. As an
unattended service this process is independent of individuals.

Does anyone know if Outlook 2007 or some other tool (VSTO?) is better
for doing this sort of unattended, user-independent operation?

Regards,
Tony


  #5  
Old November 15th 06, 09:27 PM posted to microsoft.public.outlook.program_addins
Tony Gravagno
external usenet poster
 
Posts: 12
Default Programmatically finding calendar folders for Exchange server users

Heeding the advice of respected authorities I'll switch the internals
to Redemption as soon as possible. For now I'll migrate my code into
an add-in.

Thank you kindly.

"Ken Slovak - [MVP - Outlook]" wrote:

No version of Outlook should ever be run in a Windows service. It's not that
it's not a good idea, it's a really bad idea. Outlook puts up all sorts of
user prompts and there's no way to disable them. That's aside from the user
impersonation issues. You'll never find anyone who recommends using Outlook
in a service. If you must do something like that use CDO 1.21 or Extended
MAPI or Redemption instead in the service.


  #6  
Old November 16th 06, 08:51 AM posted to microsoft.public.outlook.program_addins
Tony Gravagno
external usenet poster
 
Posts: 12
Default Programmatically finding calendar folders for Exchange server users

"Dmitry Streblechenko" wrote:
See Namespace.GetSharedDefaultFolder.


My code to update Exchange Server shared calendars is working.
Thanks! At this point I'm confused about why it's actually working.
(That's a new one, eh?) I login to the namespace and created a
recipient for the shared folder (doesn't seem to be a need to resolve
it). I then get a reference to the MAPIFolder:
olRemoteCalendar = olns.GetSharedDefaultFolder(
olRecipient,
PIA.Outlook.OlDefaultFolders.olFolderCalendar);

I create the AppointmentItem with no reference to the folder.
olAppointmentItem =
(PIA.Outlook.AppointmentItem)
olapp.CreateItem(
PIA.Outlook.OlItemType.olAppointmentItem);
And then I post it with the .Save() method.

It goes where it should, but I don't understand how it knows where to
save the item. I thought I would have to explicitly tell it, so I
spent hours playing with the MAPIFolder.Items.Add(object) method, but
it never seemed to accept whatever Type I put in there - including an
appointment item.

Is it correct that we're not just setting references but that we're
actually setting state when we create certain objects? The following
is my understanding based on what I'm seeing:
The Namespace comes from the App.
When the Namespace is logged into a user, it's the app that's
logged-in to that user.
Creating a MAPIFolder using GetSharedDefaultFolder doesn't just
return a reference to the folder, it sets the current folder for the
namespace and the app for subsequent operations.
The Save method on items (all of them?) saves to wherever the
application is currently pointed.

Right track?

Thanks again!
  #7  
Old November 16th 06, 07:48 PM posted to microsoft.public.outlook.program_addins
Dmitry Streblechenko
external usenet poster
 
Posts: 2,116
Default Programmatically finding calendar folders for Exchange server users

Are you sure about that? Application.CreateItem() creates new item in the
corresponding default fodler, which would be current user's Calendar folder
in your case.
How did you call MAPIFolder.Items.Add? It eother takes a message class
(string, in your case "IPM.Appointment") or one of the OlItemType enums
(olAppointmentItem in your case).

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool

"Tony Gravagno" wrote in message
...
"Dmitry Streblechenko" wrote:
See Namespace.GetSharedDefaultFolder.


My code to update Exchange Server shared calendars is working.
Thanks! At this point I'm confused about why it's actually working.
(That's a new one, eh?) I login to the namespace and created a
recipient for the shared folder (doesn't seem to be a need to resolve
it). I then get a reference to the MAPIFolder:
olRemoteCalendar = olns.GetSharedDefaultFolder(
olRecipient,
PIA.Outlook.OlDefaultFolders.olFolderCalendar);

I create the AppointmentItem with no reference to the folder.
olAppointmentItem =
(PIA.Outlook.AppointmentItem)
olapp.CreateItem(
PIA.Outlook.OlItemType.olAppointmentItem);
And then I post it with the .Save() method.

It goes where it should, but I don't understand how it knows where to
save the item. I thought I would have to explicitly tell it, so I
spent hours playing with the MAPIFolder.Items.Add(object) method, but
it never seemed to accept whatever Type I put in there - including an
appointment item.

Is it correct that we're not just setting references but that we're
actually setting state when we create certain objects? The following
is my understanding based on what I'm seeing:
The Namespace comes from the App.
When the Namespace is logged into a user, it's the app that's
logged-in to that user.
Creating a MAPIFolder using GetSharedDefaultFolder doesn't just
return a reference to the folder, it sets the current folder for the
namespace and the app for subsequent operations.
The Save method on items (all of them?) saves to wherever the
application is currently pointed.

Right track?

Thanks again!



  #8  
Old November 19th 06, 01:39 AM posted to microsoft.public.outlook.program_addins
Tony Gravagno
external usenet poster
 
Posts: 12
Default Programmatically finding calendar folders for Exchange server users

"Dmitry Streblechenko" wrote:
Are you sure about that? Application.CreateItem() creates new item in the
corresponding default fodler, which would be current user's Calendar folder
in your case.
How did you call MAPIFolder.Items.Add? It eother takes a message class
(string, in your case "IPM.Appointment") or one of the OlItemType enums
(olAppointmentItem in your case).

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool



I did my homework and as (almost) always Dmitry, you're right.

Once again I was confused. For anyone else trying to do this, here is
the code for creating an appointment in different folders, depending
on whether it's the local PST (same as local user on Exchange), or a
shared folder. I've removed all error handling and hacked up the code
to make it a little more explanatory - this will not run as-is but
almost. I recommend anyone else who's doing this definitely handle
all issues, and be sure to close, displose, and null all objects where
possible.

PIA.Outlook.Recipient olRecipient =
olns.CreateRecipient(sharename);
// resolution not necessary with correct name
// casing on name doesn't matter.

if (olRecipient != null)
{
olRemoteCalendar =
olns.GetSharedDefaultFolder(
olRecipient,
PIA.Outlook.OlDefaultFolders.olFolderCalendar);
// handle errors!
}
if (olRemoteCalendar == null)
// local PST
olAppointmentItem =
(PIA.Outlook.AppointmentItem)
olapp.CreateItem(
PIA.Outlook.OlItemType.olAppointmentItem);
// handle errors!
} else {
olAppointmentItem =
(PIA.Outlook.AppointmentItem)
olRemoteCalendar.Items.Add(
Microsoft.Office.Interop.
Outlook.OlItemType.olAppointmentItem);
// that line split for readability
// did I mention you must handle errors?!
}

At this point we have a good olAppointmentItem, the .Save method will
save it wherever it belongs. (Ignore my misunderstanding one posting
up in this thread.)

Yes, I could have organized differently depending on whether I had a
shared folder name or not. Next time.

People in these forums have given so much to me with their time and
advice, I hope this gives back just a bit.

Tony Gravagno
Nebula Research and Development
TG@ remove.anti-spam.mungingNebula-RnD.com
 




Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
.NET Programmatically accessing Exchange shared and public folders DeborahK Outlook - Using Contacts 4 August 17th 06 12:20 AM
Finding server Bosilo Iley Outlook Express 1 April 4th 06 11:15 PM
Unable to share folders w/ Outlook and Exchange between users Nicolas Macarez Outlook - General Queries 7 March 30th 06 06:11 PM
Outlook crash for some users after move mailboxes to new server on Exchange 2003 SP2 Diamondas Outlook - General Queries 9 March 21st 06 10:59 PM
Opinion buttons for none Exchange Server account users? AndrewRossington Outlook - General Queries 3 February 28th 06 01:20 PM


All times are GMT +1. The time now is 09:01 AM.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.Search Engine Friendly URLs by vBSEO 2.4.0
Copyright ©2004-2025 Outlook Banter.
The comments are property of their posters.