Overview

This topic describes the XML elements and helper functions that you can employ to author migration .xml files to use with User State Migration Tool (USMT). It is assumed that you understand the basics of XML. You can download a .doc file version of this file at this Microsoft web site.

In This Topic

In addition to XML elements and helper functions, this topic describes how to specify encoded locations and locations patterns, functions that are for internal USMT use only, and the version tags that you can use with helper functions.

Elements and Helper Functions

<addObjects>

The <addObjects> element emulates the existence of one or more objects on the source computer. The child <object> elements provide the details of the emulated objects. If the content is a <script> element, the result of the invocation will be an array of objects.

Syntax:

<addObjects>

</addObjects>

The following example is from the MigApp.xml file:

<addObjects>
   <object>
	<location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [UpgradeVersion]</location>
	<attributes>DWORD</attributes>
	<bytes>0B000000</bytes>
   </object>
   <object>
	<location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [Lang]</location>
	<attributes>DWORD</attributes>
	<bytes>00000000</bytes>
   </object>
</addObjects>

<attributes>

The <attributes> element defines the attributes for a registry key or file.

  • Number of occurrences: once for each <object>

  • Parent elements: <object>

  • Child elements: none

Syntax:

<attributes>Content</attributes>

Setting Required? Value

Content

Yes

The content depends on the type of object specified.

  • For files, the content can be a string containing any of the following attributes separated by commas:

    • Archive

    • Read-only

    • System

    • Hidden

  • For registry keys, the content can be one of the following types:

    • None

    • String

    • ExpandString

    • Binary

    • Dword

    • REG_SZ

The following example is from the MigApp.xml file:

<object>
   <location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [Lang]</location>
   <attributes>DWORD</attributes>
   <bytes>00000000</bytes>
</object> 

<bytes>

You must specify the <bytes> element only for files because, if <location> corresponds to a registry key or a directory, then <bytes> will be ignored.

  • Number of occurrences: zero or one

  • Parent elements: <object>

  • Child elements: none

Syntax:

<bytes string="Yes|No" expand="Yes|No">Content</bytes>

Setting Required? Value

string

No, default is No

Determines whether Content should be interpreted as a string or as bytes.

expand

No (default = Yes

When the expand parameter is Yes, the content of the <bytes> element is first expanded in the context of the source computer and then interpreted.

Content

Yes

Depends on the value of the string.

  • When the string is Yes: the content of the <bytes> element is interpreted as a string.

  • When the string is No: the content of the <bytes> element is interpreted as bytes. Each two characters represent the hexadecimal value of a byte. For example, "616263" is the representation for the "abc" ANSI string. A complete representation of the UNICODE string "abc" including the string terminator would be: "6100620063000000".

The following example is from the MigApp.xml file:

<object>
   <location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [Lang]</location>
   <attributes>DWORD</attributes>
   <bytes>00000000</bytes>
</object> 

<commandLine>

You might want to use the <commandLine> element if you want to start or stop a service or application before or after you run the ScanState and LoadState tools.

  • Number of occurrences: unlimited

  • Parent elements: <externalProcess>

  • Child elements: none

Syntax:

<commandLine>CommandLineString</commandLine>

Setting Required? Value

CommandLineString

Yes

A valid command line.

<component>

The <component> element is required in a custom .xml file. This element defines the most basic construct of a migration .xml file. For example, in the MigApp.xml file, "Microsoft® Office 2003" is a component that contains another component, "Microsoft Office Access® 2003". You can use the child elements to define the component.

A component can be nested inside another component; that is, the <component> element can be a child of the <role> element within the <component> element in two cases: 1) when the parent <component> element is a container or 2) if the child <component> element has the same role as the parent <component> element.

Syntax:

<component type="System|Application|Device|Documents" context="User|System|UserAndSystem" defaultSupported="TRUE|FALSE|YES|NO"

hidden="Yes|No">

</component>

Setting Required? Value

type

Yes

You can use the following to group settings, and define the type of the component.

  • System: Operating system settings. All Windows® components are defined by this type.

    When type="System" and defaultSupported="FALSE" the settings will not migrate unless there is an equivalent component in the .xml files that is specified on the LoadState command line. For example, the default MigSys.xml file contains components with type="System" and defaultSupported="FALSE". If you specify this file on the ScanState command line, you must also specify the file on the LoadState command line for the settings to migrate. This is because the LoadState tool must detect an equivalent component. That is, the component must have the same migration urlid of the .xml file and an identical display name. Otherwise, the LoadState tool will not migrate those settings from the store. This is helpful when the source computer is running Windows XP, and you are migrating to both Windows Vista® and Windows XP because you can use the same store for both destination computers.

  • Application: Settings for an application.

  • Device: Settings for a device.

  • Documents: Specifies files.

context

No

Default = UserAndSystem

Defines the scope of this parameter; that is, whether to process this component in the context of the specific user, across the entire operating system, or both.

The largest possible scope is set by the <component> element. For example, if a <component> element has a context of User and a <rules> element had a context of UserAndSystem, then the <rules> element would act as though it has a context of User. If a <rules> element has a context of System, it would act as though the <rules> element is not there.

  • User. Evaluates the component for each user.

  • System. Evaluates the component only once for the system.

  • UserAndSystem. Evaluates the component for the entire operating system and each user.

defaultSupported

No

(default = TRUE)

Can be any of TRUE, FALSE, YES or NO. If this parameter is FALSE (or NO), the component will not be migrated unless there is an equivalent component on the destination computer.

When type="System" and defaultSupported="FALSE" the settings will not migrate unless there is an equivalent component in the .xml files that are specified on the LoadState command line. For example, the default MigSys.xml file contains components with type="System" and defaultSupported="FALSE". If you specify this file on the ScanState command line, you must also specify the file on the LoadState command line for the settings to migrate. This is because the LoadState tool must detect an equivalent component. That is, the component must have the same migration urlid of the .xml file and an identical display name or the LoadState tool will not migrate those settings from the store. This is helpful when the source computer is running Windows XP, and you are migrating to both Windows Vista and Windows XP because you can use the same store for both destination computers.

hidden

 

This parameter is for internal USMT use only.

For an example, see any of the default migration .xml files.

<condition>

Although the <condition> element under the <detect>, <objectSet>, and <addObjects> elements is supported, we recommend that you do not use it. This element might be deprecated in future versions of USMT, requiring you to rewrite your scripts. We recommend that, if you need to use a condition within the <objectSet> and <addObjects> elements, you use the more powerful <conditions> element, which allows you to formulate complex Boolean statements.

The <condition> element has a Boolean result. You can use this element to specify the conditions in which the parent element will be evaluated. If any of the present conditions return FALSE, the parent element will not be evaluated.

  • Number of occurrences: unlimited.

  • Parent elements: <conditions>, <detect>, <objectSet>, <addObjects>

  • Child elements: none

  • Helper functions: You can use the following <condition> functions with this element: DoesOSMatch, IsNative64Bit(), IsOSLaterThan, IsOSEarlierThan, DoesObjectExist, DoesFileVersionMatch, IsFileVersionAbove, IsFileVersionBelow, IsSystemContext, DoesStringContentEqual, DoesStringContentContain, IsSameObject, IsSameContent, and IsSameStringContent.

Syntax:

<condition negation="Yes|No">ScriptName</condition>

Setting Required? Value

negation

No

Default = No

"Yes" reverses the True/False value of the condition.

ScriptName

Yes

A script that has been defined within this migration section.

For example,

In the code sample below, the <condition> elements, A and B, are joined together by the AND operator because they are in separate <conditions> sections. For example:

<detection>
   <conditions>
	<condition>A</condition>
   </conditions>
   <conditions operation="AND">
	<condition>B</condition>
   </conditions>
</detection>

However, in the code sample below, the <condition> elements, A and B, are joined together by the OR operator because they are in the same <conditions> section.

<detection>
   <conditions>
	<condition>A</condition>
	<condition>B</condition>
   </conditions>
</detection>

<condition> functions

The <condition> functions return a Boolean value. You can use these elements in <addObjects> conditions.

Operating system version functions

  • DoesOSMatch

    All matches are case insensitive.

    Syntax: DoesOSMatch("OSType","OSVersion")

    Setting Required? Value

    OSType

    Yes

    The only valid value for this setting is NT. Note, however, that you must set this setting for the <condition> functions to work correctly.

    OSVersion

    Yes

    The major version, minor version, build number and corrected service diskette version separated by periods. For example, 5.0.2600.Service Pack 1. You can also specify partial specification of the version with a pattern. For example, 5.0.*.

    For example:

    <condition>MigXmlHelper.DoesOSMatch("NT","*")</condition>

  • IsNative64Bit

    The IsNative64Bit function returns TRUE if the migration process is running as a native 64-bit process; that is, a process running on a 64-bit system without Windows on Windows (WOW). Otherwise, it returns FALSE.

  • IsOSLaterThan

    All comparisons are case insensitive.

    Syntax: IsOSLaterThan("OSType","OSVersion")

    Setting Required? Value

    OSType

    Yes

    Can be 9x or NT. If OSType does not match the type of the current operating system, then it returns FALSE. For example, if the current operating system is Windows NT-based and OSType is “9x”, the result will be FALSE.

    OSVersion

    Yes

    The major version, minor version, build number, and corrected service diskette version separated by periods. For example, 5.0.2600.Service Pack 1. You can also specify partial specification of the version but no pattern is allowed. For example, 5.0.

    The IsOSLaterThan function returns TRUE if the current operating system is later than or equal to OSVersion.

    For example:

    <condition negation="Yes">MigXmlHelper.IsOSLaterThan("NT","6.0")</condition>

  • IsOSEarlierThan

    All comparisons are case insensitive.

    Syntax: IsOSEarlierThan("OSType","OSVersion")

    Setting Required? Value

    OSType

    Yes

    Can be 9x or NT. If OSType does not match the type of the current operating system, then it returns FALSE. For example, if the current operating system is Windows NT-based and OSType is “9x” the result will be FALSE.

    OSVersion

    Yes

    The major version, minor version, build number, and corrected service diskette version separated by periods. For example, 5.0.2600.Service Pack 1. You can also specify partial specification of the version but no pattern is allowed. For example, 5.0.

    The IsOSEarlierThan function returns TRUE if the current operating system is earlier than OSVersion.

