Steve Goodman's Tech Blog
7Feb/100

Enabling the Exchange 2010 ECP Performance Console

If you’ve been testing or even running Exchange 2010 in production, you will most certainly be aware of the Exchange Control Panel – which is now not only the user’s Options panel but provides access to a number of Administrative tools, such as basic user management and reporting/mailbox searches.

However one feature contained in the ECP but isn’t visible immediately is the ECP Performance Console.

The ECP Performance Console is ECP-specific in that it provides a whole wealth of information about how your Exchange Control Panel is performing – from how long client requests are taking, RPC latency down to what’s happening on the Powershell side. Although it is totally ECP specific the information can help you diagnose areas in which your client access server isn’t performing as it should and verifying improvements are working as they should.

The fields available in the ECP Performance console are as follows:

Request URL
Client Request Time (ms)
Server Request Time (ms)
RBAC Session
RBAC Session Latency (ms)
RPC Requests
RPC Latency (ms)
LDAP Requests
LDAP Latency (ms)
Serialization
Serialization Time (ms)
Runspace
Runspace Latency (ms)
Runspace Activations
Runspace Active Time (ms)
Windows PowerShell Invoke Count
Windows PowerShell Invoke Time (ms)
Cmdlets Instantiated
Cmdlet Time (ms)
Cmdlets Invoked
BeginProcessing Time (ms)
ProcessRecord Count
Process Record Time (ms)
EndProcessing Time (ms)
Authentication (ms)
Authorization (ms)
Resolve Cache (ms)
Map Request (ms)
Acquire State (ms)
Execute Handler (ms)
Release State (ms)
Update Cache (ms)
Log Request (ms)
Client Network Time (ms)
UI Response (ms)

To enable the ECP Performance Console, edit the ECP root directory’s web.config file on each Client Access server you wish to use this on. This is located at the following location:

C:\Program Files\Microsoft\Exchange Server\V14\ClientAccess\ecp\web.config

Look int he file for the following section:

<!-- Set ShowPerformanceConsole to "true" to show ECP's Perf Console: -->
    <add key="ShowPerformanceConsole" value="false" />

Change the value for ShowPerformanceConsole to false to true as described in the preceding comment, and save the file.

Once you’ve made the change, run the customary iisreset /noforce  to reset IIS then as normal login at your ECP URL (i.e. https://mail.contoso.com/ecp) and after login, click the drop-down to the right of the help icon:

image

You should see Performance Console now listed. Click it and voila – it should appear.

image

If you want to export the data -  simply press the Copy button in the top left corner. The data can then be pasted into Excel.

Hope you find this useful, at some point!

Steve

7Feb/100

Automatically install Exchange 2010 pre-requisites

This one’s a no-brainer even for those that don’t like the command line.

Exchange 2010 has a set of pre-requisites that although aren’t extensive, are a bit of a fiddle to install using the GUI. A quick way of getting them all on is to use the pre-packaged XML ServerManagerCmd Answer files provided in the scripts directory of installation media.  I’ve provided a list of the most common answer files below with the respective command that can be run from inside the scripts directory .

Install Exchange Server 2010 operating system prerequisites for all server roles (Client Access, Hub Transport, Mailbox and UM)

ServerManagerCmd -ip Exchange-All.xml -Restart

Install Exchange Server 2010 operating system prerequisites for a typical installation (Client Access, Hub Transport and Mailbox)

ServerManagerCmd -ip Exchange-Typical.xml -Restart

Install Exchange Server 2010 operating system prerequisites for the Client Access server role

ServerManagerCmd -ip Exchange-CAS.xml -Restart

Install Exchange Server 2010 operating system prerequisites for the Hub transport server role

ServerManagerCmd -ip Exchange-Hub.xml -Restart

Install Exchange Server 2010 operating system prerequisites for the Mailbox server role (including Mailbox servers with Hub Transports)

ServerManagerCmd -ip Exchange-MBX.xml -Restart

Don’t forget on servers that will host the Client Access role to set the .Net TCP Port Sharing service to start automatically:

sc config NetTcpPortSharing start=auto

And on Hub Transport and Mailbox servers, install the Microsoft Filter Pack.

29Jan/100

Exchange 2010 MCITP: EMA now available – my comments

As of today, exam 70-663 is now available to take at your local Prometic test centre. After passing 70-662, TS: Exchange 2010, Configuring this is the only exam you need to pass to become MCITP on Exchange 2010.

As someone lucky enough to take and pass the beta exam (they cancelled a LOT of places - thankfully I booked mine for Dec 1st) I can say it's certainly no harder than the Exchange 2007 MCITP exams. If you have already passed those, although there is not a specific upgrade path you won't be too dissapointed as much of the same ground is covered apart from new features, like DAG, RBAC etc.

One area where I am disappointed with the MCITP in general is that they aren't hard enough. I'm not likely to win any friends by saying that, but personally I want to feel really satified after passing the exam. With exams like the VCP getting harder I think Microsoft should follow this example and make the MCITP something that is hard to achieve; there simply is too much of a gap between MCITP and MCM/MCA and too little of  a difference in skill level between MCTS and MCITP.

29Jan/100

Solving iPhone and Exchange 2010/2007 coexistence issues

During my testing of our Exchange 2010 implementation I came across a rather annoying issue - iPhones users with Exchange 2007 mailboxes no longer can connect after moving the client access across to 2010.

So - what is supposed to happen? Well - as iPhone is supposed to implement EAS protocol version 12.1 (i.e. it supports AutoDiscover), it should be redirected to the legacy Exchange 2007 Client Access array. Problem is, it doesn't work.

Of course not all ActiveSync clients support AutoDiscover and those that implement EAS protocol 12.0 or lower are automatically proxied by the Exchange 2010 Client Access array back to Exchange 2007 client access servers.

This is all explained in more detail (including an acknoledgement not all clients implement EAS protocol 12.1 correctly!) over at the Microsoft Exchange Team blog in their article, Upgrading Exchange ActiveSync to Exchange 2010.

Whilst looking for solutions, I've unfortunately only came across verification this is a known issue, with the solution to simply wait for Apple to fix the iPhone. However I have a deadline to meet and getting IT staff to visit hundreds of iPhone users to change EAS settings isn't an option, it's not an option to move all those mailboxes at the same time, and we can't wait for a fix from Apple.

The most simple solution, as it stands - is to force all ActiveSync clients to be proxied. As noted in the MS Exchange Team blog article above, all non-internet facing site mailbox ActiveSync access is proxied anyway, so it will work. And thankfully, the proxying isn't based on AD sites. It's simply based on the ExternalURL on the ActiveSync virtual directory - if it's set to $null on the Client Access servers in the site of the user's Mailbox it will proxy instead of redirect.

If you want to do this via the Exchange Management Shell - it's simple - do this for each Internet facing client access server during the switchover:

Get-ActiveSyncVirtualDirectory -Server E2007CA | Set-ActiveSyncVirtualDirectory -ExternalURL:$null

The implication of this is that there will be extra overhead associated with proxying Exchange 2007 ActiveSync users, so this would need to be factored into your plans should you implement my solution.

7Jan/100

Exchange – Bulk-add forwarding addresses

There's not many circumstances where you'd want to set forwarding on lots of mailboxes at once - but if you're in that situation (perhaps you're moving mailboxes to a Cloud mail provider)  it's useful to know that it's fairly straightforward and can be accomplished with a little PowerShell.

