2010年6月15日星期二

遷移及配置 Windows 7 的用戶帳號 UserProfile 預設目錄位置

近日(六月)除了 SCO 宣示對 Unix 智慧財產權的訴訟官司最後裁決 Novell 全勝的重大新聞外, 逃不掉一片世界盃足球熱, 眾多電腦宅懶還會用數碼接收器(USB)來收看高清數碼電視, 時差關係會錄影存檔留待翻看, Windows 系統硬碟的剩餘容量空間不足導致出現狀態; 我個人亦心癢準備採購一夥 SSD(固態硬碟)用作系統硬碟來日常使用, 所以也在測試網上流傳多種近似方法可以遷移 Windows 7 用戶帳號 UserProfile 預設目錄位置, 在測試的過程中不能幸免的出現了系統死當 Hang up, 甚至 Ctrl+Alt+Del 都失敗需要 Power Off 按掣關機, 所以惡搞 UserProfile 預設目錄前, 必需做好檔案備份及有心理準備; 個人用戶帳號 UserProfile 目錄由 SSD(細容量)移動到HDD硬碟(大容量), 除了容量擴展外其實還有多個好處, 減輕了登入使用時 SSD 系統碟不斷的寫入動作, 並且減小了個人用戶檔案的暫存檔案空間碎片(累積SSD效能下降), 尤其是網頁瀏覽器及 Temp 目錄的頻繁寫入, 當一但 OS 系統碟失陷需要重灌時也無需為拯救個人文件檔案及設定而優心煩惱。

在實測多種不同方法後綜合一個可行而且頗為滿意(起碼沒有踫到死當或缺陷), 過程快捷順利, 只要注意權限問題, 加上一些手動小修改罷了。

認識 Windows 7 系統的本機帳號目錄 UserProfile 位置架構如下:
  • 帳號預設目錄是 C:\Users\
  • 共用帳號目錄是 C:\Users\Public\
  • 預設配置帳號目錄(隱藏)是 C:\Users\Default\
  • 個人用戶帳號目錄是 C:\Users\%用戶名稱%\

網上流傳眾多方法也有不小誤判或缺陷:
  • 微軟的輕鬆傳輸(Easy Transfer)當然就不能輕鬆地將用戶帳號目錄在系統 C:\Users\ 目錄遷移到其他硬碟機, 也不用妄想啊
  • 將用戶帳號目錄遷移後利用 mklink 指令以 junction point(NTFS) 的連結方式使用, 此方法有不良的嚴重後果(原因不明, 可能是 junction 的權限問題), 在登入後使用到 Windows 某些個人配置功能時(例如: 桌面背景..等等)會令整個 GUI 介面死當或超緩慢, 部分軟體(例如: Outlook)在設定後使用時出狀態
  • 將用戶帳號目錄在 File Explorer 介面中每一個都更改 Location 位置, 實在太過手動(煩死啊), 而且用戶帳號子目錄的 AppData 帳號配置資料(及暫存檔案)都仍然使用 C: 系統碟, 此方法只是適合沒有(或不能使用)系統管理員權限的個人環境臨時的簡易方案而已
  • 將系統機碼 HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CurrentVersion\ProfileList 的 Default, Public, ProfileDirectory 都修改為其他硬碟機位置, 此方法是可行的亦是針對本機的完全修改, 不過...已經存在 C: 的系統管理員帳號還是需要手動遷移及修改系統機碼

遷移個人用戶帳號目錄 C:\Users\%用戶名稱%\ 到其他硬碟機無論任何情況必需先做好系統完全備份!!
實測應用安裝及格化準備好的硬碟(及分割區), 如圖 e: 硬碟

實測配置 Windows 7 的用戶帳號 UserProfile 目錄位置實作步驟:
1. 登入系統管理員帳號
2. 修改系統機碼將新增用戶帳號目錄指向 e: 硬碟, 以 系統管理員身分執行 登錄編輯程式(regedit):
尋找機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
如果需要將所有用戶帳號目錄(包括預設配置、共用及新增帳號)全部遷移到 e: 硬碟的話, 修改三個預設機碼如下:
Default 預設由 %SystemDrive%\Users\Default 修改為 e:\Default
ProfileDirectory 預設由 %SystemDrive%\Users 修改為 e:\
Public 預設由 %SystemDrive%\Users\Public 修改為 e:\Public
如果只需要新增帳號遷移到 e: 硬碟的話, 只需要修改"一個"預設機碼如下:
ProfileDirectory 預設由 %SystemDrive%\Users 修改為 e:\

實測遷移 Windows 7 的用戶帳號 UserProfile 目錄位置實作步驟:
1. 登入 系統管理員 帳號
2. 以 系統管理員身分 執行 cmd 命令提示字元(Command Prompt)
3. 複製用戶帳號目錄(例如: Doggie帳號)到指定位置(e:)硬碟, 在 命令提示字元 內 執行:

