Открытие/запись файлов от имени администратора/рута с помощью C++ (UAC/gksudo/и т. д.)

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

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

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


person Michael    schedule 10.09.2009    source источник


Ответы (1)


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

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

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

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

person bobbymcr    schedule 10.09.2009