Object content functions

  • DoesObjectExist

    The DoesObjectExist function returns TRUE if any object exists that matches the location pattern. Otherwise, it returns FALSE. The location pattern is expanded before attempting the enumeration.

    Syntax: DoesObjectExist("ObjectType","EncodedLocationPattern")

    Setting Required? Value

    ObjectType

    Yes

    Defines the object type. Can be File or Registry.

    EncodedLocationPattern

    Yes

    The location pattern. Environment variables are allowed.

    For an example of this element, see the MigApp.xml file.

  • DoesFileVersionMatch

    The pattern check is case insensitive.

    Syntax: DoesFileVersionMatch("EncodedFileLocation","VersionTag","VersionValue")

    Setting Required? Value

    EncodedFileLocation

    Yes

    The location pattern for the file that will be checked. Environment variables are allowed.

    VersionTag

    Yes

    The version tag value that will be checked.

    VersionValue

    Yes

    A string pattern. For example, "Microsoft*".

    For example:

    <condition>MigXmlHelper.DoesFileVersionMatch("%MSNMessengerInstPath%\msnmsgr.exe","ProductVersion","6.*")</condition>

    <condition>MigXmlHelper.DoesFileVersionMatch("%MSNMessengerInstPath%\msnmsgr.exe","ProductVersion","7.*")</condition>

  • IsFileVersionAbove

    The IsFileVersionAbove function returns TRUE if the version of the file is higher than VersionValue.

    Syntax: IsFileVersionAbove("EncodedFileLocation","VersionTag","VersionValue")

    Setting Required? Value

    EncodedFileLocation

    Yes

    The location pattern for the file that will be checked. Environment variables are allowed.

    VersionTag

    Yes

    The version tag value that will be checked.

    VersionValue

    Yes

    The value to compare to. You cannot specify a pattern.

  • IsFileVersionBelow

    Syntax: IsFileVersionBelow("EncodedFileLocation","VersionTag","VersionValue")

    Setting Required? Value

    EncodedFileLocation

    Yes

    The location pattern for the file that will be checked. Environment variables are allowed.

    VersionTag

    Yes

    The version tag value that will be checked.

    VersionValue

    Yes

    The value to compare to. You cannot specify a pattern.

  • IsSystemContext

    The IsSystemContext function returns TRUE if the current context is "System". Otherwise, it returns FALSE.

    Syntax: IsSystemContext()

  • DoesStringContentEqual

    The DoesStringContentEqual function returns TRUE if the string representation of the given object is identical to StringContent.

    Syntax: DoesStringContentEqual("ObjectType","EncodedLocation","StringContent")

    Setting Required? Value

    ObjectType

    Yes

    Defines the type of object. Can be File or Registry.

    EncodedLocationPattern

    Yes

    The encoded location for the object that will be examined. You can specify environment variables.

    StringContent

    Yes

    The string that will be checked against.

    For example:

    <condition negation="Yes">MigXmlHelper.DoesStringContentEqual("File","%USERNAME%","")</condition>
    
  • DoesStringContentContain

    The DoesStringContentContain function returns TRUE if there is at least one occurrence of StrToFind in the string representation of the object.

    Syntax: DoesStringContentContain("ObjectType","EncodedLocation","StrToFind")

    Setting Required? Value

    ObjectType

    Yes

    Defines the type of object. Can be File or Registry.

    EncodedLocationPattern

    Yes

    The encoded location for the object that will be examined. You can specify environment variables.

    StrToFind

    Yes

    A string that will be searched inside the content of the given object.

  • IsSameObject

    The IsSameObject function returns TRUE if the given encoded locations resolve to the same physical object. Otherwise, it returns FALSE.

    Syntax: IsSameObject("ObjectType","EncodedLocation1","EncodedLocation2")

    Setting Required? Value

    ObjectType

    Yes

    Defines the type of object. Can be File or Registry.

    EncodedLocation1

    Yes

    The encoded location for the first object. You can specify environment variables.

    EncodedLocation2

    Yes

    The encoded location for the second object. You can specify environment variables.

    For example:

    <objectSet>
    	 <condition negation="Yes">MigXmlHelper.IsSameObject("File","%CSIDL_FAVORITES%","%CSIDL_COMMON_FAVORITES%")</condition>
    	 <pattern type="File">%CSIDL_FAVORITES%\* [*]</pattern>
    </objectSet>
    
  • IsSameContent

    The IsSameContent function returns TRUE if the given objects have the same content. Otherwise, it returns FALSE. The content will be compared byte by byte.

    Syntax: IsSameContent("ObjectType1","EncodedLocation1","ObjectType2","EncodedLocation2")

    Setting Required? Value

    ObjectType1

    Yes

    Defines the type of the first object. Can be File or Registry.

    EncodedLocation1

    Yes

    The encoded location for the first object. You can specify environment variables.

    ObjectType2

    Yes

    Defines the type of the second object. Can be File or Registry.

    EncodedLocation2

    Yes

    The encoded location for the second object. You can specify environment variables.

  • IsSameStringContent

    The IsSameStringContent function returns TRUE if the given objects have the same content. Otherwise, it returns FALSE. The content will be interpreted as a string.

    Syntax: IsSameStringContent("ObjectType1","EncodedLocation1","ObjectType2","EncodedLocation2")

    Setting Required? Value

    ObjectType1

    Yes

    Defines the type of the first object. Can be File or Registry.

    EncodedLocation1

    Yes

    The encoded location for the first object. You can specify environment variables.

    ObjectType2

    Yes

    Defines the type of the second object. Can be File or Registry.

    EncodedLocation2

    Yes

    The encoded location for the second object. You can specify environment variables.

<conditions>

The <conditions> element returns a Boolean result that is used to specify the conditions in which the parent element is evaluated. USMT evaluates the child elements, and then joins their results using the operators AND or OR according to the operation parameter.

Syntax:

<conditions operation="AND|OR">

</conditions>

Setting Required? Value

operation

No, default = AND

Defines the Boolean operation that is performed on the results that are obtained from the child elements.

The following example is from the MigApp.xml file:

<environment name="GlobalEnv">
   <conditions>
	<condition negation="Yes">MigXmlHelper.IsNative64Bit()</condition>
   </conditions>
   <variable name="HklmWowSoftware">
   <text>HKLM\Software</text>
   </variable>
</environment>

<content>

You can use the <content> element to specify a list of object patterns to obtain an object set from the source computer. Each <objectSet> within a <content> element is evaluated. For each resulting object pattern list, the objects that match it are enumerated and their content is filtered by the filter parameter. The resulting string array is the output for the <content> element. The filter script returns an array of locations. The parent <objectSet> element can contain multiple child <content> elements.

  • Number of occurrences: unlimited

  • Parent elements: <objectSet>

  • Child elements: <objectSet>

  • Helper functions: You can use the following <content> functions with this element: ExtractSingleFile, ExtractMultipleFiles, and ExtractDirectory.

Syntax:

<content filter="ScriptInvocation">

</content>

Setting Required? Value

filter

Yes

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script is called for each object that is enumerated by the object sets in the <include> rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

The following example is from the MigApp.xml file:

<include>
   <objectSet>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [01020fff]</pattern>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e0324]</pattern>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6600]</pattern>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6700]</pattern>
	<content filter="MigSysHelper.ExtractSingleFileAnsiBin()">
		 <objectSet>
			<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e0324]</pattern>
			<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6600]</pattern>
			<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6700]</pattern>
		 </objectSet>
	</content>
   </objectSet>
</include>

<content> functions

The following functions generate patterns out of the content of an object. These functions are called for every object that the parent <ObjectSet> element is enumerating.

  • ExtractSingleFile

    If the registry value is a MULTI-SZ, only the first segment is processed. The returned pattern is the encoded location for a file that must exist on the system. If the specification is correct in the registry value, but the file does not exist, this function returns NULL.

    Syntax: ExtractSingleFile(Separators,PathHints)

    Setting Required? Value

    Separators

    Yes

    A list of possible separators that might follow the file specification in this registry value name. For example, if the content is "C:\Windows\Notepad.exe,-2", the separator is a comma. You can specify NULL.

    PathHints

    Yes

    A list of extra paths, separated by colons (;), where the function will look for a file matching the current content. For example, if the content is "Notepad.exe" and the path is the %Path% environment variable, the function will find Notepad.exe in %windir% and returns “c:\Windows [Notepad.exe]”. You can specify NULL.

    For example:

    <content filter="MigXmlHelper.ExtractSingleFile(',','%system%')">
    
    and

    <content filter="MigXmlHelper.ExtractSingleFile(NULL,'%CSIDL_COMMON_FONTS%')">
    
  • ExtractMultipleFiles

    The ExtractMultipleFiles function returns multiple patterns, one for each file that is found in the content of the given registry value. If the registry value is a MULTI-SZ, the MULTI-SZ separator is considered a separator by default. therefore, for MULTI-SZ, the <Separators> argument must be NULL.

    The returned patterns are the encoded locations for files that must exist on the source computer. If the specification is correct in the registry value but the file does not exist, it will not be included in the resulting list.

    Syntax: ExtractMultipleFiles(Separators,PathHints)



    Setting Required? Value

    Separators

    Yes

    A list of possible separators that might follow the file specification in this registry value name. For example, if the content is "C:\Windows\Notepad.exe,-2", the separator is a comma. This parameter must be NULL when processing MULTI-SZ registry values.

    PathHints

    Yes

    A list of extra paths, separated by colons (;), where the function will look for a file matching the current content. For example, if the content is "Notepad.exe" and the path is the %Path% environment variable, the function will find Notepad.exe in %windir% and returns “c:\Windows [Notepad.exe]”. You can specify NULL.

  • ExtractDirectory

    The ExtractDirectory function returns a pattern that is the encoded location for a directory that must exist on the source computer. If the specification is correct in the registry value, but the directory does not exist, this function returns NULL. If it is processing a registry value that is a MULTI-SZ, only the first segment will be processed.

    Syntax: ExtractDirectory(Separators,LevelsToTrim,PatternSuffix)

    Setting Required? Value

    Separators

    No

    A list of possible separators that might follow the file specification in this registry value name. For example, if the content is "C:\Windows\Notepad.exe,-2", the separator is a comma. You must specify NULL when processing MULTI-SZ registry values.

    LevelsToTrim

    Yes

    The number of levels to delete from the end of the directory specification. Use this function to extract a root directory when you have a registry value that points inside that root directory in a known location.

    PatternSuffix

    Yes

    The pattern to add to the directory specification. For example, * [*].

    For example:

    <objectSet>
    	 <content filter='MigXmlHelper.ExtractDirectory (NULL, "1")'>
    		<objectSet>
    			 <pattern type="Registry">%HklmWowSoftware%\Classes\Software\RealNetworks\Preferences\DT_Common []</pattern>
    		</objectSet>
    	 </content>
    </objectSet>
    

<contentModify>

The <contentModify> element modifies the content of an object before it is written to the destination computer. For each <contentModify> element there can be multiple <objectSet> elements. This element returns the new content of the object that is being processed.

  • Number of occurrences: Unlimited

  • Parent elements: <rules>

  • Required child elements: <objectSet>

  • Helper functions: You can use the following <contentModify> functions with this element: ConvertToDWORD, ConvertToString, ConvertToBinary, KeepExisting, OffsetValue, SetValueByTable, MergeMultiSzContent, and MergeDelimitedContent.

Syntax:

<contentModify script="ScriptInvocation">

</contentModify>

Setting Required? Value

script

Yes

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script will be called for each object that is enumerated by the object sets in the include rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

The following example is from the MigApp.xml file.

<contentModify script='MigSysHelper.SetPstPathInMapiStruct ()'>
   <objectSet>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [0102*]</pattern>
   </objectSet>
</contentModify>

<contentModify> functions

The following functions change the content of objects as they are migrated. These functions are called for every object that the parent <ObjectSet> element is enumerating.

  • ConvertToDWORD

    The ConvertToDWORD function converts the content of registry values that are enumerated by the parent <ObjectSet> element to a DWORD. For example, ConvertToDWORD will convert the string "1" to the DWORD 0x00000001. If the conversion fails, then the value of DefaultValueOnError will be applied.

    Syntax: ConvertToDWORD(DefaultValueOnError)

    Setting Required? Value

    DefaultValueOnError

    No

    The value that will be written into the value name if the conversion fails. You can specify NULL, and 0 will be written if the conversion fails.

  • ConvertToString

    The ConvertToString function converts the content of registry values that match the parent <ObjectSet> element to a string. For example, it will convert the DWORD 0x00000001 to the string "1". If the conversion fails, then the value of DefaultValueOnError will be applied.

    Syntax: ConvertToString(DefaultValueOnError)

    Setting Required? Value

    DefaultValueOnError

    No

    The value that will be written into the value name if the conversion fails. You can specify NULL, and 0 will be written if the conversion fails.

    For example:

    <contentModify script="MigXmlHelper.ConvertToString('1')">
    	 <objectSet>
    		<pattern type="Registry">HKCU\Control Panel\Desktop [ScreenSaveUsePassword]</pattern>
    	 </objectSet>
    </contentModify>
    
  • ConvertToBinary

    The ConvertToBinary function converts the content of registry values that match the parent <ObjectSet> element to a binary type.

    Syntax: ConvertToBinary ()

  • OffsetValue

    The OffsetValue function adds or subtracts Value from the value of the migrated object, and then writes the result back into the registry value on the destination computer. For example, if the migrated object is a DWORD with a value of 14, and the Value is "-2", the registry value will be 12 on the destination computer.

    Syntax: OffsetValue(Value)

    Setting Required? Value

    Value

    Yes

    The string representation of a numeric value. It can be positive or negative. For example, OffsetValue(2).

  • SetValueByTable

    The SetValueByTable function matches the value from the source computer to the source table. If the value is there, the equivalent value in the destination table will be applied. If the value is not there, or if the destination table has no equivalent value, the DefaultValueOnError will be applied.

    Syntax: SetValueByTable(SourceTable,DestinationTable,DefaultValueOnError)

    Setting Required? Value

    SourceTable

    Yes

    A list of values separated by commas that are possible for the source registry values.

    DestinationTable

    No

    A list of translated values separated by commas.

    DefaultValueOnError

    No

    The value that will be applied to the destination computer if either 1) the value for the source computer does not match SourceTable, or 2) DestinationTable has no equivalent value.

    If DefaultValueOnError is NULL, the value will not be changed on the destination computer.

  • KeepExisting

    You can use the KeepExisting function when there are conflicts on the destination computer. This function will keep (not overwrite) the specified attributes for the object that is on the destination computer.

    Syntax: KeepExisting("OptionString","OptionString","OptionString",…)

    Setting Required? Value

    OptionString

    Yes

    OptionString can be Security, TimeFields, or FileAttrib:Letter. You can specify one of each type of OptionStrings. Do not specify multiple OptionStrings with the same value. If you do, the right-most option of that type will be kept. For example, do not specify ("FileAttrib:H", "FileAttrib:R") because only Read-only will be evaluated. Instead specify ("FileAttrib:HR") and both Hidden and Read-only attributes will be kept on the destination computer.

    • Security. Keeps the destination object's security descriptor if it exists.

    • TimeFields. Keeps the destination object's time stamps. This parameter is for files only.

    • FileAttrib: Letter. Keeps the destination object's attribute value, either On or OFF, for the specified set of file attributes. This parameter is for files only. The following are case-insensitive, but USMT will ignore any values that are invalid, repeated, or if there is a space after "FileAttrib:". You can specify any combination of the following attributes:

      • A = Archive

      • C = Compressed

      • E = Encrypted

      • H = Hidden

      • I = Not Content Indexed

      • O = Offline

      • R = Read-Only

      • S = System

      • T = Temporary

  • MergeMultiSzContent

    The MergeMultiSzContent function merges the MULTI-SZ content of the registry values that are enumerated by the parent <ObjectSet> element with the content of the equivalent registry values that already exist on the destination computer. Instruction and String either remove or add content to the resulting MULTI-SZ. Duplicate elements will be removed.

    Syntax: MergeMultiSzContent (Instruction,String,Instruction,String,…)

    Setting Required? Value

    Instruction

    Yes

    Can be one of the following:

    • Add. Adds the corresponding String to the resulting MULTI-SZ if it is not already there.

    • Remove. Removes the corresponding String from the resulting MULTI-SZ.

    String

    Yes

    The string to be added or removed.

  • MergeDelimitedContent

    The MergeDelimitedContent function merges the content of the registry values that are enumerated by the parent <ObjectSet> element with the content of the equivalent registry values that already exist on the destination computer. The content is considered a list of elements separated by one of the characters in the Delimiters parameter. Duplicate elements will be removed.

    Syntax: MergeDelimitedContent(Delimiters,Instruction,String,…)

    Setting Required? Value

    Delimiters

    Yes

    A single character that will be used to separate the content of the object that is being processed. The content will be considered as a list of elements that is separated by the Delimiters.

    For example, "." will separate the string based on a period.

    Instruction

    Yes

    Can one of the following:

    • Add. Adds String to the resulting MULTI-SZ if it is not already there.

    • Remove. Removes String from the resulting MULTI-SZ.

    String

    Yes

    The string to be added or removed.

  • SetPstPathInMapiStruct

    This is an internal USMT function. Do not use this function.

  • ConvertToOfficeLangID

    This is an internal USMT function. Do not use this function.

<description>

The <description> element defines a description for the component but does not affect the migration.

  • Number of occurrences: zero or one

  • Parent elements: <component>

  • Child elements: none

Syntax:

<description>ComponentDescription</description>

Setting Required? Value

ComponentDescription

Yes

The description of the component.

The following code sample shows how the <description> element defines the "My custom component" description.:

<description>My custom component<description>

<destinationCleanup>

The <destinationCleanup> element deletes objects, such as files and registry keys, from the destination computer before applying the objects from the source computer. This element is evaluated only when the LoadState tool is run on the destination computer. That is, this element is ignored by the ScanState tool.

Important

Use this option with extreme caution because it will delete objects from the destination computer.

For each <destinationCleanup> element there can be multiple <objectSet> elements. A common use for this element is if there is a missing registry key on the source computer and you want to ensure that a component is migrated. In this case, you can delete all of the component's registry keys before migrating the source registry keys. This will ensure that if there is a missing key on the source computer, it will also be missing on the destination computer.

  • Number of occurrences: Unlimited

  • Parent elements: <rules>

  • Child elements: <objectSet> (Note that the destination computer will delete all child elements.)

Syntax:

<destinationCleanup filter=ScriptInvocation>

</destinationCleanup>

Setting Required? Value

filter

Yes

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script will be called for each object that is enumerated by the object sets in the include rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

For example:

<destinationCleanup>
   <objectSet>
	<pattern type="Registry">HKCU\Software\Lotus\123\99.0\DDE Preferences\* [*]</pattern>
	<pattern type="Registry">HKCU\Software\Lotus\123\99.0\Find Preferences\* [*]</pattern>
   </objectSet>
</destinationCleanup>

<detect>

Although the <detect> element is still supported, we do not recommend using it because it may be deprecated in future versions of USMT. In that case, you would have to rewrite your scripts. Instead, we recommend that you use the <detection> element.

You use the <detect> element to determine if the component is present on a system. If all child <detect> elements within a <detect> element resolve to TRUE, then the <detect> element resolves to TRUE. If any child <detect> elements resolve to FALSE, then their parent <detect> element resolves to FALSE. If there is no <detect> element section, then USMT will assume that the component is present.

For each <detect> element there can be multiple child <condition> or <objectSet> elements, which will be logically joined by an OR operator. If at least one <condition> or <objectSet> element evaluates to TRUE, then the <detect> element evaluates to TRUE.

Syntax:

<detect name="ID" context="User|System|UserAndSystem">

</detect>

Setting Required? Value

name

Yes, when <detect> is a child to <namedElements>

No, when <detect> is a child to <detects>

When ID is specified, any child elements are not processed. Instead, any other <detect> elements with the same name that are declared within the <namedElements> element are processed.

context

No

(default = UserAndSystem)

Defines the scope of this parameter: whether to process this component in the context of the specific user, across the entire operating system, or both.

The largest possible scope is set by the component element. For example, if a <component> element has a context of User, and a <rules> element had a context of UserAndSystem, then the <rules> element would act as though it had a context of User. If the <rules> element had a context of System, it would act as though the <rules> element were not there.

  • User. Evaluates the variables for each user.

  • System. Evaluates the variables only once for the system.

  • UserAndSystem. Evaluates the variables for the entire operating system and each user.

For examples, see the examples for <detection>.

<detects>

Although the <detects> element is still supported, we recommend that you do not use it because it may be deprecated in future versions of USMT, which would require you to rewrite your scripts. Instead, we recommend that you use the <detection> element if the parent element is <role> or <namedElements>, and we recommend that you use the <conditions> element if the parent element is <rules>. Using <detection> allows you to more clearly formulate complex Boolean statements.

The <detects> element is a container for one or more <detect> elements. If all of the child <detect> elements within a <detects> element resolve to TRUE, then <detects> resolves to TRUE. If any of the child <detect> elements resolve to FALSE, then <detects> resolves to FALSE. If you do not want to write the <detects> elements within a component, then you can create the <detects> element under the <namedElements> element, and then refer to it. If there is no <detects> element section, then USMT will assume that the component is present. The results from each <detects> element are joined together by the OR operator to form the rule used to detect the parent element.

Syntax:

<detects name="ID" context="User|System|UserAndSystem">

</detects>

Setting Required? Value

name

Yes, when <detects> is a child to <namedElements>

No, when <detects> is a child to <role> or <rules>

When ID is specified, no child <detect> elements are processed. Instead, any other <detects> elements with the same name that are declared within the <namedElements> element are processed.

context

No

(default = UserAndSystem)

Defines the scope of this parameter: whether to process this component in the context of the specific user, across the entire operating system, or both.

The largest possible scope is set by the <component element>. For example, if a <component> element has a context of User and a <rules> element had a context of UserAndSystem, then the <rules> element would act as though it had a context of User. If the <rules> element had a context of System, it would act as though the <rules> element were not there.

  • User. Evaluates the variables for each user.

  • System. Evaluates the variables only once for the system.

  • UserAndSystem. Evaluates the variables for the entire operating system and each user.

The context parameter is ignored for <detects> elements that are inside <rules> elements.

The following example is from the MigApp.xml file.

<detects>
   <detect>
	<condition>MigXmlHelper.DoesFileVersionMatch("%Lotus123InstPath%\123w.exe","ProductVersion","9.*")</condition>
   </detect>
   <detect>
	<condition>MigXmlHelper.DoesFileVersionMatch("%SmartSuiteInstPath%\smartctr.exe","ProductVersion","99.*")</condition>
   </detect>
</detects>

<detection>

