Возможно, файл журнала создан с повышенными привилегиями. - PullRequest
1 голос
/ 09 ноября 2010

У меня есть очень старое приложение, которое теперь должно быть дружественным к Windows Server 2008. Это пользовательское приложение, которое работает как синглтон.Он использует часть реестра HKLM для чтения и записи конфигурации и создает файлы журналов.

Основной вопрос: как заставить приложение работать с UAC в соответствии с передовой практикой?

Мои начальныеПодход заключается в том, чтобы запускать приложение без повышенных прав, и, если необходимо изменить конфигурацию, пользователь вручную перезапускает его с повышенными правами, реконфигурирует и перезапускает без повышенных прав.Проблема в том, что файл журнала затем может быть создан с повышенными правами, и тогда приложение без повышенных прав не может записывать в него данные.Возможные обходные пути:

  1. Не выполняйте в повышенном режиме ничего, что подразумевало бы запись в файл журнала.Но как определить, находится ли приложение в режиме повышенных прав?
  2. Создать файл журнала с непривилегированными правами даже в режиме повышенных прав.Как?
  3. Если доступ запрещен при открытии существующего файла журнала, попробуйте создать другой файл журнала.
  4. Запускать с повышенными правами постоянно.

Первый вариант лучшеглядя так далеко, но как определить высоту?Может быть, есть какой-то другой вариант?Может быть, есть какой-то совершенно другой подход?Я бы не хотел слишком сильно менять код, если это возможно.

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Лучше всего переписать приложение, чтобы использовать хранилище для каждого пользователя, если только вам не нужно что-то, сохраненное одним пользователем, чтобы повлиять на других пользователей на коробке.Таким образом, ответ «существует только один пользователь, поэтому для каждого пользователя и для одного компьютера» отклоняется.В этом случае все приложение всегда выполняется без повышенных прав, с манифестом для предотвращения виртуализации.

Следующим лучшим методом является разделение приложения.Код, который пишет в HKLM, находится в отдельном exe-файле и имеет манифест, запрашивающий повышение прав.Пользовательский интерфейс имеет некоторое предупреждение (щит на кнопке или пункте меню), где пользователь запускает этот код.Отдельный процесс запускается с ShellExecute, который учитывает манифесты.Пользовательский опыт заключается в том, что в большинстве случаев приложение работает не поднятым, а иногда кажется, что его части поднимаются, а затем снижаются.Вот как это выглядит, но на самом деле это невозможно - exe либо повышен, либо нет.Вы достигаете эффекта с двумя exe.

Третья лучшая вещь - это переместить журнал куда-то, что является одинаковым, независимо от того, подняты ли вы или нет, и обучить пользователей поднимать руки, когда это необходимо.Я не думаю, что это хорошее решение, но это лучше, чем тренировать их поднимать вручную и каждый раз записывать файл журнала в другое место.Я предполагаю, что вы пишете в «текущем каталоге», который сам находится в Program Files, и у вас нет манифеста.Тогда, когда не повышен, ваше приложение будет писать в виртуальном магазине.Если пользователям нужно искать файлы журналов, это действительно не хорошо.Пишите в другую папку - что-то под AppData было бы хорошо.Это местоположение не будет виртуализировано.

Самый простой способ определить, есть ли у вас права, - это использовать IsInRole, чтобы проверить, является ли пользователь администратором.Небольшое тестирование покажет, что даже пользователи с правами администратора возвращают false, когда приложение не повышено, и даже не администраторы, получившие повышение с помощью OTS, возвращают true.

1 голос
/ 09 ноября 2010

UAC - довольно драматическое изменение;пытаясь подать ваше заявление, чтобы оно соответствовало после того, как факт чреват опасностью.Разве не было бы проще изменить расположение реестра и файлов журналов с машинных областей на пользовательские?например, HKCU и CSIDL_APPDATA.Если это не сработает для вас, тогда пользователям просто придется запускать ваше приложение с повышенными правами;Вы можете указать манифест requireAdministrator.

...