robocopy c:\Users\ e:\ /e /copyall /xj /xf c:\Users\desktop.ini /xd "Default" "Public" "%其他用戶帳號%"
以上的複製方法以排除 exclude(/xd) %其他用戶帳號目錄% 及不遷移的 Default 及 Public 帳號目錄
好處是無需煩惱地手動修改目錄讀寫權限, 與原來的帳號目錄權限一模一樣, 而 /xj 是不複製 junction point 連結(否則無限複製 loop, 必需手動再建立帳號目錄內 16個 junction)
4. 在"已遷移"的 e: 硬碟用戶帳號目錄內再建立 16個 junction(兼容舊軟體的目錄架構)
查看舊的 junction 目錄如下(例如: Doggie 帳號):

dir c:\Users\Doggie /al /s

手動再建立 16個 junction 到 e: 硬碟(例如: Doggie 帳號), 以 系統管理員身分 執行 cmd 命令提示字元(Command Prompt)
在 命令提示字元 內執行:

e:
cd Doggie

mklink /j "Application Data" "AppData\Roaming"
mklink /j "Cookies "AppData\Roaming\Microsoft\Windows\Cookies"
mklink /j "Local Settings" "AppData\Local"
mklink /j "My Documents" "Documents"
mklink /j "NetHood" "AppData\Roaming\Microsoft\Windows\Network Shortcuts"
mklink /j "PrintHood" "AppData\Roaming\Microsoft\Windows\Printer Shortcuts"
mklink /j "Recent" "AppData\Roaming\Microsoft\Windows\Recent"
mklink /j "SendTo" "AppData\Roaming\Microsoft\Windows\SendTo"
mklink /j "Start Menu" "AppData\Roaming\Microsoft\Windows\Start Menu"
mklink /j "Templates" "AppData\Roaming\Microsoft\Windows\Templates"

mklink /j "AppData\Local\Application Data" "AppData\Local"
mklink /j "AppData\Local\History" "AppData\Local\Microsoft\Windows\History"
mklink /j "AppData\Local\Temporary Internet Files" "AppData\Local\Microsoft\Windows\Temporary Internet Files"

mklink /j "Documents\My Music" "Music"
mklink /j "Documents\My Pictures" "Pictures"
mklink /j "Documents\My Videos" "Videos"


5. 修改系統機碼將用戶帳號目錄指向 e: 硬碟, 以 系統管理員身分 執行登錄編輯程式(regedit):
展開機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
在其中參找一條長機碼包含有用戶帳號名稱, 將其 ProfileImagePath 機碼由 c:\Users\%用戶帳號名稱% 改為 e:\%用戶帳號名稱%(如圖)
修改後即時生效

備註:
1. 如果要遷移的帳號目錄是登入使用中的系統管理員的話, 則必需建立及登入使用另一個臨時系統管理員帳號, 否則登入使用中的部分檔案文件因為系統使用中而不能完全複製成功。
2. 在 系統管理員身分 使用 xcopy 或 File Explorer 中複製帳號目錄貼上的話, 帳號目錄權限會錯誤, 導致用戶部分功能錯誤及保密讀寫權限缺失
例如: 所有預設圖示失蹤(如圖)錯誤的帳號目錄權限(如圖), 任何用戶均可讀寫檔案文件正確的帳號目錄權限

最後個人建議:
如果要遷移用戶帳號目錄(包括其一切檔案文件資料)的話, 遷移後不要立即刪除舊帳號目錄, 視不同情況酌情保留舊目錄資料一段時間, 緊急需要時還可以用來拯救狀態。

更正:
mklink -j 改正為 mklink /j 指令。

4 則留言:

  1. 最後手動建立 16個 junction的指令時,
    mklink -j "Application Data" "AppData\Roaming"
    需要改為
    mklink /j "Application Data" "AppData\Roaming"

    回覆刪除
  2. 回 Robin 於 2011年5月4日下午9:39

    謝謝指正, 文章內容已修改

    實在太習慣 linux 的指令方式了 ~~!

    回覆刪除
  3. 不好意思 如果要修改的話 是配置和遷移這兩個步驟都要做嗎 還是如果是新安裝的系統只要配置就可以了 麻煩了 謝謝

    回覆刪除
    回覆
    1. 回 匿名 君

      1。新安裝的系統首次登入的用戶帳號仍然是儲存在系統 C: 內, 因為是系統預設; 如果你的用戶帳號需要大量保留文件和設定, 當然遷移是必需的, 否則首次登入的用戶帳號棄而不用的話可在配置完成後刪除掉; 帳號管理由你決定

      2。一般針對新增的用戶帳號只需要修改配置
      將 ProfileDirectory 預設由 %SystemDrive%\Users 改為其他硬盤位置(例如 D:\ )

      刪除