The <detection> element is a container for one <conditions> element. The result of the child <condition> elements, located underneath the <conditions> element, determines the result of this element. For example, if all of the child <conditions> elements within the <detection> element resolve to TRUE, then the <detection> element resolves to TRUE. If any of the child <conditions> elements resolve to FALSE, then the <detection> element resolves to FALSE.

In addition, the results from each <detection> section within the <role> element are joined together by the OR operator to form the detection rule of the parent element. That is, if one of the <detection> sections resolves to TRUE, then the <role> element will be processed. Otherwise, the <role> element will not be processed.

Use the <detection> element under the <namedElements> element if you do not want to write it within a component. Then include a matching <detection> section under the <role> element to control whether the component is migrated. If there is not a <detection> section for a component, then USMT will assume that the component is present.

Syntax:

<detection name="ID" context="User|System|UserAndSystem">

</detection>

Setting Required? Value

name

  • Yes, when <detection> is declared under <namedElements>

  • Optional, when declared under <role>

If declared, the content of the <detection> element is ignored and the content of the <detection> element with the same name that is declared in the <namedElements> element will be evaluated.

context

No, default = UserAndSystem

Defines the scope of this parameter: whether to process this component in the context of the specific user, across the entire operating system, or both.

  • User. Evaluates the component for each user.

  • System. Evaluates the component only once for the system.

  • UserAndSystem. Evaluates the component for the entire operating system and each user.

For example:

<detection name="AdobePhotoshopCS">
   <conditions>
	<condition>MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Adobe\Photoshop\8.0")</condition>
	<condition>MigXmlHelper.DoesFileVersionMatch("%PhotoshopSuite8Path%\Photoshop.exe","FileVersion","8.*")</condition>
   </conditions>
</detection>

and

<role role="Settings">
   <detection>
	<conditions>
		 <condition>MigXmlHelper.DoesFileVersionMatch("%QuickTime5Exe%","ProductVersion","QuickTime 5.*")</condition>
		 <condition>MigXmlHelper.DoesFileVersionMatch("%QuickTime5Exe%","ProductVersion","QuickTime 6.*")</condition>
	</conditions>
   </detection>

<displayName>

The <displayName> element is a required field within each <component> element.

  • Number of occurrences: once for each component

  • Parent elements: <component>

  • Child elements: none

Syntax:

<displayName _locID="ID">ComponentName</displayName>

Setting Required? Value

locID

No

This parameter is for internal USMT use. Do not use this parameter.

ComponentName

Yes

The name for the component.

For example:

<displayName>Command Prompt settings</displayName>

<environment>

The <environment> element is a container for <variable> elements in which you can define variables to use in your .xml file. All environment variables defined this way will be private. That is, they will be available only for their child components and the component in which they were defined. For two example scenarios, see Examples.

Syntax:

<environment name="ID" context="User|System|UserAndSystem">

</environment>

Setting Required? Value

name

Yes, when <environment> is a child of <namedElements>

No, when <environment> is a child of <role> or <component>

When declared as a child of the <role> or <component> elements, if ID is declared, USMT ignores the content of the <environment> element and the content of the <environment> element with the same name declared in the <namedElements> element is processed.

context

No

(default = UserAndSystem)

Defines the scope of this parameter: whether to process this component in the context of the specific user, across the entire operating system, or both.

The largest possible scope is set by the <component> element. For example, if a <component> element has a context of User and a <rules> element had a context of UserAndSystem, then the <rules> element would act as though it had a context of User. If the <rules> element had a context of System, it would act as though <rules> were not there.

  • User. Evaluates the variables for each user.

  • System. Evaluates the variables only once for the system.

  • UserAndSystem. Evaluates the variables for the entire operating system and each user.

Example scenario 1

In this scenario, you want to generate the location of objects at run time depending on the configuration of the destination computer. For example, you must do this if an application writes data in the directory where it is installed, and users can install the application anywhere on the computer. If the application writes a registry value hklm\software\companyname\install [path] and then updates this value with the location where the application is installed, then the only way for you to migrate the required data correctly is to define an environment variable. For example:

<environment>
   <variable name="INSTALLPATH">
	<script>MigXmlHelper.GetStringContent("Registry","\software\companyname\install [path]")</script>
   </variable>
</environment>

Then you can use an include rule as follows. You can use any of the <script> functions to perform similar tasks.

<include>
   <objectSet>
	<pattern type="File">%INSTALLPATH%\ [*.xyz]</pattern>
   </objectSet>
</include>

Second, you can also filter registry values that contain data that you need. The following example extracts the first string (before the separator ",") in the value of the registry Hklm\software\companyname\application\ [Path].

<environment>
   <variable name="APPPATH">
		<objectSet>
		 <content filter='MigXmlHelper.ExtractDirectory (",", "1")'>
			 <objectSet>
				<pattern type="Registry">Hklm\software\companyname\application\ [Path]</pattern>
			</objectSet>
			</content>
		</objectSet>
	</variable>
</environment>

Example scenario 2:

In this scenario, you want to migrate five files named File1.txt, File2.txt, and so on, from %SYSTEMDRIVE%\data\userdata\dir1\dir2\. To do this you must have the following <include> rule in an .xml file:

<include>
   <objectSet>
	<pattern type="File">%SYSTEMDRIVE%\data\userdata\dir1\dir2 [File1.txt]</pattern>
	<pattern type="File">%SYSTEMDRIVE%\data\userdata\dir1\dir2 [File2.txt]</pattern>
	<pattern type="File">%SYSTEMDRIVE%\data\userdata\dir1\dir2 [File3.txt]</pattern>
	<pattern type="File">%SYSTEMDRIVE%\data\userdata\dir1\dir2 [File4.txt]</pattern>
	<pattern type="File">%SYSTEMDRIVE%\data\userdata\dir1\dir2 [File5.txt]</pattern>
   </objectSet>
</include>

Instead of typing the path five times, you can create a variable for the location as follows:

<environment>
   <variable name="DATAPATH">
	<text>%SYSTEMDRIVE%\data\userdata\dir1\dir2 </text>
	</variable>
</environment>

Then, you can specify the variable in an <include> rule as follows:

<include>
   <objectSet>
	<pattern type="File">%DATAPATH% [File1.txt]</pattern>
	<pattern type="File">%DATAPATH% [File2.txt]</pattern>
	<pattern type="File">%DATAPATH% [File3.txt]</pattern>
	<pattern type="File">%DATAPATH% [File4.txt]</pattern>
	<pattern type="File">%DATAPATH% [File5.txt]</pattern>
   </objectSet>
</include>

<exclude>

The <exclude> element determines what objects will not be migrated, unless there is a more specific <include> element that migrates an object. If there is an <include> and <exclude> element for the same object, the object will be included. For each <exclude> element there can be multiple child <objectSet> elements.

  • Number of occurrences: Unlimited

  • Parent elements: <rules>

  • Child elements: <objectSet>

  • Helper functions: You can use the following <exclude> filter functions with this element: CompareStringContent, IgnoreIrrelevantLinks, AnswerNo, NeverRestore, and SameRegContent.

Syntax:

<exclude filter="ScriptInvocation">

</exclude>

Setting Required? Value

filter

No

(default = No)

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script will be called for each object that is enumerated by the object sets in the include rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

For example, from the MigUser.xml file:

<exclude>
   <objectSet>
	<pattern type="File">%CSIDL_MYMUSIC%\* [*]</pattern>
	<pattern type="File">%CSIDL_MYPICTURES%\* [*]</pattern>
	<pattern type="File">%CSIDL_MYVIDEO%\* [*]</pattern>
   </objectSet>
</exclude>

<excludeAttributes>

You can use the <excludeAttributes> element to determine which parameters associated with an object will not be migrated. If there are conflicts between the <includeAttributes> and <excludeAttributes> elements, the most specific pattern determines the patterns that will not be migrated. If an object does not have an <includeAttributes> or <excludeAttributes> element, then all of its parameters will be migrated.

Syntax:

<excludeAttributes attributes="Security|TimeFields|Security,TimeFields">

</excludeAttributes>

Parameter Required? Value

attributes

Yes

Specifies the attributes to be excluded. You can specify one of the following, or both separated by quotes; for example, "Security","TimeFields":

  • Security can be one of Owner, Group, DACL, or SACL.

  • TimeFields can be one of CreationTime, LastAccessTime and LastWrittenTime

Example:

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/miguser">
<!-- This component migrates My Video files -->
   <component type="System" context="System">
	<displayName>System Data</displayName>
		 <role role="Data">
			<rules>
<!-- Include all of the text files, which are immediately in the drive where the operating system is installed -->
			 <include>
				<objectSet>
					 <pattern type="File">%SYSTEMDRIVE%\ [*.txt]</pattern>
				</objectSet>
			 </include>
<!-- Exclude the time stamps from the text file starting with the letter a -->
			 <excludeAttributes attributes="TimeFields">
				<objectSet>
					 <pattern type="File">%SYSTEMDRIVE%\ [a*.txt]</pattern>
				</objectSet>
			 </excludeAttributes>
<!-- include the time stamps from the text file aa.txt -->
			 <includeAttributes attributes="TimeFields">
				<objectSet>
					 <pattern type="File">%SYSTEMDRIVE%\ [aa.txt]</pattern>
				</objectSet>
			 </includeAttributes>
<!-- Logoff the user after loadstate successfully completed. -->
			 <externalProcess when="post-apply">
				<commandLine>
					 logoff
				</commandLine>
			 </externalProcess>
		 </rules>
   </role>
<!-- Migrate 
   all doc files from the system
   all power point files
   all visio design files 
   all my c++ program files -->
   <extensions>
	<extension>DOC</extension>
	<extension>PPT</extension>
	<extension>VXD</extension>
	<extension>PST</extension>
	<extension>CPP</extension>
   </extensions>
</component>
</migration>

<extensions>

The <extensions> element is a container for one or more <extension> elements.

Syntax:

<extensions>

</extensions>

<extension>

You can use the <extension> element to specify documents of a specific extension.

  • Number of occurrences: unlimited

  • Parent elements: <extensions>

  • Child elements: none

Syntax:

<extension>FilenameExtension</extension>

Setting Required? Value

FilenameExtension

Yes

A file name extension.

For example, if you want to migrate all *.doc files from the source computer, specifying the following code under the <component> element:

<extensions> 
		<extension>doc</extension> 
<extensions> 

is the same as specifying the following code below the <rules> element:

<include> 
		<objectSet> 
				<script>MigXmlHelper.GenerateDrivePatterns ("* [*.doc]", "Fixed")</script> 
		</objectSet> 
</include>

For another example of how to use the <extension> element, see the example for <excludeAttributes>.

<externalProcess>

You can use the <externalProcess> element to run a command line during the migration process. For example, you may want to run a command after the LoadState process completes.

Syntax:

<externalProcess when="pre-scan|scan-success|post-scan|pre-apply|apply-success|post-apply">

</externalProcess>

Setting Required? Value

when

Yes

Indicates when the command line should be run. This value can be one of the following:

  • pre-scan before the scanning process begins.

  • scan-success after the scanning process has finished successfully.

  • post-scan after the scanning process has finished, whether it was successful or not.

  • pre-apply before the apply process begins.

  • apply-success after the apply process has finished successfully.

  • post-apply after the apply process has finished, whether it was successful or not.

