Exchange 2010

Bulk import PST files – [updated] v1.1

Bulk import PST files – [updated] v1.1

Just wrote a basic script for importing PST files into mailboxes, that I want to share with the community.

It is designed to check for PST files in the specified folder. Based on the filenames (of the PST files) it then verifies that a mailbox can be found. This is done by using the filename and adding the @ character and the domain value into a string value. If there is a match, it returns a value of $True and the script continues with running the New-MailboxImportRequest cmdlet.

The script is written just as basic as it can, it provides much information about values and what’s going on.
The most recent updated script can be downloaded here

I hope this will help you to import the PST files into the mailboxes

Ps. Sorry for the word-wrap, see the script file instead of copy the script code below

Changelog
v1.1
– Updated the $name variable due to issues with filenames got trimmed away. Also added so that if errors exists, they will be sent to a errorlog. Thanks to Chris Steding!

# +=======================================================================
# | Blog: http://www.testlabs.se/blog
# | Twitter: @jonand82
# | =============================================
# | Filename: Import-PST v1.1.ps1
# |
# | CREATED BY: Jonas Andersson
# | FUNCTION: Imports PST files into mailboxes, matching on emailaddresses
# |
# | CHANGE LOG: 
# | v1.0 - 2013-09-18, *Created*
# | v1.1 - 2013-09-22, *Update of $name variable*
# |
# |    Required permissions (RBAC) Role: “Mailbox Import Export”, example: New-Managementroleassignment –Role “Mailbox Import Export” –User “Administrator”
# +=======================================================================

# Load snapin
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction 'SilentlyContinue'

# Variables
$error.clear()
$errorlog = "C:\temp\errorlog.txt"
$pstpath = "C:\temp"
$domain = "testlabs.se"
$servername = "tlex01"
$files = Get-ChildItem -Path $pstpath -Filter *.pst

Write-Host $files

if (($files -ne $null) -or ($files -eq "")) {

    foreach ($i in $files) {

        $name = $i.BaseName
        $id = $name + "@" + $domain
        $filename = $i.FullName
        $filename = $filename.Replace(":","$")
        $uncfilepath = "\\" + $servername + "\" + $filename

        Write-Host "#################################################################"
        Write-Host "Filename:" $i -ForegroundColor 'Cyan'
        Write-Host "UNC path:" $uncfilepath -ForegroundColor 'DarkCyan'
        Write-Host "Emailaddress:" $id -ForegroundColor 'DarkGreen'

        $MailboxExists = [bool](Get-Mailbox -Identity $id -ErrorAction SilentlyContinue)

        if ($MailboxExists -eq $false)
        {
            Write-Host "Found mailbox:" $MailboxExists -ForegroundColor 'Red'
            Write-Host "Make sure to match filename to mailaddress, without @domain" -ForegroundColor 'Red'

        }

        if ($MailboxExists -eq $true)
        {
            Write-Host "Found mailbox:" $MailboxExists -ForegroundColor 'Green'
            Write-Host "Importing $uncfilepath into mailbox: $id" -ForegroundColor 'White'

            New-MailboxImportRequest -Mailbox $id -FilePath $uncfilepath

        }

        Write-Host ""
    }

}

else
{
    Write-Host "No PST files found"
}

if ($error -ne $null)
{
    $error | Out-File -FilePath $errorlog -Append
    Write-Host "See $errorlog for errors" -ForegroundColor 'Red'
}
Part 3: Migrating Domino/Notes to Exchange 2013 On-premise

Part 3: Migrating Domino/Notes to Exchange 2013 On-premise

Published: 2013-06-21
Updated: –
Version: 1.0

This post will focus on migrating Domino/Notes to Exchange 2013 On-premise.

Before going into any details, if you are planning to do a migration from Domino and want to use Dell Software’s Notes Migrator for Exchange, it is important to mention that there is a requirement from the vendor to use certified people for the project.

This blog post is based on Notes Migration for Exchange version 4.7.0.82.

If you would like to read the other parts see the section “See the other parts”

Installation Notes Migrator for Exchange (NME)

The installation is a regular next/next/finish installation. During the first startup it will ask for a license file, so provide an appropriate license and the application will start.

The installation and configuration instructions can be found at:
http://www.testlabs.se/blog/?p=680

Creating batches/collections

Users are migrated based on batches (or collections), these batches are created from “User Collections – Manage” and by pressing “New collection…”

image

Give the collection a name and label (label is not required). Labels can be of great help if looking for a particular batch after creating many collections.

image

Choosing which users that should reside in the batch can be done either by finding them in the directory (i.e. NME database) or by importing them from a TSV file. In this example, I chose find them from the directory because I only select one user. In other cases the TSV import can be useful.

image

As demonstrated below, I search for a user with a Display Name that starts with Jonas. Type the desired characters in the value field, press “Add” button. You can add multiple criteria to the search filter if desired and press “Find now” when ready.

image

The results will be shown in the search result section. Select the desired user(s) and press “OK”. The user is then added into the batch.

image

Migration finalization / switch / routing

When migration batches/collections have been created we are ready to start the migration.

It is basically done by switching the mailbox and migrating the contents.
NME will configure the Domino person document with appropriate forwarding settings to ensure Domino can route email to Exchange for this specified forwarding domain.

See section Notes from the field for how to configure Domino mail routing.

Before any changes are made, the mailbox properties typically looks like the picture below.
It has an Internet Address (same as email addresses in Exchange i.e. SMTP).

image

Go to “User Collections – Migrate User Data”, select the migration batch by pressing the arrow and choosing the correct batch. When selected, press “Migrate…”

image

Select “Manage mail routing” and press “Next”.

image

Select “Exchange” and “Quest Coexistence Manager for Notes” with “Using ActiveMail processing”.
This for configuring the Domino mailbox with a forwarding address.

image

Calendar domain: Exchange” (this is used during Freebusy coexistence, discussed in coexistence post)
”Set server running qcalcon: dominoserver/dominodomain” (specify the server that have Qcalcon installed)
”Specify your Domino domain: dominodomain” (specify your Domino domain)

Check “Set mail forwarding address”
”Forwarding mail domain: exchange.testlabs.se” (Domino need to route mails to this SMTP domain)
Check ”Append Domino domain to forwarding address”
”Overwrite existing mail forwarding address: Always

Then press “Next”.

image

If Exchange mailboxes have forwarding/targetAddresses configured, these can be removed by using this option. In my case I don’t have these configured, so I will let them be unchecked. Press “Next”.

image

When switching (routing) mailboxes, with sufficient hardware, I typically run this operation with at least 20 threads (simultaneous processes). However, in this scenario it is being performed on a single mailbox, so I left it with 1 thread. Press “Next”.

image

A summary is shown, press “Next”.

image

The operation can be scheduled but, in my case, I want to run it now. Press “Next”.

image

The operation starts…

image

…and it was completed. Press “Exit”.

image

When the operation is complete, look at the user in Domino directory, it is a bit different.
Note that the Forwarding address now is configured, the Mail system is configured to Other Internet Mail and Domain value is empty.

image

Migrating data

Since the mail routing is completed and all new mail will route directly to the Exchange mailbox, it’s time to migrate the data.

Before the migration was started, the mailbox only had 4 items and a total of 254 kb, shown in the picture below. Using PowerShell command:

Get-MailboxStatistics jonand | ft displayname,itemcount,totalitemsize –Autosize

image

Go to “User Collections – Migrate User Data”, select the migration batch and press “Migrate…”

image

Select “Migrate mailbox data”, press “Next”.

image

In this scenario, I didn’t use the notification options. However, these can be helpful for letting users know that they are migrated and should start to use Outlook instead of Notes. Press “Next”.

image

Select data types you wish to migrate, I decide to not migrate Trash and the Archive. Everything else will get migrated. Press “Next”.

image

Select the preferred conversion method for DocLinks. For this example, I used “Notes .NDL attachment (requires Notes client to use after migration)”. Press “Next”.

image

Select “Through Domino server(s)”, press “Next”.

image

Select “Server-based mailbox”, press “Next”.

image

In my scenario I want to migrate everything, but the filtering options can be very useful in projects that might require to just migrate the last year’s contents and not attachments that are over 10 MB.

When you have select the appropriate settings, press “Next”.

image

When migrating mailbox data, I commonly run it with 8-12 threads (simultaneous processes).

You will need to determine the setting that is best in your environment. This is normally done before or during the pilot phase of the project to ensure the most optimal configuration is ready for production migrations.

In this scenario, I am migrating a single mailbox so I leave it with 1 thread. Press “Next”.

image

A summary is shown, press “Next”.

image

I want to start the migration now. However, if that’s not the case, you have the opportunity to schedule it here.

Press “Next”.

image

The operation starts…

image

…during the operation…

image

…operation completed. Press “Exit”.

image

For this example, the migration throughput rates are low because we migrated a single mailbox with a small sampling of data. As you scale your migrations to include additional mailboxes and threads, much higher throughput rates will be achieved. This was done in a lab environment using slow disks and small amount of memory.

When the migration is completed, it’s a good recommendation to compare item counts and mailbox size, but you will need to account for data compression differences between Domino and Exchange.

I’ve seen differences between 20-35% depending on the circumstances. This means a Notes mail file of 1 GB may be 1,35 GB in Exchange. However, this is just a rule of thumb and needs to be estimated with actual data from each project since every customer is unique.

Verify the item count and mail data size by using the same PowerShell command:

Get-MailboxStatistics jonand | ft displayname,itemcount,totalitemsize –Autosize

The picture below shows that there are now 51 items and the mailbox holds 886 kb.

image

Notes from the field

Domino SMTP routing – This can be difficult to understand if you haven’t been working with Domino or been involved in any migration projects before. I did post an article about coexistence that goes through the configuration steps, read it here: http://www.testlabs.se/blog/?p=1042

Proxy server – One thing that can be a potential issue during migrations is proxy servers. I recommend avoiding them as much as possible. If you can avoid them you will most likely save yourself some issues that might occur if a proxy server is used. These tend to block or throttle traffic, the impact can be either that the migration throughput will be very low or that it will prohibit the traffic from reaching its destination.

Creating batches/collections – If you are involved in larger migration projects, you likely won’t want to find each user manually. As an alternative, you can search by a Domino Directory value that is unique to each migration batch.

Another method for adding users to the batch is using TSV files. If you choose this approach, Excel will become your best friend.

Precopy/Delta migration consideration – In cases where it’s possible, I recommend starting the migration right away after the pilot has been approved. This means that the mailbox data can be migrated over/synchronized before the actual migration must take place. By pre-staging data, the mailbox switch/routing can be done fast and finally the mailbox delta data (differences) can be migrated. This can minimize the “migration time”. By this, I mean the time that the end-users are impacted in some way or another.

One thing to keep in mind if using this method is that as soon as a mailbox is created in Exchange, the Free/Busy requests from other Exchange users sent to this newly created user won’t be sent back to Domino (where the most current data remains and action should take place).

I have requested a feature from Microsoft that would make the “forwarding” of Free/Busy requests possible, but haven’t heard anything back from them yet. It would be great if that could be solved, probably easily by using targetAddress attribute together with a new attribute, for ex. forwardfbreq set to either 0 (default) or 1.

Read the other parts

Part 1: Migrations – Overview
Part 2: Prerequisites for Domino/Notes migrations
Part 4: Migrating Domino/Notes to Office 365
Part 5: Migrating Resources Mailboxes, Mail-In databases and Groups
Part 6: Prerequisites for Coexistence between Domino and Exchange 2013/Office 365
Part 7: Configuring Quest Coexistence Manager for Notes with Exchange 2013 On-premise
Part 8: Configuring Quest Coexistence Manager for Notes with Office 365
Part 9: Prerequisites for Quest Migration Manager
Part 10: Migrating User Mailboxes from Exchange 2003 to Exchange 2013 using Migration Manager
Part 11: Migrating User Mailboxes from Exchange On-premise to Office 365

