Открытие / запись файлов с правами администратора / root с использованием C ++ (UAC / gksudo / etc.) - PullRequest
0 голосов
/ 10 сентября 2009

Приложение, над которым я работаю, требует возможности редактировать определенные защищенные файлы в Linux, OSX и Windows [Vista]. Как правило, когда приложению необходимо выполнить что-то с повышенными привилегиями, появляется диалоговое окно с запросом пароля, в котором пользователю предлагается проверить, хотят ли они разрешить приложению выполнять эти операции от имени администратора.

В целом, я считаю, что в Windows Vista используются файлы манифеста, в OSX есть библиотека авторизации (https://developer.apple.com/mac/library/documentation/Security/Reference/authorization_ref/Reference/reference.html),, а в Linux - различные интерфейсы sudo.

Существует ли общепринятый кроссплатформенный способ решения этой проблемы? Я не хочу, чтобы мое приложение запускалось от имени пользователя root, но я хочу, чтобы оно могло открывать защищенный файл для операций чтения / записи, а затем возвращаться в обычный пользовательский режим.

1 Ответ

0 голосов
/ 10 сентября 2009

Для Windows Vista вам в основном нужен выделенный процесс для выполнения административных действий. Как вы упомянули, процессу с включенным администратором понадобится манифест для указания запрошенного уровня выполнения (подробности см. В этой статье MSDN ).

Если вы внимательно посмотрите на любое приложение Windows, которое запускается без повышенных прав и поддерживает само «повышение», вы увидите, что оно фактически открывает совершенно новый процесс, когда требуются административные привилегии (например, перейдите в диспетчер задач при включенном UAC нажмите «Показать процессы от всех пользователей» и обратите внимание, как он открывается с правами администратора).

Таким образом, для Windows архитектура, которая вам, вероятно, понадобится, потребует двух процессов: стандартного процесса, выполняющего большую часть работы, и процесса администратора, к которому нужно обращаться для выполнения операций администратора. Эти два процесса должны были бы взаимодействовать через некоторые безопасные средства (возможно, безопасный именованный канал ), чтобы работа администратора могла выполняться от имени стандартного процесса.

Этот подход может быть распространен на другие платформы и, возможно, может быть абстрагирован в некотором классе / интерфейсе, так что детали, специфичные для платформы, не должны просачиваться.

...