У меня есть набор приложений С# (v2), и я борюсь с виртуализацией реестра в Win7 (и в меньшей степени Vista).
У меня есть общая область настройки реестра, которую мои приложения должны получить в HKLM\Software\Company... До Vista все было просто записано и прочитано из этого места по мере необходимости.
В коде надлежащим образом обнаружены ошибки записи в этот раздел реестра и будет соответствующим образом отступать (вместо этого записывать в HKCU и уведомлять пользователя о том, что применяемые им настройки влияют только на текущего пользователя).
В Vista виртуализация реестра нарушила все это, потому что проверка доступа, которую мы использовали для записи HKLM, будет "безуспешно" и виртуализируется в HKCR\VirtualStore\Machine... вместо этого. В этом случае пользователь подумает, что они сохранили конфигурацию в машинном масштабе, но вместо этого были записаны только в виртуальный магазин.
К сожалению, даже попытка перечислить разрешения для ключа реестра HKLM явно возвращает результаты, указывающие, что у пользователя есть доступ, независимо от того, делают они это или нет.
Когда мы добавили поддержку Vista, обходной путь, который мы использовали, заключался в том, чтобы выполнить пробную запись в HKLM... и затем проверить HKCR\VirtualStore\Machine... для того же значения и отметить, что виртуализация произошла, если значение было найдено.
Win7, похоже, сломал это (снова), потому что запросы против явного виртуального местоположения (HKCR) теперь показывают объединенные результаты из местоположения HKLM, даже если запись не была виртуализована.
Есть ли у кого-нибудь предложения по работе над этим?
Ограничения: - Мне нужно решение, которое работает без требования высоты (когда у меня нет прав на уровне администратора, я откажусь от конфигурации для каждого пользователя в HKCU, но мне нужно будет надежно определить этот случай).
-
Он должен работать с приложением v2 С# (Один из вариантов, который я видел для кода на С++, - это встроенный манифест, который отключает виртуализацию для .exe, но я не смог это сделать в С# V2 отключить виртуализацию папок в окнах).
-
Он должен работать без "установщика" (это исключает возможность отключения виртуализации в разделе реестра, в котором нам нужна команда REG FLAGS...).