Hyper-V: Post-migration Tasks
Applies To: Windows Server 2008 R2, Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 with SP1
After you have performed the verification steps, you are ready to complete the migration. Completing the migration for Hyper-V consists of either retiring the source server if the migration succeeded, or rolling back the source server to its pre-migration state if the migration failed.
Retiring your source server
If the migration succeeded, you can repurpose the server for another use or retain it as a backup.
Important
We recommend that you remove the Hyper-V role as soon as you verify that the migration succeeded, to avoid unintentionally placing the source server back online, which could result in running duplicate virtual machines on the same network.
Restoring the role in the event of migration failure
If verification was not successful, follow these steps to roll back the migration.
Roll back migration of Hyper-V on the source server
To roll back migration of Hyper-V on the source server
Disconnect the destination server from the network.
If you removed the Hyper-V role from the source server, add the Hyper-V role.
Reconnect the source server to the network.
Restart all the virtual machines.
Roll back migration of Hyper-V on the destination server running Windows Server 2012
To roll back migration of Hyper-V on the destination server
Delete the migrated virtual machines.
Important
Do not delete the migrated data if you plan to retry the migration to the destination server. This will allow you to save time by not having to copy the data files again.
Remove the Hyper-V role.
Roll back migration changes on other computers in the enterprise
For each client that depends on workloads running on virtual machines on the source server, verify that the clients can communicate with the virtual machines.
Troubleshooting cmdlet-based migration
The Windows Server Migration Tools deployment log file is located at %windir%\Logs\SmigDeploy.log. Additional Windows Server Migration Tools log files are created at the following locations.
%windir%\Logs\ServerMigration.log
On Windows Server 2008, Windows Server 2008 R2, and Windows Server 2012: %localappdata%\SvrMig\Log
On Windows Server 2003: %userprofile%\Local Settings\Application Data\SvrMig\Log
If migration log files cannot be created in the preceding locations, ServerMigration.log and SmigDeploy.log are created in %temp%, and other logs are created in %windir%\System32.
If a migration cmdlet fails, and the Windows PowerShell session closes unexpectedly with an access violation error message, look for a message similar to the following example in the %localappdata%\SvrMig\Logs\setuperr.log file.
FatalError [0x090001] PANTHR Exception (code 0xC0000005: ACCESS_VIOLATION) occurred at 0x000007FEEDE9E050 in C:\Windows\system32\migwiz\unbcl.dll (+000000000008E050). Minidump attached (317793 bytes). This failure occurs when the server cannot contact domain controllers that are associated with domain users or groups who are members of local groups, or who have rights to files or shares that are being migrated. When this happens, each domain user or group is displayed in the GUI as an unresolved security identifier (SID). An example of a SID is S-1-5-21-1579938362-1064596589-3161144252-1006.
To prevent this problem, verify that required domain controllers or global catalog servers are running, and that network connectivity allows communication between both source and destination servers and required domain controllers or global catalog servers. Then, run the cmdlets again.
If connections between either the source or destination servers and the domain controllers or global catalog servers cannot be restored, do the following.
Before you run Export-SmigServerSetting, Import-SmigServerSetting or Get-SmigServerFeature again, remove all unresolved domain users or groups who are members of local groups from the server on which you are running the cmdlet.
Before you run Send-SmigServerData or Receive-SmigServerData again, remove all unresolved domain users or groups who have user rights to files, folders, or shares on the migration source server.
Viewing the content of Windows Server Migration Tools result objects
All Windows Server Migration Tools cmdlets return results as objects. You can save result objects, and query them for more information about settings and data that were migrated. You can also use result objects as input for other Windows PowerShell commands and scripts.
Result object descriptions
The Windows Server Migration ToolsImport-SmigServerSetting and Export-SmigServerSetting cmdlets return results in a list of MigrationResult objects. Each MigrationResult object contains information about the data or setting that the cmdlet processes, the result of the operation, and any related error or warning messages. The following table describes the properties of a MigrationResult object.
Property name | Type | Definition |
---|---|---|
ItemType | Enum | The type of item being migrated. Values include General, WindowsFeatureInstallation, WindowsFeature, and OSSetting. |
ID | String | The ID of the migrated item. Examples of values include Local User, Local Group, and DHCP. |
Success | Boolean | The value True is displayed if migration was successful; otherwise, False is displayed. |
DetailsList | List <MigrationResultDetails> | A list of MigrationResultDetails objects. |
Send-SmigServerData and Receive-SmigServerData cmdlets return results in a list of MigrationDataResult objects. Each MigrationDataResult object contains information about the data or share that the cmdlet processes, the result of the operation, any error or warning messages, and other related information. The following table describes the properties of a MigrationDataResult object.
Property name | Type | Definition |
---|---|---|
ItemType | Enum | The type of migrated item. Values include File, Folder, Share, and Encrypted File. |
SourceLocation | String | The source location of the item, shown as a path name. |
DestinationLocation | String | The destination location of the item, shown as a path name. |
Success | Boolean | The value True is displayed if migration was successful; otherwise, False is displayed. |
Size | Integer | The item size, in bytes. |
ErrorDetails | List <MigrationResultDetails> | A list of MigrationResultDetails objects. |
Error | Enum | Errors enumeration for errors that occurred. |
WarningMessageList | List <String> | A list of warning messages. |
The following table describes the properties of objects within the MigrationResultDetails object that are common to both MigrationResult and MigrationDataResult objects.
Property name | Type | Definition |
---|---|---|
FeatureId | String | The name of the migration setting that is related to the item. Examples of values include IPConfig and DNS. This property is empty for data migration. |
Messages | List <String> | A list of detailed event messages. |
DetailCode | Integer | The error or warning code associated with each event message. |
Severity | Enum | The severity of an event, if events occurred. Examples of values include Information, Error, and Warning. |
Title | String | Title of the result object. Examples of values include NIC physical address for IP configuration, or user name for local user migration. |
Examples
The following examples show how to store the list of the result objects in a variable, and then use the variable in a query to return the content of result objects after migration is complete.
To store a list of result objects as a variable for queries
To run a cmdlet and save the result in variable, type a command in the following format, and then press Enter.
$
VariableName=
$(Cmdlet)The following is an example.
$ImportResult = $(Import-SmigServerSetting -FeatureId DHCP -User all -Group -Path D:\rmt\DemoStore -force -Verbose)
This command runs the Import-SmigServerSetting cmdlet with several parameters specified, and then saves result objects in the variable ImportResult.
After the Import-SmigServerSetting cmdlet has completed its operations, return the information contained in the result object by typing a command in the following format, and then pressing Enter.
$
VariableNameIn the following example, the variable is named ImportResult.
$
ImportResultThis command returns information contained in the result objects that were returned by Import-SmigServerSetting in the example shown in step 1. The following is an example of the output that is displayed by calling the ImportResult variable.
ItemType ID Success DetailsList -------- -- ------- ----------- OSSetting Local User True {Local User, Loc... OSSetting Local Group True {Local Group, Lo... WindowsFeature DHCP True {}
Each line of the preceding sample is a migration result for an item that was migrated by using the Import-SmigServerSetting cmdlet. The column heading names are properties of MigrationResult objects. You can incorporate these properties into another command to return greater detail about result objects, as shown by examples in step 3 and forward.
To display a specific property for all result objects in the list, type a command in the following format, and then press Enter.
$<VariableName>| Select-Object -ExpandProperty <PropertyName>
The following is an example.
$importResult | Select-Object -ExpandProperty DetailsList
You can run more advanced queries to analyze result objects by using Windows PowerShell cmdlets. The following are examples.
The following command returns only those details of result objects that have the ID Local User.
$ImportResult | Where-Object { $_.ID -eq "Local User" } | Select-Object -ExpandProperty DetailsList
The following command returns only those details of result objects with an ID of Local User that have a message severity equal to Warning.
$ImportResult | Where-Object { $_.ID -eq "Local User" } | Select-Object -ExpandProperty DetailsList | ForEach-Object { if ($_.Severity -eq "Warning") {$_} }
The following command returns only the details of result objects with an ID of Local User that also have the title Remote Desktop Users.
$ImportResult | Where-Object { $_.ID -eq "Local Group" } | Select-Object -ExpandProperty DetailsList | ForEach-Object { if ($_.Title -eq "Remote DesktopUsers") {$_} }
More information about querying results
For more information about the cmdlets that are used in the preceding examples, see the following additional resources.
Where-Object on the Microsoft Script Center Web site (https://go.microsoft.com/fwlink/?LinkId=134853).
Select-Object on the Microsoft Script Center Web site (https://go.microsoft.com/fwlink/?LinkId=134858).
ForEach-Object on the Microsoft Script Center Web site (https://go.microsoft.com/fwlink/?LinkId=134860)
For more information about Windows PowerShell scripting techniques, see What Can I Do With Windows PowerShell? - Scripting Techniques on the Microsoft Script Center Web site (https://go.microsoft.com/fwlink/?LinkId=134862).