For an example of how to use the <externalProcess> element, see the example for <excludeAttributes>.

<icon>

This is an internal USMT element. Do not use this element.

<include>

The <include> element determines what to migrate, unless there is a more specific <exclude> rule. You can specify a script to be more specific to extend the definition of what you want to collect. For each <include> element there can be multiple <objectSet> elements.

  • Number of occurrences: Unlimited

  • Parent elements: <rules>

  • Required child element: <objectSet>

  • Helper functions: You can use the following <include> filter functions with this element: CompareStringContent, IgnoreIrrelevantLinks, AnswerNo, NeverRestore, and SameRegContent.

Syntax:

<include filter="ScriptInvocation">

</include>

Setting Required? Value

filter

No.

If this parameter is not specified, then all patterns that are inside the child <ObjectSet> element will be processed.

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script will be called for each object that is enumerated by the object sets in the <include> rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

The following example is from the MigUser.xml file:

<component type="Documents" context="User">
   <displayName _locID="miguser.myvideo">My Video</displayName>
	<paths>
		 <path type="File">%CSIDL_MYVIDEO%</path>
	</paths>
	<role role="Data">
		 <detects> 	 
			<detect>
			 <condition>MigXmlHelper.DoesObjectExist("File","%CSIDL_MYVIDEO%")</condition>
			</detect>
		 </detects>
		 <rules>
			 <include filter='MigXmlHelper.IgnoreIrrelevantLinks()'>
				<objectSet>
					 <pattern type="File">%CSIDL_MYVIDEO%\* [*]</pattern>
				</objectSet>
			 </include>
			 <merge script="MigXmlHelper.DestinationPriority()">
				<objectSet>
					 <pattern type="File">%CSIDL_MYVIDEO% [desktop.ini]</pattern>
				</objectSet>
			</merge>
		 </rules>
	</role>
	</component>

The following example is from the MigApp.xml file:

<include>
   <objectSet>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [01020fff]</pattern>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e0324]</pattern>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6600]</pattern>
	<pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6700]</pattern>
		 <content filter="MigSysHelper.ExtractSingleFileAnsiBin()">
			<objectSet>
			 <pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e0324]</pattern>
			 <pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6600]</pattern>
			 <pattern type="Registry">HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e6700]</pattern>
			</objectSet>
		 </content>
   </objectSet>
</include>

<include> and <exclude> filter functions

The following functions return a Boolean value. You can use them to migrate certain objects based on when certain conditions are met.

  • AnswerNo

    This filter always returns FALSE.

    Syntax: AnswerNo ()

  • CompareStringContent

    Syntax: CompareStringContent("StringContent","CompareType")

    Setting Required? Value

    StringContent

    Yes

    The string to check against.

    CompareType

    Yes

    A string. Use one of the following values:

    • Equal (case insensitive). The function returns TRUE if the string representation of the current object that is processed by the migration engine is identical to StringContent.

    • NULL or any other value. The function returns TRUE if the string representation of the current object that is processed by the migration engine does not match StringContent.

  • IgnoreIrrelevantLinks

    This filter screens out the .lnk files that point to an object that is not valid on the destination computer. Note that the screening takes place on the destination computer, so all .lnk files will be saved to the store during ScanState. Then they will be screened out when you run the LoadState tool.

    Syntax: IgnoreIrrelevantLinks ()

    For example:

    <include filter='MigXmlHelper.IgnoreIrrelevantLinks()'>
    	 <objectSet>
    		<pattern type="File">%CSIDL_COMMON_VIDEO%\* [*]</pattern>
    	 </objectSet>
    </include>
    
  • NeverRestore

    You can use this function to collect the specified objects from the source computer but then not migrate the objects to the destination computer. When run with the ScanState tool, this function evaluates to TRUE. When run with the LoadState tool, this function evaluates to FALSE. You may want to use this function when you want to check an object's value on the destination computer but do not intend to migrate the object to the destination.

    Syntax: NeverRestore()

    In the following example, HKCU\Control Panel\International [Locale] will be included in the store, but it will not be migrated to the destination computer:

    <include filter="MigSysHelper.NeverRestore()">
       <objectSet>
    	<pattern type="Registry">HKCU\Control Panel\International [Locale]</pattern>
       </objectSet>
    </include>
    
  • SameRegContent

    The SameRegContent function compares a registry value (SourceRegVal) of the source computer to a registry value of the destination computer (DestRegVal). On the source computer, this function always returns TRUE, so the <include> rule is always evaluated. Then, on the destination computer, the two values are compared and, if they match, the include rule is evaluated. You may want to use this function to check the value of a key on the destination computer and then apply it only if the value matches the value on the destination computer.

    Syntax: SameRegContent(SourceRegVal, DestRegVal)

    This example compares the values of both paths, and evaluates the <include> rule only if the value on the source computer matches the value on the destination computer.

    <include filter="MigSysHelper.SameRegContent('HKCU\Control Panel\International [Locale]','HKCU\Control Panel\International [Locale]')">
    

<includeAttributes>

You can use the <includeAttributes> element to determine whether certain parameters associated with an object will be migrated along with the object itself. If there are conflicts between the <includeAttributes> and <excludeAttributes> elements, the most specific pattern will determine which parameters will be migrated. If an object does not have an <includeAttributes> or <excludeAttributes> element, then all of its parameters will be migrated.

Syntax:

<includeAttributes attributes="Security|TimeFields|Security,TimeFields">

</includeAttributes>

Setting Required? Value

attributes

Yes

Specifies the attributes to be included with a migrated object. You can specify one of the following, or both separated by quotes; for example, "Security","TimeFields":

  • Security can be one of the following values:

    • Owner. The owner of the object (SID).

    • Group. The primary group for the object (SID).

    • DACL (discretionary access control list). An access control list that is controlled by the owner of an object and that specifies the access particular users or groups can have to the object.

    • SACL (system access control list). An ACL that controls the generation of audit messages for attempts to access a securable object. The ability to get or set an object's SACL is controlled by a privilege typically held only by system administrators.

  • TimeFields can be one of the following:

    • CreationTime. Specifies when the file or directory was created.

    • LastAccessTime. Specifies when the file is last read from, written to, or, in the case of executable files, run.

    • LastWrittenTime. Specifies when the file is last written to, truncated, or overwritten.

For an example of how to use the <includeAttributes> element, see the example for <excludeAttributes>.

<library>

This is an internal USMT element. Do not use this element.

<location>

The <location> element defines the location of the <object> element.

  • Number of occurrences: once for each <object>

  • Parent elements: <object>

  • Child elements: <script>

Syntax:

<location type="typeID">ObjectLocation</location>

Setting Required? Value

type

Yes

typeID can be Registry or File.

ObjectLocation

Yes

The location of the object.

The following example is from the MigApp.xml file:

<addObjects>
   <object>
	<location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [UpgradeVersion]</location>
	<attributes>DWORD</attributes>
	<bytes>0B000000</bytes>
   </object>
   <object>
	<location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [Lang]</location>
	<attributes>DWORD</attributes>
	<bytes>00000000</bytes>
   </object>
</addObjects>

<locationModify>

You can use the <locationModify> element to change the location and name of an object before it is migrated to the destination computer. The <locationModify> element is processed only when the LoadState tool is run on the destination computer. In other words, this element is ignored by the ScanState tool. The <locationModify> element will create the appropriate folder on the destination computer if it does not already exist.

Number of occurrences: Unlimited

Syntax:

<locationModify script="ScriptInvocation">

</locationModify>

Setting Required? Value

script

Yes

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script will be called for each object that is enumerated by the object sets in the include rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

The following example is from the MigApp.xml file:

<locationModify script="MigXmlHelper.RelativeMove('%CSIDL_APPDATA%\Microsoft\Office','%CSIDL_APPDATA%')">
   <objectSet>
	<pattern type="File">%CSIDL_APPDATA%\Microsoft\Office\ [Access10.pip]</pattern>
   </objectSet>
</locationModify>

<locationModify> functions

The following functions change the location of objects as they are migrated when using the <locationModify> element. These functions are called for every object that the parent <ObjectSet> element is enumerating. The <locationModify> element will create the appropriate folder on the destination computer if it does not already exist.

  • ExactMove

    The ExactMove function moves all of the objects that are matched by the parent <ObjectSet> element into the given ObjectEncodedLocation. You can use this function when you want to move a single file to a different location on the destination computer. If the destination location is a node, all of the matching source objects will be written to the node without any subdirectories. If the destination location is a leaf, the migration engine will migrate all of the matching source objects to the same location. If a collision occurs, the normal collision algorithms will apply.

    Syntax: ExactMove(ObjectEncodedLocation)

    Setting Required? Value

    ObjectEncodedLocation

    Yes

    The destination location for all of the source objects.

    For example:

    <locationModify script="MigXmlHelper.ExactMove('HKCU\Keyboard Layout\Toggle [HotKey]')">
    	 <objectSet>
    		<pattern type="Registry">HKCU\Keyboard Layout\Toggle []</pattern>
    	 </objectSet>
    </locationModify>
    
  • Move

    The Move function moves objects to a different location on the destination computer. In addition, this function creates subdirectories that were above the longest CSIDL in the source object name.

    Syntax: Move(DestinationRoot)

    Setting Required? Value

    DestinationRoot

    Yes

    The location where the source objects will be moved. If needed, this function will create any subdirectories that were above the longest CSIDL in the source object name.

  • RelativeMove

    You can use the RelativeMove function to collect and move data. Note that you can use environment variables in source and destination roots, but they may be defined differently on the source and destination computers.

    Syntax: RelativeMove(SourceRoot,DestinationRoot)

    Setting Required? Value

    SourceRoot

    Yes

    The location from where the objects will be moved. Any source objects that are enumerated by the parent <ObjectSet> element that are not in this location will not be moved.

    DestinationRoot

    Yes

    The location where the source objects will be moved to on the destination computer. If needed, this function will create any subdirectories that were above SourceRoot.

    For example:

    <include>
       <objectSet>
    	<pattern type="File">%CSIDL_COMMON_FAVORITES%\* [*]</pattern>
       <objectSet>
    </include>
    <locationModify script="MigXmlHelper.RelativeMove('%CSIDL_COMMON_FAVORITES%','%CSIDL_COMMON_FAVORITES%')">
    	 <objectSet>
    		<pattern type="File">%CSIDL_COMMON_FAVORITES%\* [*]</pattern>
    	 </objectSet>
    </locationModify>
    

<_locDefinition>

This is an internal USMT element. Do not use this element.

<manufacturer>

The <manufacturer> element defines the manufacturer for the component, but does not affect the migration.

  • Number of occurrences: zero or one

  • Parent elements: <component>

  • Child elements: none

Syntax:

<manufacturer>Name</manufacturer>

Setting Required? Value

Name

Yes

The name of the manufacturer for the component.

<merge>

