Relocating Active Directory roaming profiles can be a tricky task. You have many shared folders with particular permissions which won’t move unlike NTFS permissons to another server if you simply copy these folders. On top of that, you need to change profile paths in Active Directory Users and Computers snap-in. And if you have hundreds of users it’s not what you will happy to do. Given these two objectives lets move on to implementation.
Moving shares preserving permissions
I ran into several suggestions how to do that, like using robocopy, xcopy, permcopy or other tools. I don’t know to what extent they might help. I’d like to suggest simpler solution. Microsoft has File Server Migration Toolkit (FSMT). It’s very basic and limited tool. It means you will probably need to do some hand work. But it solves the primary problem which is copying shares along with their permissions.
FSMT has additional feature of creating DFS links for you but I didn’t use it. GUI is rather intuitive, so there is not much to explain. The particular problem with FSMT is that it changes target share and folder paths. Say you have share with the name ~UNAME$ which is located on server CONTOSO_PDC. As a result of movement you will have share with the name ~UNAME$_contoso_pdc$. Which is not what we expect to have in our case. Same thing for target folder. For example, if the source folder for the share is D:\Profiles\UNAME, after migration you’ll get D:\Profiles\contoso_pdc\~UNAME$. Apart from additional folder in between, as you can see last part of source path is changed to share name in the target path (~UNAME$ instead of UNAME).
In my case I had to revert all these changes back to what it originally was. The trick here is to create FSMT project, add server and shares to it and then exit without performing the actual move. Then open project .xml file and correct all paths by search/replace. Since I had complicated share names I had to use replace with substitution feature in MS Office Word. For example to change target path from D:\Shared\~PROF\~UNAME$ to D:\Shared\~PROF\UNAME I used following masks for search and replace:
D:\\Shared\\~USER\\\~(*)\$
D:/Shared/~USER/\1
Here word processor searches for the first string and use word from parenthesis as the substitution for the special sequence \1.
Changing profile paths in Active Directory
Here you also have several ways to accomplish that. You can use ADModify tool. But I simply wrote a Powershell script which I share with you as it is. I believe it’s mostly self-explanatory. For convenience I also uploaded this script to FileDen. Download it from here.
# Bind to the root of the current domain $ldapPath = "LDAP://ou=Users and Computers,dc=contoso,dc=com" $objDomain = New-Object System.DirectoryServices.DirectoryEntry($ldapPath) $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objsearcher.Filter = ("(objectCategory=User)") $colResult = $objSearcher.FindAll() foreach($objResult in $colResult) { $user = $objResult.GetDirectoryEntry() write-host "For user" $user.cn ":" $profilePath = $user.ProfilePath $parts = $profilePath.ToString().Split("\") # Identifying profile type (XP = 0 or Windows 7 = 1) if($parts.Length -eq 4) { $profType = 0 } elseif($parts.Length -eq 5) { $profType = 1 } # Constructing new profile paths if($profilePath) { if($profType -eq 0) { $newProfPath = "\\SERVERNAME\" + $parts[3]; $newProfDirPath = "D:\~PROF\" + $user.sAMAccountName $newProfShareName = $parts[3] } # Windows 7 profiles do not have individual shares. There is # one share for all roaming profiles. elseif($profType -eq 1) { $newProfPath = "\\SERVERNAME\Profiles\" + $parts[4] } } # Constructing new home directory paths $homeDirectory = $user.homeDirectory $parts = $homeDirectory.ToString().Split("\") if($homeDirectory) { $newHomePath = "\\SERVERNAME\" + $parts[3]; $newHomeDirPath = "D:\~USER\" + $user.sAMAccountName $newHomeShareName = $parts[3] } if($profilePath) { # Changing profile path write-host "Changing profile path from" ` $user.ProfilePath "to" $newProfPath $user.ProfilePath = $newProfPath } if($homeDirectory) { # Changing home directory path write-host "Changing home directory path from" ` $user.homeDirectory "to" $newHomePath $user.homeDirectory = $newHomePath } # Commit changes $user.setinfo() }
Tags: active directory, AD, ADModify, DFS, File Server Migration Toolkit, FSMT, migrate, move, NTFS, permcopy, permissions, powershell, PS, roaming profiles, robocopy, shares, windows, xcopy
November 19, 2013 at 9:18 am |
Set the profile path via group policy instead – much easier than setting it in the users AD profile.
November 19, 2013 at 10:22 am |
Good advice!
July 4, 2018 at 9:37 pm |
hi, how did you performed the actual move?
November 17, 2018 at 5:06 am |
You brought up quite an old topic here. So I don’t remember the details, but I think File Server Migration Toolkit does this for you. Google it up and you will find it on the Microsoft web-site.