众所周知,域账户没有 Microsoft 账户那么舒服的同步功能(当然这也意味着底裤没那么轻易能卖出去了);而 Azure AD 的账户要开同步功能则得乖乖给微软爸爸交钱,每个用户$6/mo,贵死了。那么有没有办法在域账户上实现类似的功能并且成本还不那么高的呢?当然是有的,就是现在已经是 Windows 自带功能了的 User Experience Virtualization(UE-V)。
概念
UE-V 的工作机理很简单。首先你得有一个同步数据存储位置(可以在本地或者在网络存储上),每当退出特定程序、锁屏或注销的时候,这些程序的数据会被存储到这个预定义的位置上;每当用户登录、解锁或启动特定程序之前,如果存储区的数据发生了改变,那么这些改变会被同步应用到程序自身的数据上。
UE-V 分为数个组件:
- App Agent 用来同步和应用 UE-V 设置
- 一个 Service 用来监视进程的新建和退出,从而判定什么时候需要同步数据
- 一个 Sync Provider 用来设定同步数据存储位置,处理网络连接和缓存
- 还有一些 driver 之类的东西
准备工作
使用何种 Sync Provider?
根据所需同步方式的不同,你有三个选项:
- SyncProvider,是默认选项,可以用于本地文件系统和网络存储,带缓存功能(如果连不上文件系统,那么会使用自己缓存的数据)
- None,用于本地文件系统(如果你确保这台机子一直连着特定网络的话网络存储也行),不带缓存功能,一旦文件系统丢失就直接返回失败
- ExternalSyncProvider,适用于本地文件系统,并且有第三方程序处理对该文件系统的同步的情况(例如,OneDrive 或者其它网盘服务的同步文件夹)
支持的操作系统
最新的 UE-V 仅支持 Windows 10 Enterprise 1607 及更高版本,不支持其它 SKU。如果你打算使用低版本的 UE-V(1.x,2.0 或者 2.1),你需要下载 Microsoft Desktop Optimization Pack,并且参照旧版本的文档进行部署。
设置同步存储区
用来存储用户目录的存储区需要特殊的权限设定。把文件系统 ACL 设为 Everyone 都有所有权限会导致 UE-V 无法启动。请严格参照下文的权限完成设置。
使用 SMB Share 作为同步存储区
例如我们用
\server\uev 作为同步存储区,每个用户将会获得自己的文件夹(
\server\uev\username ,这个文件夹会被 UE-V Agent 自动创建),那么需要如下设置:
- 创建一个叫做 UE-V Users 的用户组(名字随意),把需要开启 UE-V 功能的用户加入到该用户组
- 开启该文件夹的 SMB 共享,并且设置 SMB 权限:
- UE-V Users 组 Full Control
- 删掉 Everyone 的所有权限