The <merge> element determines what will happen when a collision occurs. A collision is when an object that is migrated is already present on the destination computer. If you do not specify this element, the default behavior for the registry is for the source object to overwrite the destination object. The default behavior for files is for the source file to be renamed to "OriginalFileName(1).OriginalExtension". This element specifies only what should be done when a collision occurs. It does not include objects. Therefore, for your objects to migrate, you must specify <include> rules along with the <merge> element. When an object is processed and a collision is detected, USMT will select the most specific merge rule and apply it to resolve the conflict. For example, if you have a <merge> rule C:\* [*] set to <sourcePriority> and a <merge> rule C:\subfolder\* [*] set to <destinationPriority>, then USMT would use the <destinationPriority> rule because it is the more specific.

For an example of this element, see How does <merge> work when there are conflicts on the destination computer?.

  • Number of occurrences: Unlimited

  • Parent elements: <rules>

  • Required child element: <objectSet>

  • Helper functions: You can use the following <merge> functions with this element: SourcePriority, DestinationPriority, FindFilePlaceByPattern, LeafPattern, NewestVersion, HigherValue(), and LowerValue().

Syntax:

<merge script="ScriptInvocation">

</merge>

Setting Required? Value

script

Yes

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script will be called for each object that is enumerated by the object sets in the <include> rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

The following example is from the MigUser.xml file:

<rules>
   <include filter='MigXmlHelper.IgnoreIrrelevantLinks()'>
	<objectSet>
		 <pattern type="File">%CSIDL_MYVIDEO%\* [*]</pattern>
	</objectSet>
   </include>
   <merge script="MigXmlHelper.DestinationPriority()">
	<objectSet>
		 <pattern type="File">%CSIDL_MYVIDEO% [desktop.ini]</pattern>
	</objectSet>
   </merge>
</rules>

<merge> functions

These functions control how collisions are resolved.

  • DestinationPriority

    Specifies to keep the object that is on the destination computer and not migrate the object from the source computer.

    For example:

    <merge script="MigXmlHelper.DestinationPriority()">
    	 <objectSet>
    		<pattern type="Registry">HKCU\Software\Microsoft\Office\9.0\PhotoDraw\ [MyPictures]</pattern>
    		<pattern type="Registry">HKCU\Software\Microsoft\Office\9.0\PhotoDraw\Settings\ [PicturesPath]</pattern>
    		<pattern type="Registry">HKCU\Software\Microsoft\Office\9.0\PhotoDraw\Settings\ [AdditionalPlugInPath]</pattern>
    	 </objectSet>
    </merge>
    
  • FindFilePlaceByPattern

    The FindFilePlaceByPattern function saves files with an incrementing counter when a collision occurs. It is a string that contains one of each constructs: <F>, <E>, <N> in any order.

    Syntax: FindFilePlaceByPattern(FilePattern)

    Setting Required? Value

    FilePattern

    Yes

    • <F> will be replaced by the original file name.

    • <N> will be replaced by an incrementing counter until there is no collision with the objects on the destination computer.

    • <E> will be replaced by the original file name extension.

    For example, <F> (<N>).<E> will change the source file MyDocument.doc into MyDocument (1).doc on the destination computer.

  • NewestVersion

    The NewestVersion function will resolve conflicts on the destination computer based on the version of the file.

    Syntax: NewestVersion(VersionTag)

    Setting Required? Value

    VersionTag

    Yes

    The version field that will be checked. This can be "FileVersion" or "ProductVersion". The file with the highest VersionTag version determines which conflicts will be resolved based on the file's version. For example, if Myfile.txt contains FileVersion 1 and the same file on the destination computer contains FileVersion 2, the file on destination will remain.

  • HigherValue()

    You can use this function for merging registry values. The registry values will be evaluated as numeric values, and the one with the higher value will determine which registry values will be merged.

  • LowerValue()

    You can use this function for merging registry values. The registry values will be evaluated as numeric values and the one with the lower value will determine which registry values will be merged.

  • SourcePriority

    Specifies to migrate the object from the source computer, and to delete the object that is on the destination computer.

    For example:

    <merge script="MigXmlHelper.SourcePriority()">
     <objectSet>
       <pattern type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Publisher [UpgradeVersion]</pattern>
       <pattern type="Registry">%HklmWowSoftware%\Microsoft\Office\11.0\Common\Migration\Publisher [UpgradeVersion]</pattern>
       <pattern type="Registry">%HklmWowSoftware%\Microsoft\Office\10.0\Common\Migration\Publisher [UpgradeVersion]</pattern>
     </objectSet>
    </merge>
    

<migration>

The <migration> element is the single root element of a migration .xml file and is required. Each .xml file must have a unique migration urlid. The urlid of each file that you specify on the command line must be unique. This is because USMT uses the urlid to define the components within the file. For example, you must specify the following at the beginning of each file: <CustomFileName> is the name of the file; for example, "CustomApp".

Syntax:

<migration urlid="UrlID/Name">

</migration>

Setting Required? Value

urlid

Yes

UrlID is a string identifier that uniquely identifies this .xml file. This parameter must be a no-colon-name as defined by the XML Namespaces specification. Each migration .xml file must have a unique urlid. If two migration .xml files have the same urlid, the second .xml file that is specified on the command line will not be processed. For more information about XML Namespaces, see this Microsoft Web site.

Name

No

Although not required, it is good practice to use the name of the .xml file.

The following example is from the MigApp.xml file:

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/migapp">
</migration>

MigXMLHelper.FileProperties

This filter helper function can be used to filter the migration of files based on file size and date attributes.

Helper Function MigXMLHelper.FileProperties (property, operator, valueToCompare)

Property

filesize, dateCreated, dateModified, dateAccessed

Operator

range, neq, lte, lt, eq, gte, gt

valueToCompare

The value we are comparing. For example:

Date: “2008/05/15-2005/05/17”, “2008/05/15”

Size: A numeral with B, KB, MB, or GB at the end. “5GB”, “1KB-1MB”

<component context="System"  type="Application">
<displayName>File_size</displayName>
<role role="Data">

   <rules>
		<include filter='MigXmlHelper.FileProperties("dateAccessed","range","2008/05/15-2008/05/17")'>
		 <objectSet>
		 <pattern type="File">%SYSTEMDRIVE%\DOCS\* [*]</pattern>
		 </objectSet>
	</include>
   </rules>
</role>
</component>

<namedElements>

You can use the <namedElements> element to define named elements. You can use these elements in any component throughout your .xml file. For an example of how to use this element, see the MigApp.xml file.

Syntax:

<namedElements>

</namedElements>

For an example of this element, see the MigApp.xml file.

<object>

The <object> element represents a file or registry key.

Syntax:

<object>

</object>

The following example is from the MigApp.xml file:

<addObjects>
   <object>
	<location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [UpgradeVersion]</location>
	<attributes>DWORD</attributes>
	<bytes>0B000000</bytes>
   </object>
   <object>
	<location type="Registry">%HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\Office [Lang]</location>
	<attributes>DWORD</attributes>
	<bytes>00000000</bytes>
	</object>
</addObjects>

<objectSet>

The <objectSet> element contains a list of object patterns ; for example, file paths, registry locations, and so on. Any child <conditions> elements will be evaluated first. If all child <conditions> elements return FALSE, the <objectSet> element will evaluate to an empty set. For each parent element, there can be only multiple <objectSet> elements.

Syntax:

<objectSet>

</objectSet>

The following example is from the MigUser.xml file:

<component type="Documents" context="User">
   <displayName _locID="miguser.mymusic">My Music</displayName>
	<paths>
		 <path type="File">%CSIDL_MYMUSIC%</path>
	</paths>
   <role role="Data">
	<detects> 	 
	<detect>
		 <condition>MigXmlHelper.DoesObjectExist("File","%CSIDL_MYMUSIC%")</condition>
	</detect>
   </detects> 	 
   <rules>
	<include filter='MigXmlHelper.IgnoreIrrelevantLinks()'>
		 <objectSet>
			<pattern type="File">%CSIDL_MYMUSIC%\* [*]</pattern>
		 </objectSet>
	</include>
	<merge script="MigXmlHelper.DestinationPriority()">
		 <objectSet>
			<pattern type="File">%CSIDL_MYMUSIC%\ [desktop.ini]</pattern>
		 </objectSet>
	</merge>
   </rules>
   </role>
</component>

<path>

This is an internal USMT element. Do not use this element.

<paths>

This is an internal USMT element. Do not use this element.

<pattern>

You can use this element to specify multiple objects. You can specify multiple <pattern> elements for each <objectSet> element and they will be combined. If you are specifying files, you may want to use GenerateDrivePatterns with <script> instead. GenerateDrivePatterns is basically the same as a <pattern> rule, without the drive letter specification. For example, the following two lines of code are similar:

<pattern type="File">C:\Folder\* [Sample.doc]</pattern>
<script>MigXmlHelper.GenerateDrivePatterns("\Folder\* [Sample.doc]","Fixed"</script>
  • Number of occurrences: Unlimited

  • Parent elements: <objectSet>

  • Child elements: none but Path [object] must be valid.

Syntax:

<pattern type="typeID">Path [object]</pattern>

Setting Required? Value

type

Yes

typeID can be Registry, File, or Ini. If typeId is Ini, then you cannot have a space between Path and object. For example, the following is correct when type="Ini":

<pattern type="Ini">%WinAmp5InstPath%\Winamp.ini|WinAmp[keeponscreen]</pattern>

Path [object]

Yes

A valid registry or file path pattern, followed by at least one space, followed by brackets [] that contain the object to be migrated.

  • Path can contain the asterisk (*) wildcard character or can be an environment variable. You cannot use the question mark as a wildcard character.You can use HKCU and HKLM to refer to HKEY_CURRENT_USER and HKEY_LOCAL_MACHINE respectively.

  • Object can contain the asterisk (*) wildcard character. However, you cannot use the question mark as a wildcard character. For example:

    C:\Folder\ [*] enumerates all files in C:\Path but no subfolders of C:\Folder.

    C:\Folder\* [*] enumerates all files and subfolders of C:\Folder.

    C:\Folder\ [*.mp3] enumerates all .mp3 files in C:\Folder.

    C:\Folder\ [Sample.doc] enumerates only the Sample.doc file located in C:\Folder.

    Note

    If you are migrating a file that has a square bracket character ([ or ]) in the file name, you must insert the carrot (^) character directly before the bracket for it to be valid. For example, if there is a file named "file].txt", you must specify <pattern type="File">c:\documents\mydocs [file^].txt]</pattern> instead of <pattern type="File">c:\documents\mydocs [file].txt]</pattern>.

For example:

  • To migrate a single registry key:

    <pattern type="Registry">HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache [Persistent]</pattern>
    
  • To migrate the EngineeringDrafts folder and any subfolders from the C: drive:

    <pattern type="File">C:\EngineeringDrafts\* [*]</pattern>
    
  • To migrate only the EngineeringDrafts folder, excluding any subfolders, from the C: drive:

    <pattern type="File"> C:\EngineeringDrafts\ [*]</pattern>
    
  • To migrate the Sample.doc file from C:\EngineeringDrafts:

    <pattern type="File"> C:\EngineeringDrafts\ [Sample.doc]</pattern>
    
  • To migrate the Sample.doc file from where ever it exists on the C: drive use pattern in the following way. If multiple files exist with the same name on the C: drive, then all of these files will be migrated.

    <pattern type="File"> C:\* [Sample.doc] </pattern>
    
  • For more examples of how to use this element, see Exclude Files and Settings, Reroute Files and Settings, Include Files and Settings, and Custom XML Examples.

