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 разделами.
- Загрузочный, 500 МБ
- C:/, 45 ГБ
- неизвестно, 500MB (Boot-Backup, я думаю)
- 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)