3

一段时间以来,我试图弄清楚如何正确设置这个新的 UWF(统一写入过滤器)。不幸的是,似乎只有 Win 8.1 行业的文档(此处),而不是 Win 10。我希望此后没有相关的变化。

我也在 WindowsDevCenter 上问过这个问题,但到目前为止没有得到任何回应。

这是我的问题:

通过 WMI 提供程序,我现在启用了 UWF ( UWF_Filter.Enable()),但我无法保护任何卷。

卷列表看起来也很奇怪:有 4 个条目,每个人都用CurrentSession=True.

  • 第一个是没有驱动器号的卷,只有一个卷 ID。
  • 第二个是C:
  • 然后有 2 个相同的 D: 。

通常每个卷不应该有 2 个条目,一个CurrentSession是 true,一个是 false,这意味着它是在重新启动后应用的设置?

如果我尝试Protect在 ManagementObject 上执行但DriveLetter=C:出现Access denied异常,我假设它是当前会话的对象。

此外,如果我在控制台上尝试uwfmgr.exe Volume Protect C:它只是挂起:没有反应,没有错误,只有一个永远闪烁的光标。 编辑:原来这是由另一个安装的软件引起的问题。另见下文。

在保护卷之前,我是否必须启用或禁用或执行其他任何操作?

提前致谢,

塞巴斯蒂安

我的系统:

  • Windows 10 物联网企业版 2016 LTSB x64
  • 1 个 SSD 250GB,带引导、C: 和 D:

编辑:

在这里,我问了一个后续问题以及其他一些细节和解决方法。uwfmgr.exe volume protect c:例如,如果我使用它,它可以工作,UWF_Volume 现在突然有(正确的)2 个条目C:,一个用于当前会话,一个用于下一个会话。

但是我想避免这种情况,因为恕我直言,它应该只能由 WMI 解决。

编辑 2: @sommmen

分区布局如下: 1 个磁盘有 4 个分区。

  1. 启动,500MB
  2. C:/ , 45GB
  3. 未知,500MB(我认为是引导备份)
  4. D:/ , ~200GB

PS:

请任何人都可以创建标签uwfuwfmgr?会好的 :-)

4

4 回答 4

1

在我的测试中,重新启动后经常会出现丢失的 UWF_Volume 实例。但如果没有,您可以直接使用ManagementClass.CreateInstance().

这里的问题是官方文档并不完全正确。UWF_Volume.VolumeName物业描述如下:

当前系统上卷的唯一标识符。VolumeName 与卷的 Win32_Volume 类的 DeviceID 属性相同。

来自:https ://docs.microsoft.com/en-us/windows-hardware/customize/enterprise/uwf-volume#properties

实际上,DeviceID在将其用作值之前,需要稍作修改UWF_Volume.VolumeName

DeviceID.Substring(4).TrimEnd('\\')

因此,在删除前缀\\?\并删除任何尾部斜杠后,您可以CurrentSession=false为指定设备创建实例。

这也适用于没有任何uwfmgr.exe. 虽然,官方不推荐/支持。

此外,我还无法删除实例。所以一定要添加正确的值。

完整示例:

// example value
var DeviceId_From_Win32_Volume = @"\\?\Volume{c2eac053-27e3-4f94-b28c-c2c53d5f4fe1}\";

// example value
var myDriveLetter = "C:"; 
var myDeviceId = DeviceId_From_Win32_Volume.Substring(4).TrimEnd('\\'); 

var wmiNamespace = "root\\standardcimv2\\embedded";
var className = "UWF_Volume";

var mgmtScope = new ManagementScope {Path = {NamespacePath = wmiNamespace}};
var mgmtPath = new ManagementPath(className);
var mgmtClass = new ManagementClass(mgmtScope, mgmtPath, null);

// prepare the new object
var newObj = mgmtClass.CreateInstance();
newObj.SetPropertyValue("DriveLetter", myDriveLetter);
newObj.SetPropertyValue("VolumeName", myDeviceId);
newObj.SetPropertyValue("CurrentSession", false);
newObj.SetPropertyValue("CommitPending", false);
newObj.SetPropertyValue("BindByDriveLetter", false);

