众所周知,域账户没有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我设置了但是好像没什么用,文档和各种资料对此也各执一词,你可以自己试试是否有用。
另外有两条设置是没法通过组策略配的,建议在每台设备上手工设置一下(可以用组策略的执行程序功能):
1 |
Set-UevConfiguration -Computer -EnableWaitForSyncOnApplicationStart -EnableWaitForSyncOnLogon |
使用PowerShell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$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:
1 2 3 4 5 6 |
$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日志)。
参考资料: