UWF 组件(win 10 LTSB)及 WMI
UWF 组件 #
UWF 是一个单独的系统组件,在控制面板——“程序和功能”——“启用或关闭 Windows 功能”——设备锁定——“统一写入筛选器” 中启用。
也可以使用 PowerShell 安装 UWF 组件:
Enable-WindowsOptionalFeature -Online -FeatureName “Client-UnifiedWriteFilter” –All
或者 DISM:
DISM.exe /Online /enable-Feature /FeatureName:client-UnifiedWriteFilter
Unified Writer Filter,统一写入筛选器,意思是将硬盘上保护区域的数据转到内存,以保护数据安全,以及提高系统和软件运行速度(只影响数据读取,不影响数据写入),相关数据在计算机重启后被重置,不会对系统造成任何不利影响。适合于大内存用户,个人感觉至少 8G 以上内存容量,一般被网友称作微软影子系统。UMF 功能内嵌于 Win10 企业版和教育版,对相关版本完美支持。
启用过滤器后,它会自动重新配置系统以消除任何写入操作(交换文件,还原点,文件索引,碎片整理被禁用)。您可以将某些文件,目录或注册表项添加到 UWF 排除列表中。您对这些项目所做的更改将直接写入磁盘,而不是叠加。您无法为某些文件或文件夹添加排除项,例如: \Windows\System32\config\ 中的注册表文件 卷的根 \Windows,\Windows\System32,\Windows\System32\Drivers 等等。
UWF 不支持在关闭设备时使用快速启动。 如果打开了快速启动,关闭设备不会清除覆盖层。 可以在控制面板中禁用快速启动:导航到“控制面板”>“所有控制面板项”>“电源选项”>“系统设置”,并清除“打开快速启动(建议)”旁边的复选框。
UWF 设置
手动启动及设定(要重新启动系统才生效,关机再开是没用的):
用管理员模式打开控制台,挑选下列可使用命令行
uwfmgr get-config (检查 UWF 现时及下次启动后的状态)
uwfmgr overlay set-size 3072 (设置使用的内存大小)为系统重启后的下一个会话设置 UWF 覆盖的最大大小(以 MB 为单位)
uwfmgr overlay set-warningthreshold 2560 (设置警告)设置驱动程序为当前会话发出警告通知时的覆盖大小(以 MB 为单位)。
uwfmgr overlay set-criticalthreshold 3072 (设置严重警告) 设置驱动程序为当前会话发出关键通知时的覆盖大小(以 MB 为单位)。
uwfmgr overlay Get-Consumption 显示 UWF 覆盖当前使用的空间量
uwfmgr overlay Set-Type {RAM | DISK} 将覆盖存储的类型设置为基于 RAM 或基于磁盘。 必须在当前会话中禁用 UWF,才能将覆盖类型设置为基于磁盘。
uwfmgr servicing Update-Windows (容許系统更新)
uwfmgr file add-exclusion c:\users (排除用户文件夹)
Uwfmgr.exe file add-exclusion c:\labs\report.docx
要为注册表项添加排除项:
Uwfmgr.exe registry add-exclusion “HKLM\Software\My_RegKey”
如要使用 windows 内建的防毒 (Windows Defender) 可依以下设定:
uwfmgr file add-exclusion C:\Program Files\Windows Defender
uwfmgr file add-exclusion C:\ProgramData\Microsoft\Windows Defender
uwfmgr file add-exclusion C:\Windows\WindowsUpdate.log
uwfmgr file add-exclusion C:\Windows\Temp\MpCmdRun.log
uwfmgr.exe registry add-exclusion HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender
禁用特定卷的过滤器:
uwfmgr.exe volume unprotect C:
如果需要更改系统或安装软件,先关闭 UWF 后重启。
一般场景下典型的使用方法: 使用三行命令进行简单的UWF控制,实现对C盘保护的开启和关闭。
- 配置对 C 盘的保护
uwfmgr volume protect c: - 开启保护,需重新启动计算机
uwfmgr filter enable - 关闭保护(重启后所有更改都将永久保存,安装程序或者更新)
uwfmgr filter disable
重要的: 如果由于过滤器的错误工作而导致系统无法启动,则可以通过从安装/启动磁盘启动并在脱机模式下编辑注册表来禁用过滤器:
Important. If the Windows won’t boot due to incorrect UWF filter settings, you can disable the filter by booting from the install/boot media and editing the registry offline:
Disable UWF driver autostrart by changing the value of Start parameter to 4 in the reg key HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\uwfvol;
Delete the uwfvol string in HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class{71a27cdd-812a-11d0-bec7-08002be2092f}\Lower Filters
官方文档:https://docs.microsoft.com/zh-cn/windows-hardware/customize/enterprise/unified-write-filter
延伸:
更复杂一点场景:(原文:https://zhuanlan.zhihu.com/p/446210966)
因为 UWF 在进行保护对象判定时,默认并不是针对系统盘符进行区分,而是针对 Volume ID 进行区分。在对系统镜像进行还原时,如果使用了 diskpart 重新分区,会对新的分区随机分配新的 Volume ID,导致系统还原后,UWF 并不能识别保护对象。
这种情况下,UWF不 光不能正确保护分区,还会偶发性导致系统蓝屏。解决这一问题的方法就是要让 UWF 不要使用默认的 Volume ID 区分保护对象,而是使用简单的盘符区分保护。
很遗憾的是,在微软的文档中明确表示,uwfmgr.exe 这一简单易用的 UWF 工具并不能实现上述功能,参考:https://link.zhihu.com/?target=https%3A//docs.microsoft.com/en-us/windows-hardware/customize/enterprise/uwfmgrexe 其中,最后一个函数 SetBindByDriveLetter 就是我们需要调用的功能,继续查阅文档发现,想要调用这一函数,需要使用微软的 WMI 技术。
WMI #
Windows Management Instrumentation (WMI),直译过来叫做“Windows管理插件”,诞生20余年了但一直不为外人所知,尤其在中国,研究它的人甚少,可能只有少数一些使用嵌入式 Windows 产品(XPE,WES7,WIN10 IOT)的 OEM 企业需要进行相关研究。
我个人的理解,WMI 是微软在 VB.net,C#,Powershell 三种使用环境下暴露的一系列 Windows API 接口,用户可以通过上述三种方式访问和控制 Windows 的大部分细节。这其中就包括UWF的更多深层次的功能,比如上述 UWF_Volume.SetBindByDriveLetter 功能。
我们可以使用 Powershell 来进行简单的脚本访问 WMI 函数,实现上述 OEM 需求。使用方法如下:
启用 UWF
控制面板->程序->添加关闭 Windows 特性->Decie Lockdown->Unified Write Filter
启用 C 盘保护
管理员权限打开 CMD 或者 Powershell,输入:
uwfmgr volume protect c:
uwfmgr filter enable
此时,会提示系统将在下一次重启后开启保护,暂时不要重启,继续下面操作。
调整保护绑定机制
使用 WMI 调整 UWF 保护的绑定机制,选择使用盘符而非 Volume ID 的方式进行绑定保护对象,也就是调用 UWF_Volume.SetBindByDriveLetter 函数,并传入参数 True,可以预见的是,其默认状态一定是 False,也就是说并非采用盘符方式保护。具体调用方式如下:
管理员权限打开 PowerShell
键入
$nextconfig = Get-WMIObject -class UWF_Volume -namespace root\standardcimv2\embedded | where {$.CurrentSession -eq $false};
$nextconfig
输出 $nextconfig 对象可以观察到:如图
其中显示 BindByDriveLetter 属性为 False,也就是当前处于按照 Volume ID 的方式进行保护,而不是按照盘符进行保护,那么我们下面就要进行相关函数的调用,来改变这一属性,继续在之前的 Powershell 窗体内执行脚本:
$nextconfig.SetBindByDriveLetter(1);
$nextconfig = Get-WMIObject -class UWF_Volume -namespace root\standardcimv2\embedded | where {$.CurrentSession -eq $false};
$nextconfig
上述代码执行了 SetBindByDriveLetter 函数,传入参数1,也就是 True,然后重新获取了 $nextconfig 对象,打印输出,可以发现,新的 $nextconfig 对象其 BindByDriveLetter 属性变为了 True,也就意味着,重启后 UWF 将根据盘符对 C 盘进行保护,而不再关心分区的 Volume ID 了。
到此,所有的配置结束,可以重启观察效果了。
参照上述步骤执行后的系统,可以正常使用 DISM 备份和还原系统。当 UWF 启动状态下备份的系统镜像,再次将其还原后,系统的 C 盘保护是即刻生效的,非常方便。