// create the WMI instance
newObj.Put(new PutOptions {Type = PutType.CreateOnly});
于 2021-02-17T14:34:38.997 回答
0

我遇到了类似的问题,因为我无法使用 CurrentSession=False 查询 UWF_Volume。但是,我做的一件事似乎是“生成”了 CurrentSession=False 的 UWF_Volume 管理对象。我跑了“uwfmgr 卷保护 c:”。不幸的是,在您的情况下,运行它会导致它挂起。

您可以尝试在管理员的 cmd 中运行 uwfmgr 吗?另外,如果你运行“uwfmgr get-config”,你能得到写过滤器的当前设置吗?

您的描述中的另一件事:您说 D: 有两个相同的卷,但如果您仔细查看属性,一个是 CurrentSession=True,另一个是 CurrentSession=False。根据文档,如果要进行更改,必须选择 CurrentSession=False 的管理对象 (UWF_Volume)。

https://docs.microsoft.com/en-us/windows-hardware/customize/enterprise/uwf-volume

(向下滚动到 powershell 脚本代码示例部分)

于 2017-11-21T16:20:59.213 回答
0

回答我自己的问题:到目前为止,我只有一个解决方法,但没有真正的解决方案。

它是检查是否有一个条目,CurrentSession=False如果没有直接调用命令:

ManagementObjectSearcher ms = new ManagementObjectSearcher(_Scope, new ObjectQuery("select * from UWF_Volume where VolumeName = \"" + volId + "\" AND CurrentSession=\"False\""));
ManagementObjectCollection c = ms.Get();
UInt32 res = 1;
foreach (ManagementObject mo in c)
{
    // entry found: do it with WMI
    res = (UInt32)mo.InvokeMethod(newState ? "Protect" : "Unprotect", new object[] { });
}
if (c.Count == 1 && res == 0)
    // message: success
if (c.Count == 0)
{
    // no entry found: invoke cmd
    ProcessStartInfo info = new ProcessStartInfo("uwfmgr.exe", "volume " + (newState ? "Protect" : "Unprotect") + @" \\?\" + volId);
    Process process = new Process();
    info.Verb = "runas";  //needs admin
    process.StartInfo = info;
    process.Start();
    process.WaitForExit();
}

这样做的副作用是会在一瞬间弹出一个命令行窗口,但它仍然运行良好。

于 2019-09-12T07:13:32.197 回答
0

首先,一个卷可能有几个分区。它们将显示为具有相同的驱动器标签。

例如

C:/ //?/{some guid here}
C:/ //?/{some other guid here}

现在这对于 %systemDrive% 很常见,因为它具有引导分区。您可以使用命令

mountvol

Diskpart
List volume

找出适合您需要的 guid(或者您可以同时保护引导分区和系统分区)。同样使用 wmi,您可以查看命名空间 cimv2 下的 Win32_volume 以获得更多信息。

运行保护命令后,命令行 util UWFmgr 似乎会创建一个 UWF_VOLUME wmi 实例。文档还暗示您需要自己创建一个对象。

function Set-ProtectVolume($driveLetter, [bool] $enabled) {

# Each volume has two entries in UWF_Volume, one for the current session and one for the next session after a restart
# You can only change the protection status of a drive for the next session

    $nextConfig = Get-WMIObject -class UWF_Volume @CommonParams |
        where {
            $_.DriveLetter -eq "$driveLetter" -and $_.CurrentSession -eq $false
        };

# If a volume entry is found for the drive letter, enable or disable protection based on the $enabled parameter

    if ($nextConfig) {

        Write-Host "Setting drive protection on $driveLetter to $enabled"

        if ($Enabled -eq $true) {
            $nextConfig.Protect() | Out-Null;
        } else {
            $nextConfig.Unprotect() | Out-Null;
        }
    }

    =======> (!) im talking about this comment
# If the drive letter does not match a volume, create a new UWF_volume instance

    else {
    Write-Host "Error: Could not find $driveLetter. Protection is not enabled."
    }
}

但是,文档没有提供执行此操作的方法。现在看来我们需要使用命令行工具,直到有人有使用 WMI 提供程序的示例。

于 2018-10-17T11:50:16.753 回答