Куда писать в реестр Windows общие данные при включенном UAC?
Начиная с Windows Vista в данной ОС появился User Account Control, который, будучи включенным, запрещает писать в ветку реестра HKLM даже приложениям, запущенным администратором. Наше приложение хранило общие настройки (независимые от пользователей) в HKLM\Software\OurCompany\OurProduct\Settings. Теперь туда писать нельзя. Писать в HKCU не хочется — общие настройки едины для всех пользователей.
Вопрос: так куда же писать? Где-то есть раздел, доступный на чтение и запись для всех пользователей? (Просьбе не предлагать писать в файлы — на то есть причины).
Вообще то применение таких настроек должно всегда спрашивать разрешения у администратора (через UAC). Но если очень хочется — можете нарушить гайдлайны и просто поменяйте ACL-ы для своего ключа в HKLM во время инсталляции.
За это о Вас когда нибудь напишут в The Old New Thing
Да вот прям на MSDN и почитать. Вместо Get/SetNamedSecurityInfo можно использовать Get/SetSecurityInfo на уже открытом объекте.
Можно еще посмотреть как это делают другие. В частности хром. Вот как раз функция AddAccessToKernelObject — практически то, что надо. Можно выбросить обработку «WinSelfSid» (у Вас все равно скорее всего будет WinBuiltinUsersSid), заменить NO_INHERIT на INHERIT_ONLY_ACE (собственно ради наследования это все и затевается), в остальном — без изменений (ключи реестра являются «kernel object»-ами)
Если настройки неизменны для всего времени пользования приложением, то писать их надо с помощью инсталлятора. Инсталлятор в любом случае просит элевацию прав через UAC.
Если эти настройки кто-то из пользователей захочет менять, то это повлияет на всех остальных пользователей данного компьютера и данной программы. Поэтому без UAC опять же никуда — пользователь должен осознавать, что он делает.
Ответ — никак. Дружите с UAC и не придумывайте костыли.
Настройки пишутся инсталлятором, но в дальнейшем могут меняться. И задача именно как раз в том, что когда 1 пользователь что-то изменит — эти изменения применились для всех. В этом и задача. И я не понимаю почему «ответ-никак» и почему это «костыли». Есть же в Windows папка AppData, куда могут писать файлы все пользователи, есть shared-папки, неужели нету доступного на запись общего ключа реестра?
Вернее, я даже не так выразился — Vista UAC Guide утверждает, что он точно есть. Они ссылаются на него как на %AllUsers% — но точный путь нигде не указан. Может кто-то знает?
Костыли это потому, что если один юзер меняет глобальную настройку это влияет на ВСЕХ. Для того UAC и думан, чтобы такие действия не были деструктивными и были осознанными.
Если вам действительно нужно сделать так (что я считаю в корне не верным), то во время инсталляции сделайте новую ветку в HKLM и поменяйте на неё права доступа для всех. Вот и всё. Глобального такого места из коробки я не знаю.
С виртуализацией все прекрасно. Только вот она не работает для не-визуальных приложений. А у нас такое. И еще ее обещают в будущих версиях убрать, так что это в любом случае не выход.
можно, но в коде несколько сотен различных параметров сохраняется в определенных узлах и ключах реестра. Перенести корень в другое место реестра — одна строка, переделывать на работу с файлом — день работы минимум. Да и просто как-то исторически так сложилось — в аппдата у нас кеш, файлы данных, а настройки — в реестре.