<processing>

You can use this element to run a script during a specific point within the migration process. Return values are not expected from the scripts that you specify, and if there are return values, they will be ignored.

  • Number of occurrences: unlimited

  • Parent elements: <rules>

  • Required child element: <script>

Syntax:

<processing when="pre-scan|scan-success|post-scan|pre-apply|apply-success|post-apply">

</processing>

Setting Required? Value

when

Yes

Indicates when the script should be run. This value can be one of the following:

  • pre-scan means before the scanning process begins.

  • scan-success means after the scanning process has finished successfully.

  • post-scan means after the scanning process has finished, whether it was successful or not.

  • pre-apply means before the apply process begins.

  • apply-success means after the apply process has finished successfully.

  • post-apply means after the apply process has finished, whether it was successful or not.

<plugin>

This is an internal USMT element. Do not use this element.

<role>

The <role> element is required in a custom .xml file. By specifying the <role> element, you can create a concrete component. The component will be defined by the parameters specified at the <component> level, and with the role that you specify here.

Syntax:

<role role="Container|Binaries|Settings|Data">

</role>

Setting Required? Value

role

Yes

Defines the role for the component. Role can be one of:

  • Container

  • Binaries

  • Settings

  • Data

You can either:

  1. Specify up to three <role> elements within a <component> — one “Binaries” role element, one “Settings” role element and one “Data” role element. These parameters do not change the migration behavior — their only purpose is to help you categorize the settings that you are migrating. You can nest these <role> elements, but each nested element must be of the same role parameter.

  2. Specify one “Container” <role> element within a <component> element. In this case, you cannot specify any child <rules> elements, only other <component> elements. And each child <component> element must have the same type as that of parent <component> element. For example:

																		<component context="UserAndSystem" type="Application">
  <displayName _locID="migapp.msoffice2003">Microsoft Office 2003</displayName> 
  <environment name="GlobalEnv" /> 
  <role role="Container">
	<detection name="AnyOffice2003Version" /> 
	<detection name="FrontPage2003" /> 
	<!-- 
 Office 2003 Common Settings 
  --> 
	<component context="UserAndSystem" type="Application">

The following example is from the MigUser.xml file. For more examples, see the MigApp.xml file:

<component type="System" context="User">
   <displayName _locID="miguser.startmenu">Start Menu</displayName>
   <paths>
	<path type="File">%CSIDL_STARTMENU%</path>
   </paths>
   <role role="Settings">
	<detects> 	 
		 <detect>
			<condition>MigXmlHelper.DoesObjectExist("File","%CSIDL_STARTMENU%")</condition>
		 </detect>
	</detects> 	 
   <rules>
	<include filter='MigXmlHelper.IgnoreIrrelevantLinks()'>
		 <objectSet>
			<pattern type="File">%CSIDL_STARTMENU%\* [*]</pattern>
		 </objectSet>
	</include>
	<merge script="MigXmlHelper.DestinationPriority()">
		 <objectSet>
			<pattern type="File">%CSIDL_STARTMENU% [desktop.ini]</pattern>
			<pattern type="File">%CSIDL_STARTMENU%\* [*]</pattern>
		 </objectSet>
	</merge>
   </rules>
   </role>
</component>

<rules>

The <rules> element is required in a custom .xml file. This element contains rules that will run during the migration if the parent <component> element is selected, unless the child <conditions> element, if present, evaluates to FALSE. For each <rules> element there can be multiple child <rules> elements.

Syntax:

<rules name="ID" context="User|System|UserAndSystem">

</rules>

Setting Required? Value

name

Yes, when <rules> is a child to <namedElements>

No, when <rules> is a child to any other element

When ID is specified, any child elements are not processed. Instead, any other <rules> elements with the same name that are declared within <namedElements> are processed.

context

No

(default = UserAndSystem)

Defines the scope of this parameter — whether to process this component in the context of the specific user, across the entire operating system, or both.

The largest possible scope is set by the component element. For example, if a <component> element has a context of User and a <rules> element had a context of UserAndSystem, then the <rules> element would act as though it has a context of User. If <rules> had a context of System, it would act as though <rules> was not there.

  • User. Evaluates the variables for each user.

  • System. Evaluates the variables only once for the system.

  • UserAndSystem. Evaluates the variables for the entire operating system and each user.

The following example is from the MigUser.xml file:

<component type="Documents" context="User">
   <displayName _locID="miguser.mymusic">My Music</displayName>
	<paths>
		 <path type="File">%CSIDL_MYMUSIC%</path>
	</paths>
   <role role="Data">
	<detects> 	 
	<detect>
		 <condition>MigXmlHelper.DoesObjectExist("File","%CSIDL_MYMUSIC%")</condition>
	</detect>
   </detects> 	 
   <rules>
	<include filter='MigXmlHelper.IgnoreIrrelevantLinks()'>
		 <objectSet>
			<pattern type="File">%CSIDL_MYMUSIC%\* [*]</pattern>
		 </objectSet>
	</include>
	<merge script="MigXmlHelper.DestinationPriority()">
		 <objectSet>
			<pattern type="File">%CSIDL_MYMUSIC%\ [desktop.ini]</pattern>
		 </objectSet>
	</merge>
   </rules>
   </role>
</component>

<script>

The return value that is required by <script> depends on the parent element.

Number of occurrences: Once for <variable>, unlimited for <objectSet> and <processing>

Parent elements: <objectSet>, <variable>, <processing>

Child elements: none

Syntax and helper functions:

  • General Syntax: <script>ScriptWithArguments</script>

  • You can use GetStringContent when <script> is within <variable>.

    Syntax: <script>MigXmlHelper.GetStringContent("ObjectType","EncodedLocationPattern", "ExpandContent")</script>

    Example: <script>MigXMLHelper.GetStringContent("Registry","HKLM\Software\MyApp\Installer [EXEPATH]")</script>

  • You can use GenerateUserPatterns when <script> is within <objectSet>.

    Syntax: <script>MigXmlHelper.GenerateUserPatterns("ObjectType","EncodedLocationPattern","ProcessCurrentUser")</script>

    Example: <script>MigXmlHelper.GenerateUserPatterns ("File","%USERPROFILE%\* [*.doc]", "FALSE")</script>

  • You can use GenerateDrivePatterns when <script> is within <objectSet>.

    Syntax: <script>MigXmlHelper.GenerateDrivePatterns("PatternSegment","DriveType")</script>

    Example: <script>MigXmlHelper.GenerateDrivePatterns("* [sample.doc]", "Fixed")</script>

  • You can use the Simple executing scripts with <script> elements that are within <processing> elements: AskForLogoff, ConvertToShortFileName, KillExplorer, RemoveEmptyDirectories, RestartExplorer, RegisterFonts, StartService, StopService, SyncSCM.

    Syntax: <script>MigXmlHelper.ExecutingScript</script>

    Example: <script>MigXmlHelper.KillExplorer()</script>

Setting Required? Value

ScriptWithArguments

Yes

A script followed by any number of string arguments that are separated by a comma and enclosed in parenthesis. For example, MyScripts.AScript ("Arg1","Arg2").

The script will be called for each object that is enumerated by the object sets in the <include> rule. The filter script returns a Boolean value. If the return value is TRUE, the object will be migrated. If it is FALSE, it will not be migrated.

The return value that is required by <script> depends on the parent element.

  • When used within <variable>, the return value must be a string.

  • When used within <objectSet>, the return value must be a two-dimensional array of strings.

  • When used within <location>, the return value must be a valid location that aligns with the type attribute of <location>. For example, if <location type="File">, the child script element, if specified, must be a valid file location.

    Note

    If you are migrating a file that has a bracket character ([ or ]) in the file name, insert the carrot (^) character directly before the bracket for it to be valid. For example, if there is a file named "file].txt", specify <pattern type="File">c:\documents\mydocs [file^].txt]</pattern> instead of <pattern type="File">c:\documents\mydocs [file].txt]</pattern>.

Examples:

To migrate the Sample.doc file from any drive on the source computer, use <script> as follows. If multiple files exist with the same name, all such files will get migrated.

<script>MigXmlHelper.GenerateDrivePatterns("* [sample.doc]", "Fixed")</script> 

For more examples of how to use this element, see Exclude Files and Settings, Reroute Files and Settings, Include Files and Settings, and Custom XML Examples.

<script> functions

You can use the following functions with the <script> element

String and pattern generating functions

These functions return either a string or a pattern.

  • GetStringContent

    You can use GetStringContent with <script> elements that are within <variable> elements. If possible, this function returns the string representation of the given object. Otherwise, it returns NULL. For file objects this function always returns NULL.

    Syntax: GetStringContent("ObjectType","EncodedLocationPattern", "ExpandContent")

    Setting Required? Value

    ObjectType

    Yes

    The type of object. Can be Registry or Ini (for an .ini file).

    EncodedLocationPattern

    Yes

    • If type of object is Registry, EncodedLocationPattern must be a valid registry path. For example, HKLM\SOFTWARE\MyKey[].

    • If the type of object is Ini, then EncodedLocationPattern must be in the following format:

      IniFilePath|SectionName[SettingName]

    ExpandContent

    No (default=TRUE)

    Can be TRUE or FALSE. If FALSE, then the given location will not be expanded before it is returned.

    For example:

    <variable name="MSNMessengerInstPath">
    <script>MigXmlHelper.GetStringContent("Registry","%HklmWowSoftware%\Microsoft\MSNMessenger [InstallationDirectory]")</script>
    </variable>
    
  • GenerateDrivePatterns

    The GenerateDrivePatterns function will iterate all of the available drives and select the ones that match the requested drive type. It will then concatenate the selected drives with the end part of PatternSegment to form a full encoded file pattern. For example, if PatternSegment is Path [file.txt] and DriveType is Fixed, then the function will generate C:\Path [file.txt], and other patterns if there are fixed drives other than C:. You cannot specify environment variables with this function. You can use GenerateDrivePatterns with <script> elements that are within <objectSet> that are within <include>/<exclude>.

    Syntax: GenerateDrivePatterns("PatternSegment","DriveType")

    Setting Required? Value

    PatternSegment

    Yes

    The suffix of an encoded pattern. It will be concatenated with a drive specification, such as “c:\”, to form a complete encoded file pattern. For example, "* [*.doc]". PatternSegment cannot be an environment variable.

    DriveType

    Yes

    The drive type for which the patterns are to be generated. You can specify one of:

    • Fixed

    • CDROM

    • Removable

    • Remote

    See the last component in the MigUser.xml file for an example of this element.

  • GenerateUserPatterns

    The function will iterate through all users that are being migrated, excluding the currently processed user if <ProcessCurrentUser> is FALSE, and will expand the specified pattern in the context of each user. For example, if users A, B and C have profiles in C:\Documents and Settings), by calling GenerateUserPattens('File','%userprofile% [*.doc]','TRUE'), the helper function will generate the following three patterns:

    • "C:\Documents and Settings\A\* [*.doc]"

    • "C:\Documents and Settings\B\* [*.doc]"

    • "C:\Documents and Settings\C\* [*.doc]"

    Syntax:GenerateUserPatterns("ObjectType","EncodedLocationPattern","ProcessCurrentUser")

    Setting Required? Value

    ObjectType

    Yes

    Defines the object type. Can be File or Registry.

    EncodedLocationPattern

    Yes

    The location pattern. Environment variables are allowed.

    ProcessCurrentUser

    Yes

    Can be TRUE or FALSE. Indicates if the patterns should be generated for the current user.

    Example:

    If GenerateUserPattens('File','%userprofile% [*.doc]','FALSE') is called while USMT is processing user A, then this function will only generate patterns for users B and C. You can use this helper function to build complex rules. For example, to migrate all .doc files from the source computer — but if user X is not migrated, then do not migrate any of the .doc files from user X’s profile.

    The following is example code for this scenario. The first <rules> element migrates all.doc files on the source computer with the exception of those inside C:\Documents and Settings. The second <rules> elements will migrate all .doc files from C:\Documents and Settings with the exception of the .doc files in the profiles of the other users. Because the second <rules> element will be processed in each migrated user context, the end result will be the desired behavior. The end result is the one we expected.

    <rules context="System">
      <include>
    	<objectSet>
    	<script>MigXmlHelper.GenerateDrivePatterns ("* [*.doc]", "Fixed")</script>
    	</objectSet>
      </include>
      <exclude>
    	<objectSet>
    	<pattern type="File">%ProfilesFolder%\* [*.doc]</pattern>
    	</objectSet>
      </exclude>
    </rules>
    <rules context="User">
      <include>
    	<objectSet>
    	<pattern type="File">%ProfilesFolder%\* [*.doc]</pattern>
    	</objectSet>
      </include>
      <exclude>
    	<objectSet>
    	<script>MigXmlHelper.GenerateUserPatterns ("File","%userprofile%\* [*.doc]", "FALSE")</script>
    	</objectSet>
      </exclude>
    </rules>
    

MigXmlHelper.GenerateDocPatterns

This helper function invokes the document finder to scan the system for all files that can be migrated. It can be invoked in either System or User context to focus the scan.

Setting Required? Value

ScanProgramFiles

No (default = FALSE)

Can be TRUE or FALSE. The ScanProgramFiles parameter determines whether or not the document finder scans the Program Files directory to gather registered file extensions for known applications. For example, when set to TRUE it will discover and migrate .jpg files under the Photoshop directory, if .jpg is a file extension registered to Photoshop.

IncludePatterns

No (default = TRUE)

Can be TRUE or FALSE. TRUE will generate include patterns and can be added under the <include> element. FALSE will generate exclude patterns and can be added under the <exclude> element.

SystemDrive

No (default = FALSE)

Can be TRUE or FALSE. If TRUE, restricts all patterns to the system drive.

 <!-- This component migrates data in user context -->
  <component type="Documents" context="User">
	<displayName>MigDocUser</displayName>
	<role role="Data">
	<rules>
		<include filter='MigXmlHelper.IgnoreIrrelevantLinks()'>
		<objectSet>
			<script>MigXmlHelper.GenerateDocPatterns ("false")</script>
		</objectSet>
		</include>
		<exclude>
		<objectSet>
		 <script>MigXmlHelper.GenerateDocPatterns ("false", "false", "false")</script>
		</objectSet>
		</exclude>
	</rules>
	</role>
  </component>

Simple executing scripts

The following scripts have no return value. You can use the following errors with <script> elements that are within <processing> elements

  • AskForLogoff(). Prompts the user to log off at the end of the migration. For example:

    	 <processing when="apply-success">
    		<script>MigXmlHelper.AskForLogoff()</script>
    	 </processing>
    
  • ConvertToShortFileName(RegistryEncodedLocation). If RegistryEncodedLocation is the full path of an existing file, this function will convert the file to its short file name and then it will update the registry value.

  • KillExplorer(). Stops Explorer.exe for the current user context. This allows access to certain keys and files that are kept open when Explorer.exe is running. For example:

    	 <processing when="pre-apply">
    		<script>MigXmlHelper.KillExplorer()</script>
    	 </processing>
    
  • RegisterFonts(FileEncodedLocation). Registers the given font or all of the fonts in the given directory. For example:

    <processing when="apply-success">
    <script>MigXmlHelper.RegisterFonts("%CSIDL_COMMON_FONTS%")</script>
    </processing>
    
  • RemoveEmptyDirectories (DirectoryEncodedPattern). Deletes any empty directories that match DirectoryEncodedPattern on the destination computer.

  • RestartExplorer(). Restarts Explorer.exe at the end of the migration. For example:

    	 <processing when="post-apply">
    		<script>MigXmlHelper.RestartExplorer()</script>
    	 </processing>
    
  • StartService (ServiceName, OptionalParam1, OptionalParam2,…). Starts the service identified by ServiceName. ServiceName is the subkey in HKLM\System\CurrentControlSet\Services that holds the data for the given service. The optional parameters, if any, will be passed to the StartService API. For more information, see this Microsoft Web site.

  • StopService (ServiceName). Stops the service that is identified by ServiceName. ServiceName is the subkey in HKLM\System\CurrentControlSet\Services that holds the data for the given service.

  • SyncSCM(ServiceShortName). Reads the Start type value from the registry (HKLM\System\CurrentControlSet\Services\ServiceShortName [Start]) after it is changed by the migration engine, and then synchronizes Service Control Manager (SCM) with the new value.

<text>

You can use the <text> element to set a value for any environment variables that are inside one of the migration .xml files.

  • Number of occurrences: Once in each <variable> element.

  • Parent elements: <variable>

  • Child elements: None.

Syntax:

<text>NormalText</text>

Setting Value

NormalText

This is interpreted as normal text.

For example:

<variable name="QuickTime5or6DataSys">
  <text>%CSIDL_COMMON_APPDATA%\QuickTime</text> 
</variable>

<unconditionalExclude>

The <unconditionalExclude> element excludes the specified files and registry values from the migration, regardless of the other include rules in any of the migration .xml files or in the Config.xml file. The objects declared here will not be migrated because this element takes precedence over all other rules. For example, even if there are explicit <include> rules to include .mp3 files, if you specify to exclude them with this option, then they will not be migrated.

Use this element if you want to exclude all .mp3 files from the source computer. Or, if you are backing up C:\UserData using another method, you can exclude the entire folder from the migration. Use this element with caution, however, because if an application needs a file that you exclude, the application may not function properly on the destination computer.

Syntax:

<unconditionalExclude></unconditionalExclude>

The following .xml file excludes all .mp3 files from migration. For additional examples of how to use this element, see the Exclude Files and Settings.

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/excludefiles">
  <component context="System" type="Documents">
		<displayName>Test</displayName>
		<role role="Data">
			<rules>
			 <unconditionalExclude>
						<objectSet>
	<script>MigXmlHelper.GenerateDrivePatterns ("* [*.mp3]", "Fixed")</script>
						</objectSet> 
			 </unconditionalExclude>
			</rules>
		</role>
	</component>
</migration>

<variable>

The <variable> element is required in an <environment> element. For each <variable> element there must be one <objectSet>, <script>, or <text> element. The content of the <variable> element assigns a text value to the environment variable. This element has the following three options:

  1. If the <variable> element contains a <text> element, then the value of the variable element will be the value of the <text> element.

  2. If the <variable> element contains a <script> element and the invocation of the script produces a non-null string, then the value of the <variable> element will be the result of the script invocation.

  3. If the <variable> element contains an <objectSet> element and the evaluation of the <objectSet> element produces at least one object pattern, then the value of the first object to match the resulting object pattern will be the value of the variable element.

Syntax:

<variable name="ID" remap=TRUE|FALSE>

</variable>

Setting Required? Value

name

Yes

ID is a string value that is the name used to reference the environment variable. We recommend that ID start with the component’s name to avoid namespace collisions. For example, if your component’s name is MyComponent, and you want a variable that is your component’s install path, you could specify MyComponent.InstallPath.

remap

No, default = FALSE

Specifies whether to evaluate this environment variable as a remapping environment variable. Objects that are located in a path that is underneath this environment variable’s value are automatically moved to where the environment variable points on the destination computer.

The following example is from the MigApp.xml file:

<environment>
   <variable name="HklmWowSoftware">
	<text>HKLM\Software</text>
   </variable>
   <variable name="WinZip8or9or10Exe">
	<script>MigXmlHelper.GetStringContent("Registry","%HklmWowSoftware%\Microsoft\Windows\CurrentVersion\App Paths\winzip32.exe []")</script>
   </variable>
</environment>

<version>

The <version> element defines the version for the component, but does not affect the migration.

  • Number of occurrences: zero or one

  • Parent elements: <component>

  • Child elements: none

Syntax:

<version>ComponentVersion</version>

Setting Required? Value

ComponentVersion

Yes

The version of the component, which can contain patterns.

For example:

<version>4.*</version>

<windowsObjects>

The <windowsObjects> element is for USMT internal use only. Do not use this element.

Appendix

Specifying locations

  • Specifying encoded locations. The encoded location used in all of the helper functions is an unambiguous string representation for the name of an object. It is composed of the node part, optionally followed by the leaf enclosed in square brackets. This makes a clear distinction between nodes and leaves.

    For example, specify the file C:\Windows\Notepad.exe like this: c:\Windows[Notepad.exe]. Similarly, specify the directory C:\Windows\System32 like this: c:\Windows\System32. (Notice the absence of the [] construct.)

    Representing the registry is very similar. The default value of a registry key is represented as an empty [] construct. For example, the default value for the HKLM\SOFTWARE\MyKey registry key will be HKLM\SOFTWARE\MyKey[].

  • Specifying location patterns. You specify a location pattern in a way that is similar to how you specify an actual location. The exception is that both the node and leaf part accept patterns. However, a pattern from the node does not extend to the leaf.

    For example, the pattern c:\Windows\* will match the Windows directory and all subdirectories. But it will not match any of the files in those directories. To match the files as well, you must specify c:\Windows\*[*].

Internal USMT functions

The following functions are for internal USMT use only. Do not use them in an .xml file.

  • AntiAlias

  • ConvertScreenSaver

  • ConvertShowIEOnDesktop

  • ConvertToOfficeLangID

  • MigrateActiveDesktop

  • MigrateAppearanceUPM

  • MigrateDisplayCS

  • MigrateDisplaySS

  • MigrateIEAutoSearch

  • MigrateMouseUPM

  • MigrateSoundSysTray

  • MigrateTaskBarSS

  • SetPstPathInMapiStruc

Valid version tags

You can use the following version tags with various helper functions:

  • “CompanyName”

  • “FileDescription”

  • “FileVersion”

  • “InternalName”

  • “LegalCopyright”

  • “OriginalFilename”

  • “ProductName”

  • “ProductVersion”

The following version tags contain values that can be compared:

  • “FileVersion”

  • “ProductVersion”

See Also