---
title: "Move Exchange Mailboxes with new-moverequest Command"
description: "Learn how to move mailboxes the right way and how to start and manage local move requests using Windows Powershell!"
canonical: "https://adamtheautomator.com/new-moverequest/"
---

# Move Exchange Mailboxes with new-moverequest Command

> Learn how to move mailboxes the right way and how to start and manage local move requests using Windows Powershell!

Source: https://adamtheautomator.com/new-moverequest/

---

ATA Learning

Tap to hide

[

ATA Learning

](/)

*   [Home](/)
*   [Tutorials](/tutorials/)
*   [Instructors](/author/)
*   [Advertising](/advertising/)
*   [Recommended Resources](/resources/)
*   [About Adam](/about-adam/)

Search for:  

*   [](https://twitter.com/adbertram)
*   [](https://github.com/Adam-the-Automator)
*   [](https://www.linkedin.com/company/adam-the-automator-llc)
*   [](/feed/)

![Move Exchange Mailboxes with new-moverequest Command](https://adamtheautomator.com/wp-content/uploads/2021/02/How-to-Move-Exchange-Mailboxes-with-PowerShell.png)

# Move Exchange Mailboxes with new-moverequest Command

[![](https://secure.gravatar.com/avatar/5cd71a4e2894e3d2608b9e07347e05b85fa86e0955eb3f708412e6b9da7fd920?s=192&d=mm&r=g)Faris Malaeb](https://adamtheautomator.com/author/faris/)23 February 20218 min. read

Categories: [IT Ops](/category/it-ops/)

Tags:[Microsoft Exchange](/tag/microsoft-exchange/)

Table of Contents

*   [Prerequisites](#h-prerequisites)
*   [Preparing for a User Mailbox Move](#h-preparing-for-a-user-mailbox-move)
*   [Creating the Local Move Request for a User Mailbox](#h-creating-the-local-move-request-for-a-user-mailbox)
*   [Moving the User Primary and Archive Mailbox](#h-moving-the-user-primary-and-archive-mailbox)
*   [Moving the User Primary Mailbox Only](#h-moving-the-user-primary-mailbox-only)
*   [Moving Arbitration and Discovery Search Mailboxes](#h-moving-arbitration-and-discovery-search-mailboxes)
*   [Arbitration Mailboxes](#h-arbitration-mailboxes)
*   [Discovery Search Mailboxes](#h-discovery-search-mailboxes)
*   [Monitoring Mailbox Moves with Get-MoveRequest](#h-monitoring-mailbox-moves-with-get-moverequest)
*   [Getting Local Move Statistics](#h-getting-local-move-statistics)
*   [Resuming and Completing a Move Request](#h-resuming-and-completing-a-move-request)
*   [Delaying Move Requests](#h-delaying-move-requests)
*   [Removing Move Requests](#h-removing-move-requests)

Moving mailboxes is a common task amongst Microsoft Exchange administrators. You can move mailboxes a couple of different ways but with PowerShell the `New-MoveRequest` cmdlet can be your friend.

Not a reader? Watch this related video tutorial!

**_Not seeing the video? Make sure your ad blocker is disabled._**

Known as a _Local Move Request_, you can move user, archive, arbitration, discovery, and other types of mailboxes. In this tutorial, you will learn how to start and manage local move requests using Windows Powershell!

## Prerequisites

If you’d like to follow along with all examples demoed in this tutorial, be sure you have the following ahead of time:

*   An on-premises Exchange 2013/2016 or 2019 running in an Active Directory environment
*   Local Move Request should be performed in the same Active Directory forest
*   Logged into a domain-joined computer with a domain user having the _[Mailbox Move and Migration Permission](https://docs.microsoft.com/en-us/exchange/permissions/feature-permissions/recipient-permissions?view=exchserver-2019)_ permission
*   The Exchange Mailbox Replication Server (MRS) and Exchange Mailbox Replication Proxy services running on a mailbox server.
*   An available source and destination mailbox – This tutorial will use a source mailbox database of _Ex01-DB_ and will move a mailbox to a destination mailbox database of _Ex02-DB_.
*   A mailbox is available to move – This tutorial will be moving the _Administrator_ user mailbox.
*   If you logged into the server, then use Exchange Management Shell, or you can connect Exchange server from any workstation using [Powershell Remoting](https://adamtheautomator.com/psremoting/ "Powershell Remoting").

Related: [**_Connect to Exchange Server using Remote PowerShell_**](https://docs.microsoft.com/en-us/powershell/exchange/connect-to-exchange-servers-using-remote-powershell?view=exchange-ps)

## Preparing for a User Mailbox Move

Before you actually move the mailbox to another database, you must ensure it’s possible first. There are numerous scenarios where you’ll know the move would fail ahead of time such as:

*   The destination database is Mounted and Healthy
*   The User Mailbox is not larger than the Database Limits Policy
*   Moving a mailbox generates a lot of transaction logs, make sure that there is enough free space on the disk hosting the EDB and the Transaction log.
*   The destination database doesn’t have enough room for the mailbox

With a PowerShell console open and authenticated to Exchange:

1.  Run the `Get-MailboxStatistics` cmdlet pointing it to the source mailbox as shown below. You need to first discover what database the source mailbox is on.

```powershell
Get-MailboxStatistics Administrator | Select-Object -Property Database,Displayname 
```

![The Administrator mailbox is on the EX01-DB database](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T162338.769.png)

The Administrator mailbox is on the EX01-DB database

2\. If the mailbox database is DAG Enabled then you can now check the status of the database using the `Get-MailboxDatabaseCopyStatus` cmdlet. This cmdlet, among other things, will provide the status for each database in your organization.

> _To see if DAG is configured or not, run the following command `Get-DatabaseAvailabilityGroup`_

As you can see below, the source database of _EX01-DB_ is _Healthy_ as well as the destination database of _EX02-DB_.

```powershell
Get-MailboxDatabaseCopyStatus | select name,Status 
```

![Healthy Database, it also can be Mounted ](https://adamtheautomator.com/wp-content/uploads/2021/02/Screenshot_2021-02-12_141115-1.png)

Healthy Database, it also can be Mounted

> _A Healthy status means that the database is healthy but not accepting client protocol connection requests. A Mounted status means that the database is healthy, mounted, and accepting client requests._

If DAG is not enabled, an alternative command can be used which

```powershell
Get-MailboxDatabase -Status | Format-Table Name, Server, Mounted 
```

The command will return all the available databases with their status

![Getting Exchange Database status in a Non-DAG environment](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T162633.557.png)

Getting [Exchange Database](https://adamtheautomator.com/get-mailboxdatabase/ "Exchange Database") status in a Non-DAG environment

3\. You’ve now confirmed the source and destination database servers are online and ready to move. Finally, check to see if the destination database has enough space for the mailbox.

## Creating the Local Move Request for a User Mailbox

Once you’ve confirmed a move is actually possible, it’s time to create the local move request using the `[_New-MoveRequest_](https://docs.microsoft.com/en-us/powershell/module/exchange/new-moverequest?view=exchange-ps)` cmdlet. The `New-MoveRequest` cmdlet requires only one parameter, which is the `Identity`, other parameters are optional and will provide you better control on where to move the mailbox to.

The `New-MoveRequest` cmdlet supports moving:

*   The Primary mailbox only
*   The Archive Mailbox only
*   Both the Primary and Archive Mailbox

### Moving the User Primary and Archive Mailbox

Creating a local move request only requires a single line. To move the tutorial’s source mailbox from source to the destination database, run the following command:

The below example moves the _administrator p_rimary mailbox to the _EX02-DB_ database and the archive mailbox to the _EX02-DB_ database. It will also give a name for the batch as “_AdminMailbox._” **BatchName**: Name of a batch. This can be used to filter the result when used with `Get-MoveRequest`

```powershell
New-MoveRequest -Identity administrator -TargetDatabase ex02-db -ArchiveTargetDatabase ex02-db -BatchName "AdminMailbox"
```

![Creating a new move request via PowerShell](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T163216.847.png)

Creating a new move request via PowerShell

> _If there are multiple users that should be moved, then it’s possible to type the username and then pipeline it to New-MoveRequest, like “User1″,”User2” | New-MoveRequest -TargetDatabase Ex01-DB. No need to set the -Identity parameter as the Identity will be fed through the pipeline_

### Moving the User Primary Mailbox Only

If you’d rather leave the user’s archive mailbox as-is, you don’t have to move it. Instead, use the`-PrimaryOnly` parameter without specifying the `-ArchiveTargetDatabase` parameter as shown below.

```powershell
New-MoveRequest -Identity administrator -TargetDatabase ex02-db -PrimaryOnly -BatchName "AdminMailbox"
```

> _You can also use the `-ArchiveOnly` parameter to only move the archive database._

## Moving Arbitration and Discovery Search Mailboxes

Most of the mailboxes you’ll find yourself moving will be user mailboxes. But, Exchange Server has other types of mailboxes that you’ll need to move on occasion called service mailboxes. Service mailboxes perform internal tasks and do not get directly assigned to users.

### Arbitration Mailboxes

One of the most common service mailboxes is the [_Arbitration mailbox_](https://docs.microsoft.com/en-us/exchange/architecture/mailbox-servers/recreate-arbitration-mailboxes?view=exchserver-2019). Arbitration mailboxes are are used to store information about Exchange organization federation, information about the Exchange migration service, e-discovery, and more.

You can find a list of all arbitration mailboxes using the [_`Get-Mailbox` cmdlet_](http://\(https://docs.microsoft.com/en-us/powershell/module/exchange/get-mailbox) using the `-Arbitration` parameter.

```powershell
Get-Mailbox -Arbitration
```

Moving arbitration mailboxes are similar to moving user mailboxes with just a minor difference.

Start by finding all of the arbitration mailboxes in a mailbox database. The example below is finding all arbitration mailboxes in the _EX01-DB_ database limiting the output down to just the `Name`.

```powershell
Get-MailboxDatabase -Identity ex01-db | get-mailbox -arbitration | ft -AutoSize Name 
```

![Getting a list of Arbitration Mailboxes](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T163501.198.png)

Getting a list of Arbitration Mailboxes

Now that you can see all of the arbitration mailboxes in a database, move them with `New-MoveRequest` using the same parameters as with a user mailbox.

The command below is moving all arbitration mailboxes inside of the _EX01-DB_ database to the _EX02-DB_ database.

```powershell
Get-MailboxDatabase -Identity ex01-db | get-mailbox -arbitration | New-MoveRequest -TargetDatabase Ex02-DB -BatchName "All Arbitration Mailboxes"
```

If all goes well, you should see a successful execution as shown below.

![The Progress of the Move Request ](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T163731.840.png)

The Progress of the Move Request

These mailboxes are usually not large, so moving these mailboxes won’t take much time.

Like user mailboxes, you can also see the progress using the `Get-MoveRequest` cmdlet.

![Move Request Status](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T163834.607.png)

Move Request Status

### Discovery Search Mailboxes

Much like arbitration mailboxes, you can move discovery search mailboxes in the same manner but with one minor change to discover discovery search mailboxes.

To find discovery search mailboxes, you must filter the output of `Get-Mailbox` and return only mailboxes with a `RecipientTypeDetails` property value of `DiscoveryMailbox` as shown below.

```powershell
$DiscoveryMailboxes = Get-MailboxDatabase Ex01-db | Get-Mailbox | where {$_.RecipientTypeDetails -like "DiscoveryMailbox"}
```

Once you’ve collected all of the discovery mailboxes in a database, you can then initiate a new move request just like with an arbitration or user mailbox.

```powershell
$DiscoveryMailbox | New-MoveRequest -TargetDatabase Ex02-db
```

![Moving DiscoverySearchMailbox](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T163958.132.png)

Moving DiscoverySearchMailbox

## Monitoring Mailbox Moves with `Get-MoveRequest`

A move request doesn’t happen immediately. If you need to monitor the progress of a move request, you can use the [_`Get-MoveRequest` cmdlet_](https://docs.microsoft.com/en-us/powershell/module/exchange/get-moverequest?view=exchange-ps). The `Get-MoveRequest` cmdlet displays all of the currently-running move requests.

Running the `Get-MoveRequest` command will return all the current move requests regardless of where these requests started from either from the web interface or with PowerShell.

![Get-MoveRequest](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T164129.869.png)

Get-MoveRequest

> _A move request initiated from Powershell won’t appear in the Exchange Management Console (Web Interface). These jobs can be viewed only using the Get-MoveRequest command._

By default, as you can see from the above screenshot, `Get-MoveRequest` doesn’t tell you a whole lot. It only displays the mailbox name, status, and what database it’s currently being moved to. Inspect all of the properties it returns by piping the output to either `Select-Object` or the `Format-List` cmdlet (`fl` alias).

```powershell
Get-MoveRequest | Format-List
```

You can now see other properties like the source and destination but it’d be nice to see a percentage of where the move is at.

![Get a all the properties for a move request](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T164215.819.png)

Get a all the properties for a move request

### Getting Local Move Statistics

As you’ve seen, the `Get-MoveRequest` cmdlet doesn’t offer a whole lot of information. To remedy this, pipe the output of `Get-MoveRequest` to `Get-MoveRequestStatistics`. The `Get-MoveRequestStatistics` cmdlet provides a lot more detail such as progress percentage.

```powershell
Get-MoveRequest | Get-MoveRequestStatistics
```

![Getting mailbox Statistics](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T164250.853.png)

Getting mailbox Statistics

Similar to the output of `Get-MoveRequest`, you can also pipe the output of `Get-MoveRequestStatistics` to `Select-Object` or `Format-List` again as shown below.

```powershell
Get-MoveRequest Administrator | Get-MoveRequestStatistics | Format-List
```

The `Get-MoveRequestStatistics` cmdlet returns a lot of useful information so it’s important you understand what many of the most useful properties mean.

*   **Displayname**: The display name for the targeted account.
*   **PercentComplete**: The progress percentage of the move progress.
*   **StatusDetail**: Details about the current status, can be _Completed_, _InProgress_, _CreatingInitialSyncCheckpoint_.
*   **Suspend**: The move request will be created but will not yet start. It will be in Suspend state, to start the move request by using `[_Resume-MoveRequest_](https://docs.microsoft.com/en-us/powershell/module/exchange/resume-moverequest?view=exchange-ps) -Identity administrator`. After executing this command, the `Suspend` property will switch to `$false` and the move request will start.
*   **SuspendWhenReadyToComplete**: Will sync up to 95% of the mailbox, the admin has to complete the request by using `Resume-MoveRequest`
*   **BadItemsEncountered**: Number of corrupted items encountered during the migration.
*   **OverallDuration**: The total time the migration took to complete
*   **TotalMailboxSize**: Mailbox size in MB
*   **Message**: Detailed information about the move request. For example, when initiating `New-MoveRequest` and setting the `-SuspendWhenReadyToComplete` parameter to `$true` the move operation will stop at 95% and will require the administrator to resume it. The `Message` property will show: _Informational: The move request for mailbox 60ba0d44-e046-4608-b162-6382bd9d070c is ready to complete and has been automatically suspended because the SuspendWhenReadyToComplete parameter is set to $true._

## Resuming and Completing a Move Request

To resume the move request, the `Resume-MoveRequest`command is used. It doesn’t accept many parameters, unlike the `New-MoveRequest`. The easiest way to use `Resume-MoveRequest` is to pipeline it with `Get-MoveRequest`. The `Get-MoveRequest` will get the move request, and the `Resume-MoveRequest` will read the move request and resume it to the end.

```powershell
Get-MoveRequest administrator | Resume-MoveRequest
```

There will be no output from this command, But if `Get-MoveRequest | Get-MoveRequestStatistics | fl` is executed, you will notice that the **Status** is _InProgress_ and the **SyncStage** is _FinalIncrementalSync._ Wait for a few minutes and run `Get-MoveRequest | Get-MoveRequestStatistics` ; you will notice that the progress is completed and the **PercentComplete** is 100.

![After Resuming a move request.](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T165115.897.png)

After Resuming a move request.

## Delaying Move Requests

Whenever you initiate a move request with `New-MoveRequest` for a user’s primary mailbox and complete the move, the owner of that mailbox may encounter this message: “_The Microsoft Exchange Administrator has made a change that requires you to quit and restart Outlook_“.

To prevent any messages presented to the mailbox owner, you may want to migrate the user’s mailbox, but not completing it until the weekend. This way, when the user comes back into the office, they can open Outlook with no message. This scenario is an example of why you might want to use the `-SuspendWhenReadyToComplete` parameter with `New-MoveRequest`.

> _Personally speaking, I never use this command, instead, I inform the user about what I am doing and what they might see._

Using the example from earlier, perhaps you know use the `-SuspendWhenReadyToComplete` parameter as shown below.

```powershell
New-MoveRequest -Identity administrator -TargetDatabase ex01-db -ArchiveTargetDatabase ex01-db -BatchName "AdminMailbox" -SuspendWhenReadyToComplete
```

The _Administrator_ account will be moved to the _EX01-DB_ database along with the archive mailbox. But this time, the process will suspend at 95%.

Once started, wait a little bit and run the following command:

```powershell
Get-MoveRequest administrator | Get-MoveRequestStatistics | Select-Object -Property *
```

You should now see the `SuspendWhenReadyToComplete` property is set to `True`.

![SuspendWhenReadyToComplete is True](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T165201.721.png)

SuspendWhenReadyToComplete is True

Now when the operation reaches 95%, the `StatusDetail` property value will be `AutoSuspended` and the `SuspendWhenReadyToComplete` value will be `False`.

You’ll also see the `Message` property mentions the process was placed on hold as `SuspendWhenReadyToComplete` was set to `True` when you started the move request.

## Removing Move Requests

When a move request is running, it will appear active. When the move is complete, the move request should be removed. But what if you changed your mind and you want to cancel the move? In that case, you can use the `Remove-MoveRequest` cmdlet.

If, for example, you decide to cancel the move request for the _Administrator_ mailbox initiated earlier, simply pipe the request to `Remove-MoveRequest` as shown below.

```powershell
Get-MoveRequest administrator | Remove-MoveRequest
```

![Removing a Move Request](https://adamtheautomator.com/wp-content/uploads/2021/02/Untitled-2021-02-16T165237.856.png)

Removing a Move Request

Share this article

[Share on X](https://twitter.com/intent/tweet?url=https%3A%2F%2Fadamtheautomator.com%2Fnew-moverequest%2F&text=Move%20Exchange%20Mailboxes%20with%20new-moverequest%20Command)[Share on Facebook](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fadamtheautomator.com%2Fnew-moverequest%2F)[Share on LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fadamtheautomator.com%2Fnew-moverequest%2F)

## Related Posts

![](https://adamtheautomator.com/wp-content/uploads/2021/04/Exchange-Distribution-Groups_-Your-How-To-Ultimate-Guide.jpg)

### [Exchange Distribution Groups: Your How-To Ultimate Guide](/exchange-distribution-group/)

Need to work with Exchange distribution groups? Learn the ins and outs of how to manage them with the Exchange Admin Center and PowerShell.

![](https://adamtheautomator.com/wp-content/uploads/2021/02/How-to-Move-Exchange-Mailboxes-with-Exchange-Admin-Center-Moving-user-mailboxes-is-a-common-1.jpg)

### [Easily Move Mailbox with Exchange Admin Center](/move-mailbox/)

Learn how to move a mailbox in Exchange 2013, 2016 and 2019 in this informative walkthrough tutorial.

![](https://adamtheautomator.com/wp-content/uploads/2021/01/How-to-Set-Up-Exchange-2019-Database-Availability-Groups.jpg)

### [Setting Up Exchange Database Availability Groups Correctly](/exchange-database-availability-group/)

Learn how to set up Exchange database availability groups with Exchange Admin Center and PowerShell in this step-by-step guide.

## Categories

*   [IT Ops](/category/it-ops/)
*   [Cloud](/category/cloud/)
*   [DevOps](/category/devops/)
*   [Home Ops](/category/home-ops/)
*   [Information Security](/category/infosec/)
*   [Software Development](/category/software-development/)

## Site

*   [Home](/)
*   [Tutorials](/tutorials/)
*   [Instructors](/author/)
*   [Advertising](/advertising/)
*   [Recommended Resources](/resources/)
*   [About Adam](/about-adam/)

Copyright 2026© ATA Learning | [Privacy Policy](/privacy/)
