将 Windows 11 用户目录设置到非系统盘

/
摘要:
在全新安装的 Windows 11 上,用审核模式和应答文件,让用户目录从一开始就建在非系统盘上。

Windows 的用户目录默认在 C:\Users,桌面、文档、下载、图片,还有各种软件塞进 AppData 里的缓存和配置,全都在这个目录。时间一长,系统盘的容量直接就爆炸了。

有一些 workaround 可以缓解这个问题。例如在文档、下载这些文件夹的属性里改位置,但只能挪走这几个文件夹,AppData 还留在原地。装完系统之后改注册表,或者用 mklink /J 做一个目录联接,但是已经建好的用户配置里到处都是旧路径,而且权限也对不上,之后装软件、更新可能会出一堆问题。

所以比较干净的做法是在系统刚装好、还没有创建任何用户之前,就告诉 Windows 用户目录放在哪里,这样第一个用户建出来就已经在新的位置了。微软留了一个正经的入口,就是应答文件里的 ProfilesDirectory,下面是在全新安装的 Windows 11 上用它的过程。

原理

ProfilesDirectory 属于 Microsoft-Windows-Shell-Setup 组件下的 FolderLocations,在 oobeSystem 这个配置阶段生效。OOBE 就是安装完成后让你选区域、联网、创建账户的那一套开箱流程,用户目录是在这个阶段之后才建出来的。

所以只要在进入 OOBE 之前,把写好这个设置的应答文件交给 Windows 就行。这就要用到审核模式,它是装完系统之后、OOBE 之前的一个环境,可以用内置管理员登录,在里面运行 Sysprep,并且指定应答文件,让 Sysprep 完成后重新进入 OOBE。

Mermaid diagram

操作

进入审核模式

正常安装 Windows,一直到出现选择区域的那个界面为止,这时候先不要往下走,按 Ctrl + Shift + F3。系统会重启,然后以内置管理员的身份直接进入桌面,同时弹出一个 Sysprep 的窗口,把这个窗口关掉就行,后面用命令行来运行。

进入审核模式之前最好把网线拔掉,或者不要连 Wi-Fi。因为系统联网之后会自动更新商店应用,Sysprep 遇到这种和用户绑定的应用经常会报错失败,而断网可以避开这个问题。

准备数据盘

目标盘必须是 NTFS 格式,并且不能是装着另一份 Windows 的盘。如果是一块新盘,要先在磁盘管理里做初始化、分区和格式化等。

Important

审核模式里看到的盘符不一定和安装程序里的一样,最好在资源管理器里确认一下目标盘现在到底是哪个字母,再写后面的应答文件。

写应答文件

用记事本新建一个文件,保存到目标盘的根目录,这里叫 relocate.xml,保存类型选"所有文件",编码选 UTF-8。

XML
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
  <settings pass="oobeSystem">
    <component name="Microsoft-Windows-Shell-Setup"
               processorArchitecture="amd64"
               publicKeyToken="31bf3856ad364e35"
               language="neutral"
               versionScope="nonSxS"
               xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <FolderLocations>
        <ProfilesDirectory>D:\Users</ProfilesDirectory>
      </FolderLocations>
    </component>
  </settings>
</unattend>

processorArchitecture 要和系统一致,普通的 64 位电脑是 amd64,ARM 设备是 arm64。ProfilesDirectory 里是想要的位置,D:\Users 只是个例子,路径不能是空的。

运行 Sysprep

以管理员身份打开命令提示符,先停掉 Windows Media Player 的网络共享服务,它也会让 Sysprep 失败,然后带上应答文件运行 Sysprep。

CMD
net stop wmpnetworksvc
%windir%\system32\sysprep\sysprep.exe /oobe /reboot /unattend:d:\relocate.xml

/oobe 表示做完之后回到 OOBE,/reboot 是做完后重启,/unattend 指向刚才的应答文件。过一会儿电脑会重启,重新出现选择区域的界面,这次正常走完流程,创建用户就行。

确认结果

进入系统之后,打开命令提示符。

CMD
echo %USERPROFILE%

输出是 D:\Users\用户名 就成功了。系统用来记录这个位置的注册表项也可以看一下。

CMD
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /v ProfilesDirectory

Sysprep 失败的时候

Sysprep 报错之后,窗口里的提示一般看不出原因,要去看日志,在 %windir%\System32\Sysprep\Panther 下面,setupact.log 是完整的过程,setuperr.log 只有错误,搜里面的 error 和 fail 能找到是哪个环节出的问题。

常见的原因就是前面提到的两个,联网之后商店应用被更新了,以及网络共享服务没有停掉。如果是应用的问题,日志里会有类似"某个包为用户安装了,但没有为所有用户预配"的提示,并点出应用的名字,用 PowerShell 把它卸掉再运行 Sysprep 就行。

POWERSHELL
Get-AppxPackage *应用名* | Remove-AppxPackage

另外 Sysprep 同一时间只能运行一个,重复运行或者上一次异常退出,也会让它直接报错,重启之后再来就行。

需要知道的限制

这个方法只在用户目录建出来之前才有用,已经装好、用了一段时间的系统,只能重装之后再来一遍。不过好处是之后重装系统的时候,系统盘格式化了,数据盘上的用户文件还在,需要的东西可以直接取回来。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...