Using hard links to move Windows Users folder

3

1

I'm currently trying to move bulky folders from my SSD to my HDD (my Users folder and ProgramData folder). I'm following a short guide on using Directory Junctions to do this effectively. However, this doesn't work for me. This is exactly what I did on my latest attempt:

  1. Locate old Users folder on HDD – the one I want to keep
  2. Install Windows 8 on SSD
  3. Reboot into recovery console – SSD=C: HDD=D:
  4. Copy ProgramData to HDD robocopy /copyall /mir /xj C:\ProgramData D:\ProgramData
  5. Reboot into Ubuntu to copy over anything that failed and delete ProgramData
  6. Reboot into recovery console
  7. Rename C:\Users to C:\Users.old
  8. Make junctions
    1. mklink /J C:\Users D:\Users
    2. mklink /J C:\ProgramData D:\ProgramData
  9. Check with dir that everything looks okay.

However, when I booted back up, the login splash screen was plain blue, I had no user profile picture, and upon logging in, I get:

User Profile Service service failed the sign-in. User profile cannot be loaded

So, I moved ProgramData back again, and renamed Users.old back to Users. This time, the splash screen shows correctly, but I still get the user profile issue.

What did I do wrong?

CJxD

Posted 2013-03-12T18:20:48.140

Reputation: 223

Please somebody help =[ I just tried again and it failed again! I can't use my PC without doing this and I really don't like the registry hack way – CJxD – 2013-03-12T21:57:12.950

I've got somewhere! It turns out that because I was using /xj in my robocopy flags, any required junction points would be missing. In order to make it work, they would have to be manually recreated. Instead, I made an image of my drive and moved it to the HDD - then junctions work. Except for ProgramData... I'm still trying to figure it out. – CJxD – 2013-03-17T11:17:15.093

Answers

1

I've found the answer after a lot of playing. The reason this doesn't work is because when copying the data from SSD to HDD, any existing junctions are removed. This is because of the /xj flag in robocopy which is required to stop it from getting into an infinite loop.

In order to get around this, a PowerShell script could be made to do the following:

  1. Copy the data from SSD to HDD with robocopy /copyall /mir /xj C:\Stuff D:\Stuff
  2. For each junction in C:\Stuff, create an identical junction in D:\Stuff
  3. For each junction in C:\Stuff, copy the ACL permissions to the corresponding junction in D:\Stuff
  4. Note the attributes of C:\Stuff with attrib C:\Stuff
  5. Remove or rename C:\Stuff
  6. Create the junction mklink /J C:\Stuff D:\Stuff
  7. Apply the attributes of C:\Stuff to the junction point with attrib /L C:\Stuff +H +I (for example - ProgramData uses these attributes)

Hopefully, this will move everything from C:\Stuff to D:\Stuff whilst maintaining all junction points, permissions, and attributes.

But there is a 'shortcut', which I took. Instead of bothering with all this, I made a complete drive image of C:, and restored it to D: (obviously making sure no files were on D: that would get overwritten). There is free software out there to do this such as Macrium Reflect Free and Drive Image XML.

I then copied any extra data I needed into D:, and proceeded to skip to Step 4 of the above. Afterwards, I just removed all of my Windows files that weren't required on the drive (I had to use my Ubuntu USB stick for this part).

All working!

CJxD

Posted 2013-03-12T18:20:48.140

Reputation: 223