Feel free to comment the post, I hope you liked the information. If you find something that might be incorrect or you have other experiences, leave a comment so it can be updated.

Migration Preparation script

Migration Preparation script

This script idea came up after being involved in a migration project.

Published: 2013-05-22
Updated: 2013-05-24
Version: 1.1

It’s purpose with this script is for getting Quest Migration Manager (QMM) being able to match objects between domains. In a scenario with one-way trust and not being able to use Quest Migration Manager AD or any other tool for providing the SIDHistory into the AD objects. Users, mailboxes and mail contacts are already created, where the contacts are used for having a global address list (GAL) object they can send emails to.

Using QMM you can match by Username, Mailaddress or SIDHistory. In my case the username differs and the SIDHistory is not available (not allowed being copied into the target AD).

I created four different functions within this script, one called “Export-SourceInformation”, which should be used in the source environment. It will export the information from the source regarding Name, DisplayName, PrimarySmtpAddress, RecipientTypeDetails and save it into a CSV file called “users.csv”.

Then bring the CSV file into the target environment. This CSV file should be used as a control file if you don’t want to run all users at the same time (run some tests before running all of them in one batch).
I would recommend a couple of smaller batches for testing the functions before deploying it in full scale.

There is a function called “Verify-TargetInformation”, which uses the CSV file called “users.csv” and retrieves the Name and PrimarySmtpAddress for each object in the CSV file.

Another function is called “Set-SourceAddress”, this part takes care of the target account.
It uses the file called “users.csv” and checks whether there are any contacts for these mailboxes, if there are the mail contact will be deleted and the mailbox forward settings will be removed together with making sure that the mailbox is showed in the GAL. But before any changes are done, the current configuration for both the mail contact and the mailbox object are being saved into a CSV file called “targetinformation.csv”.

Last but not least, the function called “Rollback-TargetInformation” is used for putting back the PrimarySmtpAddress to the value that it was prior to the change, this by using the CSV file “targetinformation.csv”. When the Directory Synchronization have successfully matched the mailboxes this function should be runned for having back the correct information.

You can use this for free, without any guarantee or warranty and at your own risk.
Feel free to post about it, just make sure to link my blog and blogpost.

Download the script

##################################################################################### 
# Filename: Migration-Preparation-testlabs.ps1  
# Description: 
# This PowerShell script exports information, configures objects and prepares for 
# Quest Migration Manager EX Directory Synchronization 
# 
# Usage: Import-Module Migration-Preparation-testlabs.ps1 
# Start with importing the module, then Starting function: Export-SourceInformation; 
# Set-SourceAddress; Rollback-TargetInformation; Verify-TargetInformation 
# 
# Version: 1.1
#
# Changelog:
# v1.1 - Introduced LegacyExchangeDN - X500 preparation
#
# Jonas Andersson, MCC 2011 & 2012 
# http://www.testlabs.se/blog 
# Twitter @jonand82 
#####################################################################################

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction SilentlyContinue
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin -ErrorAction SilentlyContinue

## Exporting the SMTP information from Source mailboxes 
Function Export-SourceInformation(){ 

    $filename = "users.csv" 

    $users = Get-Mailbox -resultsize unlimited | Select Name,DisplayName,PrimarySmtpAddress,RecipientTypeDetails,LegacyExchangeDN
    $users | Export-CSV $filename -notype -Encoding Unicode 

}