- 设置文件系统 ACL 权限:
那么同步存储区就设置完毕了。
使用本地文件夹作为同步存储区
就随便创建个文件夹,可选创建在网盘的同步文件夹里面。
设置和启用 UE-V 服务
启用 UE-V 服务之后需要重启。
Get-UevStatus 如果返回
UevRebootRequired=True 那么则需要重启才能生效。
使用组策略
一条注册表项:
HKEY_LOCAL_MACHINE\Software\Microsoft\UEV\Agent\Configuration,key 为
RepositoryOwnerCheckEnabled,类型为
DWORD,值为
1
其它配置均在
Computer Configuration\Policies\Administrative Templates\Windows Components\Microsoft User Experience Virtualization 下。
必须设置的项有:
- Use User Experience Virtualization (UE-V):Enabled
- Enable UEV:Enabled
- Settings Storage Path:设置到你的同步文件夹
- 如果多用户共用同一个 SMB 存储区,那么需要设置成类似
\\server\uev\%username% 的格式
- 否则就直接设随便一个文件夹或者 UNC 路径皆可
- Configure Sync Method:如果你使用第三方同步软件做设置同步那么需要设置成 ExternalSyncProvider,里面其它设置均是无效的
推荐设置的项有:
- Do not synchronize Windows Apps 建议设为 Disabled
- Sync Unlisted Windows Apps 建议设为 Enabled
- Sync Windows settings 建议全部设为 Enabled
Tray Icon 啊,Notification 啊以及 Contact 之类的都已经没用了,就没必要去设置了。Settings template catalog path 我设置了但是好像没什么用,文档和各种资料对此也各执一词,你可以自己试试是否有用。
另外有两条设置是没法通过组策略配的,建议在每台设备上手工设置一下(可以用组策略的执行程序功能):
|
Set-UevConfiguration -Computer -EnableWaitForSyncOnApplicationStart -EnableWaitForSyncOnLogon |
使用 PowerShell
|
$UevSettingsStoragePath="\\server\uev\%username%" $UevTemplatePath="\\server\uev\Templates" Set-UevConfiguration -Computer -MaxPackageSizeInBytes 102400 Set-UevConfiguration -Computer -SettingsStoragePath $UevSettingsStoragePath Set-UevConfiguration -Computer -EnableSyncProviderPing Set-UevConfiguration -Computer -SyncTimeoutInMilliseconds 600000 Set-UevConfiguration -Computer -SyncMethod SyncProvider Set-UevConfiguration -Computer -EnableSync Set-UevConfiguration -Computer -EnableSettingsImportNotify Set-UevConfiguration -Computer -SettingsImportNotifyDelayInSeconds 10 Set-UevConfiguration -Computer -DisableDontSyncWindows8AppSettings Set-UevConfiguration -Computer -WaitForSyncTimeoutInMilliseconds 2000 Set-UevConfiguration -Computer -EnableSyncUnlistedWindows8Apps Set-UevConfiguration -Computer -EnableWaitForSyncOnApplicationStart Set-UevConfiguration -Computer -EnableWaitForSyncOnLogon |
(当然你也可以把所有选项在一行写完啦。)
注册 UE-V Template
UE-V 通过一系列描述文件来定义哪个程序启动的时候需要监视和同步哪些文件,以及一些同步行为。这些描述文件被称为 template。Windows 10 1607 开始 UE-V 不会默认注册系统自带的 template,因此需要自己注册一下。
我一般用以下脚本来定时注册所有 template:
|
$UevTemplatePath="\\server\uev\Templates" Get-ChildItem $UevTemplatePath -Recurse -File -Filter "*.xml" | Foreach-Object { Register-UevTemplate $_.FullName Update-UevTemplate $_.FullName } |
(如果有些 template 已经注册过,那么会报错,不用管;如果有更新会自动更新)
至于 template 哪里去找呢,有那么几个选项:
- Windows 和部分 Microsoft 软件的 template 直接就在系统里面:
%ProgramData%\Microsoft\UEV\InboxTemplates
- Technet 上有一些用户提交的 template 可供下载
- 我自己收集了一些,放在 GitHub 上
- 你也可以自己写
如果你打算把 template 文件夹放在 SMB 共享上,那么需要配置合适的权限(请参考该节 3 和 4)。
调试
以上操作做完以后理论上 UE-V 就应该自动能用了。记得默认设置下只有在用户登录、注销、锁屏和解锁的时候才会触发同步,其它情况下大约一小时同步一次。另外如果你一次启用了很多台设备的 UE-V 并且它们现有的配置都不太一样的话,第一天不同步或者配置互相覆盖是很正常的事情哦,等一天基本上就好了。
如果你想研究一下同步数据的格式,那么可以前往你的同步文件夹,数据在
\server\uev\your_username\SettingsPackages 下。注意
SettingsPackages 是个隐藏文件夹,我也不知道为啥要这么设计,一开始总觉得文件夹是空的这是不是哪里配坏了。
如果本机 UE-V Service 坏了,那么事件查看器里面有相应的日志。记得把调试日志打开(View 菜单-Show Analytic and Debug Logs 勾选上,然后启用所需的 Debug 日志)。
参考资料: