Enabling Outlook Mobile Access for Exchange Server 2003

A few years ago I attended an Exchange Server 2003 overview presented by Microsoft UK and Conchango (where I subsequently worked for a while) and got to play with Outlook Mobile Access (OMA) using an emulated mobile phone connection. I was pretty impressed (these were the days before smartphones became a reality) but haven’t used the functionality since. Until last night that was, when (inspired by a mobility presentation which Jason Langridge gave at the Microsoft UK Security Summit a couple of days back) I was tweaking a few settings on my Exchange server and decided to enable OMA.

For those who are not familiar with OMA, it supports mobile microbrowser access to Exchange Server 2003 for browsers that use HTML, extensible HTML (XHTML), wireless application protocol (WAP) 2.x or compressed HTML (CHTML) with access to Inbox, Calendar, Contacts, and Tasks as well as a searchable global address list and searchable Inbox folders .

OMA Main Menu

My handset is a fairly simple Nokia 6021 (but it does everything that I need it to) and is not on the list of supported handsets but there’s an option in Exchange System Manager to enable unsupported devices. After enabling OMA in the mobile services global settings (and optionally enabling unsupported devices) browsing to the server and reading my messages should be as simple as initiating a GPRS connection from my phone to my Exchange server (but with /oma instead of /exchange) and logging on (SMTP forwarding is also available but it requires the use of a WAP gateway and additional settings to define the mobile carrier).

Unfortunately my browse request was greeted with the following error message:

A System error has occurred while processing your request. Please try again. If the problem persists, contact your administrator.

Additionally, Exchange Server logged the following error in the application event log:

Event Type: Error
Event Source: MSExchangeOMA
Event Category: (1000)
Event ID: 1503
Date: 06/07/2006
Time: 23:36:57
User: N/A
Computer:
servername
Description:
An unknown error occurred while processing the current request:
Message: The remote server returned an error: (403) Forbidden.
Source: Microsoft.Exchange.OMA.ExchangeDataProvider
Stack trace:
at Microsoft.Exchange.OMA.ExchangeDataProvider.OmaWebRequest.GetRequestStream()
at Microsoft.Exchange.OMA.ExchangeDataProvider.ExchangeServices.GetSpecialFolders()
at Microsoft.Exchange.OMA.ExchangeDataProvider.ExchangeServices..ctor(UserInfo user)

Message: Exception has been thrown by the target of an invocation.
Source: mscorlib
Stack trace:
at System.Reflection.RuntimeConstructorInfo.InternalInvoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean isBinderDefault)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at Microsoft.Exchange.OMA.UserInterface.Global.Session_Start(Object sender, EventArgs e)

Message: Exception of type Microsoft.Exchange.OMA.DataProviderInterface.ProviderException was thrown.
EventMessage:
UserMessage: A System error has occurred while processing your request. Please try again. If the problem persists, contact your administrator.
Source: Microsoft.Exchange.OMA.UserInterface
Stack trace:
at Microsoft.Exchange.OMA.UserInterface.Global.Session_Start(Object sender, EventArgs e)
at System.Web.SessionState.SessionStateModule.RaiseOnStart(EventArgs e)
at System.Web.SessionState.SessionStateModule.CompleteAcquireState()
at System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData)
at System.Web.AsyncEventExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Microsoft knowledge base article 898131 suggested that the on-screen error may have been related to multiple server identities and incorrect host headers for the OMA website; however I didn’t find that to be the case (that is to say that the resolution I found works regardless of whether or not I change the host headers to include the NetBIOS name of my server, which is accessed externally using a totally different name). Microsoft knowledge base article 817379 was much more useful as it seems the issue is related to the fact that my server is only accessible using an SSL connection, forms-based authentication is enabled and I don’t have a dedicated front-end server. Following Microsoft’s advice to create a secondary virtual directory for Exchange that does not require SSL (/exchange-oma), and then adding a registry value to point to the new virtual directory resolved the issue for me.

I still access the server using HTTPS to https://exchangeservername/oma (external HTTP connections cannot reach my Exchange server) but this fix resolves the internal operations between OMA, the OWA templates and DAV on the mailbox server.

To read more about configuring OMA, an OMA 2003 tutorial is available at MSExchange.org. It’s also possible to test OMA using the Nokia mobile browser and WAP gateway simulators (which is what I used for the screenshot shown above).

Accessing a public Internet connection from a virtual machine without getting charged twice

Last night, I stayed away on business in a hotel with broadband Internet access in my room (1.5Mbps according to a bandwidth speed test). Having paid almost as much for a 24 hour connection as I pay for a month at home, I decided to remain in my hotel room this morning and take advantage of a fast connection, rather than competing for a meagre amount of bandwidth in the office.

That sounds fair enough, but as I’m now working (rather than just surfing the ‘net and writing new blog posts) I also need to access corporate applications and data. My notebook PC is running Windows Vista but my corporate desktop runs in a Windows XP virtual machine using the VMware Player, so whereas last night I’d been using the host machine to access the Internet, this morning I need to use the virtual machine too.

The host PC is still working with the hotel ISP‘s systems but when I originally connected with the virtual machine (which is normally configured for bridged networking to logically separate the guest and host machines so it has it’s own IP address) I was presented with a welcome page which invited me to pay again for access.

Quickly changing the VMware Player’s Ethernet connection from a bridged connection to a NAT connection, disconnecting and reconnecting the Ethernet connection and then running ipconfig -release and ipconfig -renew in the virtual machine gave the Windows XP guest a new NATted IP address and me the ability to access the Internet from either the virtual guest or the physical host machine. Unfortunately I still can’t create a VPN connection to the company network (probably something to do with the NAT) but I can live with that for a few hours.