## Changing Target mailboxes to Source PrimarySmtpAddress for QMM to match on it 
Function Set-SourceAddress(){ 

    $data = Import-CSV .\users.csv 
    $filename = "targetinformation.csv" 

    ## Saving Target Information into CSV file before changing 
    $MasterList = @() 
    Foreach($t in $data) 
    { 
        $str = $t.displayname 
        $MyObject = New-Object PSObject -Property @{ 

        Name = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").Name 
        DisplayName = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").DisplayName 
        PrimarySmtpAddress = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").PrimarySmtpAddress 
        RecipientTypeDetails = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").RecipientTypeDetails 
        Email = ((Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").EmailAddresses -Join ";") 
        DeliverToMailboxAndForward = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").DeliverToMailboxAndForward 
        ForwardingAddress = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").ForwardingAddress 
        ForwardingSmtpAddress = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").ForwardingSmtpAddress 
        HiddenFromAddressListsEnabled = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").HiddenFromAddressListsEnabled 
        LegacyExchangeDN = (Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'").LegacyExchangeDN
        ContactName = (Get-MailContact -resultsize unlimited -Filter "DisplayName -like '*$str*'").Name 
        ContactDisplayName = (Get-MailContact -resultsize unlimited -Filter "DisplayName -like '*$str*'").DisplayName 
        ContactPrimarySmtpAddress = (Get-MailContact -resultsize unlimited -Filter "DisplayName -like '*$str*'").PrimarySmtpAddress 
        ContactEmail = ((Get-MailContact -resultsize unlimited -Filter "DisplayName -like '*$str*'").EmailAddresses -Join ";") 
        ContactExternalEmailAddress = (Get-MailContact -resultsize unlimited -Filter "DisplayName -like '*$str*'").ExternalEmailAddress 
        ContactHiddenFromAddressListsEnabled = (Get-MailContact -resultsize unlimited -Filter "DisplayName -like '*$str*'").HiddenFromAddressListsEnabled

        } 

        $MasterList += $MyObject 
    } 

    $MasterList | Export-Csv $filename -NoTypeInformation -Encoding Unicode 
    Write-Host "Information is saved into the CSV file: $filename" -ForegroundColor White 

    Foreach($i in $data) 
    { 
        $str = $i.displayname 

        ## Removing mail contacts for Source users 
        $c = Get-MailContact -resultsize unlimited -Filter "DisplayName -like '*$str*'" 
        Write-Host $c -ForegroundColor Yellow 

        ## Multiple matching, no changes will be done 
        if ($c.count -ge 1) 
        { 
            Write-Host "ERROR: Multiple matching" 
            Write-Host "Matches: $c.count" 
            return 
        } 

        ## Unique contact found, removing it 
        if ($c.count -eq $null) 
        { 
            Write-Host "Unique matching: $c" 
            Write-Host "Removing the mail contact object for: $c" 

            Remove-MailContact -Identity $c -Confirm:$false 

        } 

        ## Starting the configuration for Target Mailboxes 
        $u = Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'" 

        Write-Host $u -ForegroundColor Yellow 

        ## Multiple matching, no changes made 
        if ($u.count -ge 1) 
        { 
            Write-Host "ERROR: Multiple matching" 
            Write-Host "Matches: $u.count" 
            return 
        } 

        ## Setting the Source PrimarySmtpAddress on the Target Mailboxes 
        if ($u.count -eq $null) 
        { 
            Write-Host "Unique matching: $u" 
            Write-Host "Setting Source SMTP as PrimaryAddress for matching using QMM" 
            Write-Host "Configuring the mailbox for showing up in GAL and remove the forwarding configuration"
            Write-Host "Adding the LegacyExchangeDN as X500 for Outlook auto-complete cache"
 

            $email = $i.PrimarySmtpAddress
            $x500 = $i.LegacyExchangeDN

            Set-Mailbox -Identity $u -ForwardingAddress $null -DeliverToMailboxAndForward:$false -HiddenFromAddressListsEnabled:$false -PrimarySmtpAddress $email -EmailAddressPolicyEnabled:$false 

            $ProxyAddresses = (Get-Mailbox -Identity $u).EmailAddresses
            $ProxyAddresses += [Microsoft.Exchange.Data.CustomProxyAddress]("X500:$x500")
            Set-Mailbox -Identity $u -EmailAddresses $ProxyAddresses
        } 

        else 
        { 
            Write-Host "No match" 
            return 
        } 

    } 

    Write-Host "" 
    Write-Host "#################################################################" -ForegroundColor White 
    Write-Host "# First run the Verify-TargetInformation..                        #" -ForegroundColor White 
    Write-Host "# Start the QMM Synchronization for matching Source <-> Target  #" -ForegroundColor White 
    Write-Host "# Finally run the Rollback-TargetInformation when sync is done  #" -ForegroundColor White 
    Write-Host "#################################################################" -ForegroundColor White 
    Write-Host "" 
}

## Rollback of Target PrimarySmtpAddress 
Function Rollback-TargetInformation(){ 

    $data = Import-CSV .\targetinformation.csv 

    $MasterList = @() 
    Foreach($i in $data) 
    { 

        $str = $i.displayname 
        $user = Get-Mailbox -resultsize unlimited -Filter "DisplayName -like '*$str*'" 

        ## Predicts there is only one @testlabs.se address 
        $pri = Get-Mailbox -Identity $user | Select-Object -ExpandProperty EmailAddresses | Where-Object {$_.SmtpAddress -like '*@testlabs.se'} | Select-Object SmtpAddress 
        $adr = $pri.SmtpAddress 

        Write-Host "Configuring mailbox: $user with adress: $adr" -ForegroundColor White 
        Set-Mailbox -Identity $user -PrimarySmtpAddress $adr -EmailAddressPolicyEnabled:$False 

    } 

}

## Verifying the Target PrimarySmtpAddress 
Function Verify-TargetInformation(){

    $data = Import-CSV .\users.csv 

    $filetime = (get-date -format yyyyMMddhhmm) 
    $filename = "verify-$filetime.csv" 
    $MasterList = @() 

    ## Verifying the PrimarySmtpAddress 
    Foreach($i in $data) 
    { 

        $MyObject = New-Object PSObject -Property @{ 

            Name = (Get-Mailbox -Identity $i.PrimarySmtpAddress).Name 
            PrimarySmtpAddress = (Get-Mailbox -Identity $i.PrimarySmtpAddress).PrimarySmtpAddress 
            Database = (Get-Mailbox -Identity $i.PrimarySmtpAddress).Database
            EmailAddresses = ((Get-Mailbox -Identity $i.PrimarySmtpAddress).EmailAddresses -Join ";") 
        } 

        $MasterList += $MyObject 

    } 

    $MasterList | Export-Csv $filename -NoTypeInformation -Encoding Unicode 
    Import-CSV $filename 

    Write-Host "" 
    Write-Host "SMTP Verification is saved into the CSV file: $filename" -ForegroundColor White 
    Write-Host "" 
}
Part 1: Migrations – overview

Part 1: Migrations – overview

This will be a collection of posts, regarding migrations in general in the first post will digging deeper in the following posts.

Published: 2013-05-09
Updated: 2013-05-15
Version: 1.1

Thanks for the great input and feedback: Hakim Taoussi and Magnus Göransson

Part 1: Overview

I will try to keep the first post not technical since this is more common sense then anything else.
In short I want to summarize some key takeaways and recommendation to stick with, explaining them a bit more in detail below.

  • Planning
  • Information & communication
  • Pilot migrations
  • End-user training
  • Experience
  • Minimize the coexistence time
Planning

Some of you might think that… well of course we are planning. But sometimes I hear people that spend like 10-15% of their total project time for planning. I would recommend you to rethink if that’s the case, and suggest that you maybe should spend at least 50% of the time for it, maybe even more (in large projects).

What I mean with planning is to create a detailed migration plan, this should of course include estimations regarding how many users can be migrated per hour, how much data can be transferred per hour.
Basically what this means is that the planning phase should be used for planning and verifying that everything is in place and works like it’s expected to do.

For example, in the official guide from Quest Software when migrating from Domino to Exchange they calculate of 5GB/hour/migration server during good conditions. In the real world I’ve seen throughput of 20GB/h/server. With this said, it all depends… (the consultants favorite phrase) This is one of those things that needs to be tested and verified before creating a detailed migration plan, for doing a good estimation.

Don’t forget to verify that the target environment have enough capacity, servers and storage.

Other questions that needs clear answers can be;
How is users and mailboxes provisioned?
During the migration, where should new mailboxes be created?
Is there information in the user attributes that needs to be migrated from Domino into AD?
How will the migration process work?
What requirements are there?

So for the planning, think about all steps.

Information & Communication

With information I mean to inform everybody that’s involved in the project in one or another way.
This would include the helpdesk and support, since these are the projects closest friends for helping and taking care of incidents.

On the other hand we have the users themselves, here I’m talking about the end-users. If the migration will impact the users in a way they are not used to, remind to inform them a couple of weeks before they are going to be migrated, with a reminding notification a couple of days when the migration will take place.
During a transition from for example, Exchange 2007 to Exchange 2010, there won’t be much impact on the users, it’s more a data transfer and updating a couple of attributes in the directory so the impact is very small. In those transition projects (it depends on the customer requirements) the needs for user reminders is not that big as the migration projects. But keep in mind, it’s better they get too much information than too little.

In large projects it’s a recommendation to place the information on public places like the restroom and the lunch room. Also inform the people on every place that’s possible, intranet, mail, letter, meeting and so on.

In short I want to say the obvious, if the information is lacking or poor, the experience from the end-user perspective will be poor. In the end this give the result of a failed project, at least from a user perspective.

Pilot migrations

From the projects I’ve been a part of I’ve learnt lots of things and gained experience. One of these things is to have a good pilot, I would recommend to divide the pilot into 3 parts.

Part 1 is the “Technical Pilot”, this would include the closest project members and/or only technical people that can handle issues and problems when they occur.
Part 2 is the “Pilot 1” and this would include at least 10 users, spread throughout the organization, the more spread they are the better value would the pilot have.
Part 3 is called “Pilot 2”, this is started when the “Pilot 1” phase is completed and the evaluations are done. Maybe some tweaking needs to be done before starting this stage (if there were issues and errors).
In “Pilot 2” should at least 50 people be included throughout the organization, this last Pilot phase is used for solving any issues that occurred in previous stages, this for minimizing the impact when the real migration phase will take place.

The numbers above is just examples, but might be good examples for a environment with a couple of thousand users.

Before starting with “Pilot 2” the whole migration process, how object get provisioned should be well documented. It would be a recommendation to have it documented even in the “Technical Pre-Pilot”, but my experience tells me that things are changing and somewhere during “Pilot 1” the processes are getting tested and documented.

End-user training

As this is mentioned, in some cases it might not be needed, for instance if the moved users still keeps the same Outlook client version and the impact is very low. As we all know things are changing over time with new versions and if the user used for example Outlook 2003 with Windows XP and will be upgraded to Windows 7 and Outlook 2013, there might be a reason for giving the users a training session and some documents with instructions on how things work in the new version.

If the users are migrated for example from Domino/Notes to Exchange/Outlook I would strongly recommend having training sessions were the users can attend and also bringing instructions on how things differs between Notes and Outlook, and how Outlook should be used for booking a meeting, sending a mail etc.

This for making sure that the users gets a good experience and can handle the new tools.

Minimize the coexistence time

I’m not writing this because of lack due to products out there or the functions of them.

But I’m writing this bullet for having a smoother and easier understanding, mostly for the helpdesk and the end-users. During a coexistence (freebusy/mail flow/directory synchronization) time it can be hard to troubleshoot and isolate incidents and problems. Another good reason for minimizing the coexistence time is regarding all shared resources, by minimizing the coexistence time you will reduce the impact for the end-users. So for minimizing these hours spent on troubleshooting and the work effort everyone need to put in, I would recommend to keep the coexistence time as short as it can be, without impacting the experience or business in a bad way.

In short I would say, if things are working. Keep up a good pace for having a short coexistence time!

Experience

Last but not least, I would recommend you to select careful what project members are selected or which company that runs these kind of projects. It’s very important that they have the full understanding of what needs to be done and what impact it has for everyone involved but also the business itself.

If using Quest Software, they have a requirement of using certified people for designing, installing and configuring their products. This for making sure that the result will be good and that everyone should be satisfied with it. I’m not sure about other vendors but I think they have something similar to this model.

Read more
Part 2: Prerequisites for Domino/Notes migrations
Part 3: Migrating Domino/Notes to Exchange 2013 On-premise
Part 4: Migrating User Mailboxes from Domino/Notes to Office 365
Part 5: Migrating Resources Mailboxes, Mail-In databases and Groups
Part 6: Prerequisites for Coexistence between Domino and Exchange 2013/Office 365
Part 7: Configuring Coexistence Manager for Notes with Exchange 2013 On-Premise
Part 8: Configuring Coexistence Manager for Notes with Office 365
Part 9: Prerequisites for Migration Manager
Part 10: Migrating User Mailboxes from Exchange 2003 to Exchange 2013 using Migration Manager
Part 11: Migrating User Mailboxes from Exchange On-Premise to Office 365

I hope these key takeaways gave you some good insight and some things to think about.
I would be happy to hear your comments/feedback this post.

The plan is to post a new article every second week, keep your eyes open

Regards,
Jonas

How to set “office” value for multiple Shared Mailboxes

How to set “office” value for multiple Shared Mailboxes

Published: 2013-02-25
Updated: –
Version: 1.0

This script was developed because there was a need to configure every Shared Mailbox with a office value. In Exchange the value is called “Office” while in Active Directory this value is called “physicalDeliveryOfficeName”.

The script is retrieving all shared mailboxes where the office value isn’t populated and creates an array of these mailboxes. It includes a couple of attributes.

It does give you the opportunity to verify the changes that will be done, before they are done.
The array is showed to the screen and also saved as a CSV file called “pre-report-$timestamp.csv”

From each of the shared mailboxes, the script will bring the office value from the corresponding manager and put that value into respective shared mailbox office attribute value.

If there are no manager configured for any of the shared mailboxes, a log file will be created called “no-manager-configured-report.txt” and if there are no office attribute value configured on the managers, a log file will be created called “no-office-configured-report.txt”

When the script is completed, a log file will be created called “completed-report-$timestamp.txt” with the changes that have been done.

####################################################################
# SetOffice.ps1
# Description:
# This PowerShell script will stamp the office field for every shared mailbox
# that doesn't have a value set. The value will be collected from each manager
# If no Manager is set, the script will not stamp the office value
#
# Jonas Andersson, MCC 2011 and 2012
# http://www.testlabs.se/blog
# Twitter @jonand82
####################################################################</pre>
Write-Host "Starting script.." -ForegroundColor White -BackgroundColor Black

$ou = "target.local/Resource Mailboxes"

Write-Host 'Retrieving all Shared Mailboxes without "Office" value..' -ForegroundColor White -BackgroundColor Black

$UserList = Get-User -ResultSize unlimited -OrganizationalUnit $ou -RecipientTypeDetails SharedMailbox -Filter {Office -eq $null}

$MasterList = @()
 foreach ($User in $UserList)
 {
 $MyObject = New-Object PSObject -Property @{

Mailbox = (Get-User -Identity $User).DistinguishedName
 Manager = ((Get-User -Identity $User).Manager).DistinguishedName
 Manage = (Get-User -Identity $User).Manager | ForEach-Object{
 $o = (Get-User $_).Office
 }

Office = $o
 }

$MasterList += $MyObject
 }

if ((Read-Host 'Show and save list, the listed shared mailboxes? (Y/N)') -eq 'Y' )
 {
 $MasterList | Select Mailbox,Manager,Office

$timestamp = Get-Date -UFormat %Y%m%d-%H%M
 $reportfile = ".\pre-report-$timestamp.csv"
 $MasterList | Select Mailbox,Manager,Office | Export-CSV $reportfile -Encoding Unicode -Notype

Write-Host 'The file is saved as '$reportfile''
 }

if ((Read-Host 'Start the configuration? (Y/N)') -eq 'Y')
 {
 Write-Host 'Starting the script..' -ForegroundColor White -BackgroundColor Black
 Foreach ($item in $MasterList)
 {

if (($item.Manager -eq $null) -or ($item.Manager -eq ""))
 {
 Write-Host 'Item '$item.Mailbox' doesnt have a Manager configured!' -ForegroundColor Red -BackgroundColor Black
 $reportfile = "no-manager-configured-report.txt"
 $empty = $item.Mailbox,$item.Manager,$item.Office
 $empty | Out-File -FilePath $reportfile -Append

}

if (($item.Office -eq $null) -or ($item.Office -eq ""))
 {
 Write-Host 'Item '$item.Manager' doesnt have a Office value configured!' -ForegroundColor Red -BackgroundColor Black
 $reportfile = "no-office-configured-report.txt"
 $empty = $item.Mailbox,$item.Manager,$item.Office
 $empty | Out-File -FilePath $reportfile -Append

}

else
 {
 Write-Host 'Configuring the value for item'$item.Mailbox'to'$item.Office'' -ForegroundColor White -BackgroundColor Black -
 Set-Mailbox -Identity $item.Mailbox -Office $item.Office

$timestamp = Get-Date -UFormat %Y%m%d-%H%M
 $reportfile = "completed-report-$timestamp.txt"
 $list = $item.Mailbox,$item.Manager,$item.Office
 $list | Out-File -FilePath $reportfile -Append

}
 }

}

else{
 exit
 }
 

You can use this script for free, just make sure to test it in a lab environment before, I take no responsibility for any actions and I can’t give any support for it.
Feel free to use the script, edit it, publish it. If you do, please make sure to link back to the blog post url.

Download script

Regards,
Jonas

Traditional Backups using DPM 2012 for Exchange 2010 SP2

Traditional Backups using DPM 2012 for Exchange 2010 SP2

Last week I posted how to restore using EMC, this time it’s up to proof that DPM 2012 (System Center Data Protection Manager) is a software to count on. So here’s a step-by-step guide how DPM 2012 can be configured for backing/protecting Exchange 2010.

I’m using a Windows 2008 R2 for the DPM server together with a 50 GB disk for the backup data (I have small Exchange databases).

Start “System Center 2012 DPM Administrator Console”.

Prerequisites

Note: Make sure to not use circular logging, or else the protection/backups won’t work.

Step 1. Go to the “Monitoring” section and have a look, it looks pretty much the same as DPM 2010 did.

image

Step 2. Go to “Management” section and and take a look at the disks, I’ve added my 50GB disk by pressing the “Disks” and then press the “Add” button and selecting the disk. After that it should show up just like the picture below.

image

Step 3. Press “Agents” in the Management section, then press the “Install” button and you will have a nice wizard helping you. Since my Exchange server is in the same domain as the DPM server and no firewalls between, I did select “Install agents”. Press Next.

image

Step 4. Select the server you want to backup/protect and press “Add” button. Press Next.

image

Step 5. Make sure to insert credentials that have necessary permissions for being allowed to install the agent (local administrator rights).

image

Step 6. Since I want to restart the server myself and have the full control, I did select “No. I will restart the selected computers later.” Press Next.

image

Installation progress will be shown.

image

When the agent installation is completed, it should show the status in “Management” section and “Agents”.

image

Now when the prerequisites are in place, we can proceed with the protection groups creation.

Protect/Backup Exchange 2010

Step 1. Go to “Protection” section and press “New” in the upper left corner and a wizard will start.

image

Step 2. Press Next.

image

Step 3. Select Servers. Press Next.

image

Step 4. Select the server/DAG and the databases you want to protect. Press Next.

image

Step 5. Give the Protection Group a friendly name. Press Next.

image

Step 6. I want DPM to verify the data integrity, put a checkbox in the option “Run Eseutil to check data integrity” and select “Run for both database and log files (maybe slow if databases are large)”. Press Next.

Note: Make sure to copy the “Ese.dll” and “Eseutil.exe” files from \bin folder from Exchange server into the DPM server folder “\DPM\bin\”. Or else this won’t be possible and an error message like below will show up.

image

image

Step 7. The selected databases shows up, I want to have full copy of them so I’m going with the default setting. Press Next.

image

Step 8. Specify how long the backup data should be retained and how often it should do incremental/synchronization backup, also specify when you want the full backups to run. Press Next.

image

Step 9. A summary is showed of data size, modifications can be done. I’ll go for the default settings. Press Next.

image

Step 10. I want DPM to take a full replica right now. Press Next.

image

Step 11. I’ve selected both options and wants my consistency check to run at 12:00 with a maximum duration of 168 hours (1 week). Press Next.

image

Step 12. Summary of settings is shown. Press “Create Group”.

image

After a while, the status should be Successful. Press Close button.

image

When the wizard is completed, the job for taking full replica starts, below is some example pictures.

image

image

Every 15min my setup is doing an incremental backup, in the “Protection” section it shows when it’s running.

image

Have a look in the reports to see how things are going, go to “Reporting” section and select a report you are interest in, I have selected “Recovery Point Status”. A small example of it is shown below.

Those reports can be scheduled and emailed very easy.

image

Next blog post will be how to restore / recover data using DPM 2012 for Exchange 2010.

Thanks for reading and don’t forget to leave a comment

Exchange 2010 Restore to Recovery Database using EMC Networker

Exchange 2010 Restore to Recovery Database using EMC Networker

Published: 2012-07-05
Updated: –
Version: 1.0

Here’s a complete step-by-step guide for doing restore using EMC Networker for Exchange 2010.
Personally I’ve used these steps when doing restore of end user mailbox and/or items that has been lost.

Start up “Networker User for Microsoft Applications”, right click Recover and select “Exchange 2010 Recover Session” and select “Database Recover”.

Make sure that the Client selection is pointed to the DAG or specific server.

After a while it will show Microsoft Exchange 2010 and the databases below, right click the database you want to restore and select “Versions”.

image

Select the date you want to restore from and put a checkbox in “Use selected item backup time as new browse time”. Press OK.

image

Check so that the database and logs are selected and press “Advance Recover..”

image

Control so that the source database is correct and that “Recovery Database (RDB) Recovery” is selected. Press Next.

image

Press the Create button.

image

Make sure that you have sufficient amount of free disk space before starting the restore.
Save the edb/database file in a folder and give it a friendly name. Press Save.

image

Give the RDB a friendly name and press Create.

image

RDB is created successfully.

image

When the RDB is created, mount it by pressing Mount button.

image

Mounted successfully.

image

Press the “RDB Overwrite” button for making sure that Networker is allowed to overwrite the RDB.

image

Press Next.

image

Check the summary and press “Start Recover”.

image

You can monitor the restore process by going to “Monitor” on the left side. It will show information about the restore.

image

When the restore is completed, it will notify with a window like this.

image

The last step before everything is restored is to merge/copy the data from the RDB into a mailbox.
I’m using the command “Restore-Mailbox”

The command below is an example from my restore, it restores the mailbox called “LostMailbox” into my mailbox called “Jonas” and puts the contents into a folder called “Recovery”:

Restore-Mailbox –Identity Jonas –RecoveryDatabase RDB –RecoveryMailbox LostMailbox –TargetFolder Recovery

Then it’s pretty easy to use Outlook and move the contents to the correct mailbox, or else put the contents directly into the right mailbox. It’s up to you!

Source: http://technet.microsoft.com/en-us/library/bb125218.aspx

Exchange 2010 SP2 Update Rollup 3

It was release yesterday, and I was hoping that it should include the upcoming hotfix for ActiveSync devices regarding the behavior for redirections.

But it was not included this time, anyway.. Here’s the team blog, download link and description about the update rollup.

http://blogs.technet.com/b/exchange/archive/2012/05/29/released-update-rollup-3-for-exchange-2010-service-pack-2.aspx

http://www.microsoft.com/en-us/download/details.aspx?id=29899

http://support.microsoft.com/kb/2685289

Quote from team blog:

Note for Forefront Protection for Exchange users  For those of you running Forefront Protection for Exchange, be sure you perform these important steps from the command line in the Forefront directory before and after this rollup’s installation process. Without these steps, Exchange services for Information Store and Transport will not start after you apply this update. Before installing the update, disable ForeFront by using this command: fscutility /disable. After installing the update, re-enable ForeFront by running fscutility /enable.

Configure Microsoft Exchange Server 2010 SP2 with Microsoft Federation Gateway

Configure Microsoft Exchange Server 2010 SP2 with Microsoft Federation Gateway

 

Since the topic around configuring Federation using Microsoft Federation Gateway is not very clear in the documentation I decided to create a post around it.
The confusion came when SP2 was released for Exchange 2010.
One article says one thing and another says something else, things have changed after SP2, that’s why I’m posting this even if there were articles around this for SP1 (see links in the end).

Basic facts: You don’t need to create any sub-domain, it’s done and used only by Exchange itself.

Prerequisites:

You need to open up so that the server is able to reach Internet during the creation of the Federation.
Or else you will have this error message.

image

More information (read about the prereqs):
http://technet.microsoft.com/en-us/library/dd335198.aspx

 

 

Step 1.

The most basic way for creating the Federation trust is to use the EMC.
Go to “Organization Configuration” and select tab “Federation Trust”.
Press the “New Federation Trust” button and the wizard will launch.

image

image

 

 

Step 2.

You will need to run the command below for every domain you want to federate.
Copy the value from the “Proof” field and add it into a TXT record for the public DNS zone.
This is the unique value that the Federation Gateway Service is using to identify and verify.

“Get-FederatedDomainProof –DomainName testlabs.se”

image

 

 

Step 3.

For each domain you want to federate you will need to create a TXT record including the corresponding “Proof” value into.
(In my case I’m just federating one domain).

Create the TXT record in the public DNS zone.
It should look like this when the record has been created.

Let’s take a look in the public DNS using “nslookup”.

image

 

Below is an example on you create a TXT record in the Windows DNS.

Start the DNS Management tool
Select the public DNS zone
Right click the DNS zone and select “Other New Records..”
Choose the “Text (TXT)” type and press “Create Record..”
Then insert the text string into the Text field and press “OK”.

image

 

 

Step 4.

 

Now it’s time for completing the federation steps, we need to add the domain so it’s actually federated.
This is done by using the EMC, go to Organization Configuration and select the tab “Federation Trust”.
Select the “Microsoft Federation Gateway” and press “Manage Federation..”

image

 

In the wizard you can check so that the self-signed certificate (used for federation purpose only) is distributed to all Exchange servers.
Then press “Next”

image

 

Now select the domain you want to federate, in my case it’s “testlabs.se”, and press “OK”.

image

 

Type in the organizational contact for this domain and make sure that the checkbox for “Enable federation” is selected.

image

image

 

In the EMC it should now show the “Application Identifier” and “Application URI” values.
Those values were empty before.

image

 

 

Step 5.

The last step around the Federation is to make sure that the Autodiscover function is working since it’s used for finding and checking the FreeBusy information.
First thing to make sure of is that it’s published in the public DNS zone, when it’s published it should look like the picture below.

Autodiscover must be reachable from Outside/External and this is also done per domain, so for each domain you want to federate this must be done.

image

 

Below is an example on you create a Alias/CNAME record in the Windows DNS.

Start the DNS Management tool
Select the public DNS zone
Right click the DNS zone and select “New Alias (CNAME)..”
In the “Alias name” field type in Autodiscover and in the FQDN value browse for the server/name that’s used for Autodiscover
Press “OK”

image

 

For publishing Autodiscover using TMG, check this article:
http://www.testlabs.se/blog/2010/07/27/how-to-publish-owaactivesyncoutlook-anywhere-exchange-2010-with-microsoft-forefront-tmg-2/

 

 

Step 6.

The last and final step for accomplish the sharing of FreeBusy information is to create the Organization Relationship.

Go to “Organization Configuration” and select tab “Organizational Relationships”.
Press the “New Organizational Relationship..” button and the wizard will launch.

For details around which relationship you should choose, read the link below:
http://technet.microsoft.com/en-us/library/dd351260.aspx

 

If you want to specify which users that should be able to use this federation feature, this can be done by specifying a security distribution group.

image

 

Next step is to type in the organization you will be able for sharing the information with.
This can be done either by using Autodiscover (first option) or manually typing in the “Application URI” and “Autodiscover endpoint”.

image

 

 

Notice: This article is based on Exchange 2010 SP2

 

 

Sources:

http://technet.microsoft.com/en-us/library/ff601760.aspx

http://www.stevieg.org/2010/08/federation-onpremise-outlooklive/

http://www.expta.com/2011/07/how-to-configure-exchange-2010-sp1.html

C#.NET – Configure Exchange 2010 Tool

C#.NET – Configure Exchange 2010 Tool

======

Updated the code again, this time a minor bug in code.
Version is now 0.93.

======

Thanks to John A Cook @JohnACook, who found the issue. It’s now resolved, the tool is now updated and working in my lab environment.
It was a compilation issue, found out that it was compiled as a x86 tool. Sorry for that folks! Thanks a lot for helping me out

======

Download

ChangeLog:
0.93 – Updated minor bug in code
0.92 – Fixed the compile issue.
0.91 – The tool has now been updated to version 0.91, this update fixed if URL’s was not configured/null.

Description:

A while ago I was having this idea of creating a tool that configure the most common things on the Exchange server(s).

It took about 3-4 weeks to complete the application with all coding, which includes around 3000 lines in total.

The tool should be used locally on the server, since it’s using the Exchange PowerShell snapin when doing the query’s and configuring parts.

Besides the smaller parts that uses PowerShell the application is built on C#.NET.

Before going into detail, at the moment it’s version 0.9 since I’m about to optimize the code a bit more. I will update the blog post when it’s done.
Until then, use it as much you want and feel free to give any feedback (it’s great to get feedback).

The debugging of the application has been done on Exchange 2010 SP2, that’s the version it’s built for. But most likely it will work on RTM newer.

Description:

The tool will give you the opportunity to configure the following Exchange features:

Autodiscover, Outlook Web App, Active Sync, Web Services, Control Panel, Offline Address Book, POP/IMAP and Outlook Anywhere.

Check the screenshots below:

imageimageimage

All functions are built upon a query is done first and then it’s possible the change the current settings using the “Set” button.

The first tab is for configuring the Autodiscover SCP settings (Get-ClientAccessServer).
Press the Query button for requesting the current setting, and then you’re able to change it by editing the text and press “Set” button.

The second tab it for set the Internal and ExternalUrl for Outlook Web App, and also for the Logon format.

Third tab is used for Exchange ActiveSync, it’s possible to set the Internal and ExternalUrl and also set the Basic Authentication setting.

Fourth tab is for Exchange Web Services, Internal and ExternalUrl is about to be configured.

Fifth, Exchange Control Panel settings; Internal and ExternalUrl.

Sixth, Offline Address Book settings; Internal and ExternalUrl.

Seventh, POP and IMAP settings, it’s possible to change the Logintype, X509 name and set the Service to Automatic and Start it.

Eighth and final tab, Outlook Anywhere configuration, External hostname and what authentication setting is possible to change here.

About tab, it speaks for it self. Information about the small application

Note: The first query take some time, since it’s loading the snapin. Have some patience, but after the first one it should be pretty fast.

Download the application from here

Like I initially said I will do some code optimization, and will be updating this blog post when it’s done.
Feel free to leave comments, it’s always a pleasure to read them!

Ps. Use the application/code/scripts at your own risk. Test in lab environment first.

Thanks for reading

Load More