Лучше всего переписать приложение, чтобы использовать хранилище для каждого пользователя, если только вам не нужно что-то, сохраненное одним пользователем, чтобы повлиять на других пользователей на коробке.Таким образом, ответ «существует только один пользователь, поэтому для каждого пользователя и для одного компьютера» отклоняется.В этом случае все приложение всегда выполняется без повышенных прав, с манифестом для предотвращения виртуализации.
Следующим лучшим методом является разделение приложения.Код, который пишет в HKLM, находится в отдельном exe-файле и имеет манифест, запрашивающий повышение прав.Пользовательский интерфейс имеет некоторое предупреждение (щит на кнопке или пункте меню), где пользователь запускает этот код.Отдельный процесс запускается с ShellExecute, который учитывает манифесты.Пользовательский опыт заключается в том, что в большинстве случаев приложение работает не поднятым, а иногда кажется, что его части поднимаются, а затем снижаются.Вот как это выглядит, но на самом деле это невозможно - exe либо повышен, либо нет.Вы достигаете эффекта с двумя exe.
Третья лучшая вещь - это переместить журнал куда-то, что является одинаковым, независимо от того, подняты ли вы или нет, и обучить пользователей поднимать руки, когда это необходимо.Я не думаю, что это хорошее решение, но это лучше, чем тренировать их поднимать вручную и каждый раз записывать файл журнала в другое место.Я предполагаю, что вы пишете в «текущем каталоге», который сам находится в Program Files, и у вас нет манифеста.Тогда, когда не повышен, ваше приложение будет писать в виртуальном магазине.Если пользователям нужно искать файлы журналов, это действительно не хорошо.Пишите в другую папку - что-то под AppData было бы хорошо.Это местоположение не будет виртуализировано.
Самый простой способ определить, есть ли у вас права, - это использовать IsInRole, чтобы проверить, является ли пользователь администратором.Небольшое тестирование покажет, что даже пользователи с правами администратора возвращают false
, когда приложение не повышено, и даже не администраторы, получившие повышение с помощью OTS, возвращают true
.