UWF_Volumes не имеет записей с CurrentSession=False

С некоторых пор я пытаюсь выяснить, как правильно настроить этот новый UWF (Unified Write Filter). К сожалению, похоже, что есть только документация для индустрии Win 8.1 ( здесь), но не для Win 10. Надеюсь, с тех пор не было никаких соответствующих изменений

Я также спросил об этом в WindowsDevCenter, но пока не получил ответа.

Вот моя проблема:

С провайдерами WMI я уже включил UWF (UWF_Filter.Enable()), но я не могу защитить любой объем.

Также список громкости выглядит очень странно: там 4 записи, все с CurrentSession=True,

  • Первый - для тома без буквы диска, только идентификатор тома.
  • Второй для C:
  • и тогда есть 2 идентичных для D: .

Обычно не должно быть 2 записей на том, один где CurrentSession Это правда, а где ложь, то есть настройки, применяемые после перезагрузки?

Если я попытаюсь выполнить Protect на объект управления с DriveLetter=C: Я получаю Access denied исключение, я предполагаю, потому что это объект для текущего сеанса.

Также если я попробую uwfmgr.exe Volume Protect C: на консоли просто висит: нет реакции, нет ошибки, только вечно мигающий курсор. РЕДАКТИРОВАТЬ: оказалось, что это проблема, вызванная другим установленным программным обеспечением. Смотрите также ниже.

Нужно ли включать, отключать или делать что-либо еще, прежде чем я смогу защитить тома?

Заранее спасибо,

Себастьян

Моя система:

  • Windows 10 IOT Enterprise 2016 LTSB x64
  • 1 SSD 250 ГБ с загрузкой, C: и D:

Редактировать:

Здесь я задал дополнительный вопрос с некоторыми другими деталями и обходным путем. Если я использую uwfmgr.exe volume protect c: например, это работает, и UWF_Volume теперь внезапно имеет (правильные) 2 записи для C: один для текущего и один для следующего сеанса.

Однако я хочу избежать этого, потому что ИМХО это должно решаться только WMI.

Редактировать 2: @sommmen

Структура разделов следующая: Один диск с 4 разделами.

  1. Загрузочный, 500 МБ
  2. C:/, 45 ГБ
  3. неизвестно, 500MB (Boot-Backup, я думаю)
  4. D: /, ~ 200 ГБ

PS:

Пожалуйста, кто-нибудь может создать теги uwf а также uwfmgr? Было бы здорово:-)

4 ответа

Мне удалось создать недостающие экземпляры через WMI.

Хотя в моих тестах после перезагрузки часто появлялись отсутствующие экземпляры UWF_Volume. Но если нет, вы можете создать их напрямую, используя ManagementClass.CreateInstance().

Проблема здесь в том, что официальные документы не совсем верны. Описание собственности:

Уникальный идентификатор тома в текущей системе. VolumeName совпадает со свойством DeviceID класса Win32_Volume для тома.

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

Фактически, DeviceID нуждается в небольшой модификации, прежде чем использовать его в качестве значения для UWF_Volume.VolumeName:

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

Итак, после удаления префикса \\?\ и удалив любые завершающие косые черты, вы можете создавать экземпляры с CurrentSession=false для указанного устройства.

Это также работает в Windows 10 Pro без каких-либо uwfmgr.exe. Хотя официально не рекомендуется / не поддерживается.

Кроме того, мне еще не удалось удалить экземпляры. Поэтому обязательно добавляйте только правильные значения.

Полный пример:

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

var myDriveLetter = "C:"; // example value
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});

Чтобы ответить на мой собственный вопрос: пока у меня есть только обходной путь, но нет реального решения.

Это проверить, есть ли запись с 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();
}

Это имеет побочный эффект: на долю секунды выскакивает окно командной строки, но, тем не менее, оно работает хорошо.

Прежде всего том может иметь несколько разделов. Они будут отображаться как имеющие одинаковую метку диска.

например

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

Теперь это характерно для%systemDrive%, потому что у него есть загрузочный раздел. Вы можете использовать команды

mountvol

а также

Diskpart
List volume

Чтобы определить правильный гид для ваших нужд (или вы можете защитить как загрузочный раздел, так и системный раздел). Также с помощью wmi вы можете взглянуть на Win32_volume в пространстве имен cimv2, чтобы получить больше информации.

Утилита командной строки UWFmgr, кажется, создает экземпляр wmi UWF_VOLUME после запуска команды защиты. Документы также намекают на то, что вам нужно создать объект самостоятельно.

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.

Я испытываю похожую проблему в том, что я не мог запросить UWF_Volume с CurrentSession=False. Однако есть одна вещь, которую я сделал, которая, кажется, "генерирует" объект управления UWF_Volume с CurrentSession=False. Я запустил "UWFMGR том защиты C:". К сожалению, в вашем случае это приводит к зависанию.

Не могли бы вы попробовать запустить uwfmgr в cmd в админке? Кроме того, если вы запустите "uwfmgr get-config", сможете ли вы получить текущие настройки фильтра записи?

Еще одно из вашего описания: вы сказали, что для D: есть два одинаковых тома, но если вы внимательно посмотрите на свойства, то будет CurrentSession=True, а другой CurrentSession=False. Согласно документации, если вы хотите внести изменения, вы должны выбрать объект управления (UWF_Volume) с CurrentSession=False.

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

(прокрутите вниз до раздела примера кода сценария powershell)

Другие вопросы по тегам