In the example below, we're assuming that your on-premise Exchange 2007/2010 domain is contoso.com and all your mailboxes are in the Staff OU.

The Cloud provider you're moving your mail to will eventually take over the MX record for your domain, but will also accept mail to each user's Username@cloud.contoso.com. We'll keep mail contacts used for the forwarding in the OU CloudContacts.

To accomplish this, we quite simply need to get the mailboxes in the specific OU, create a mail contact for each one (with the external email address they will use on the cloud provider's domain) and then set the forwarding address on the mailbox:

# Loop though the object returned by Get-Mailbox with each element represented by $mailbox
foreach ($mailbox in (Get-MailBox -ResultSize Unlimited  -OrganizationalUnit contoso.com/Staff)
{
# Create the forwarding address string
$ForwardingAddress= $mailbox.SamAccountName + "@cloud.contoso.com"
# Check there isn't a contact, then add one
If (!(Get-MailContact $ForwardingAddress -ErrorAction SilentlyContinue))
{
New-MailContact $ForwardingAddress-ExternalEmailAddress $ForwardingAddress- OrganizationalUnit contoso.com/CloudContacts
}
# Set the forwarding address
Set-Mailbox $mailbox -ForwardingAddress $ForwardingAddress
}

Of course, that's a fairly simple example.  What if the email addresses at the cloud provider don't match the Windows Logon ID or anything else that is an attribute of the Mailbox? Well the simple solution is to use something like a CSV file containing a mapping between an attribute on each Mailbox and the external email address for that user:

SamAccountName,ForwardingAddress
jamesw,jimbo@cloud.contoso.com
philipg,phil@cloud.contoso.com

In this example, we'll save that file as input.csv and use that as are input to the foreach loop. Again CloudContacts OU will contain our new mail contact objects:

# Loop through the object returned by Import-Csv with each element represented by $person
foreach ($person in (Import-Csv .\input.csv))
{
# Check the Mailbox for the person exists
If ((Get-Mailbox $person.SamAccountName))
{
# Check the mail contact doesn't exist and if not add it
If (!(Get-MailContact $person.ForwardingAddress))
{
New-MailContact $person.ForwardingAddress -OrganizationalUnit contoso.com/CloudContacts
}
# Set the Forwarding Address on the Mailbox
Set-Mailbox $person.SamAccountName -ForwardingAddress $person.ForwardingAddress
}
}

Word of caution - it's worth (as always) running these commands in your test environment first - and of course consider appending -WhatIf to the New-MailContact and Set-Mailbox commands to check they'll do what you want in your production environment.

Hope this helps,

Steve

7Jan/100

Welcome to my Tech Blog

Hello and welcome to my tech blog! This blog is aimed at bringing you news, hints, tips and scripts to make your life as an Exchange, Ad or VMware administrator easier and to get to grips with new or unusual features.

A little about me - I work at a University in the UK in an architect type role responsible for Active Directory, Exchange, SAN technologies and our VMware infrastrure (AKA our internal Cloud).

As well as this blog, while you're here check out my Car PC mini site. I've stopped working on the Car PC now but while I did it was featured in Custom PC magazine, Gigaherz Magazine, Computer Shopperand CNET.com. I worked on it from 2003 and you can read about how it was put together on my old blog.

If you're after any advise or want to network feel free to get in touch (more details on my about me pages) via email or twitter.

Tagged as: No Comments