Каковы лучшие практики внедрения UAC?(.СЕТЬ) - PullRequest
13 голосов
/ 10 мая 2011

Я думаю о разработке приложения, которое большую часть времени должно запускаться от имени обычного пользователя, но для определенных операций потребуется повышенный административный доступ. Опыт пользователя должен быть таким же, как в Проводнике Windows при копировании чего-либо в защищенную папку.

Теперь вопрос, как это должно быть реализовано в .NET? Я знаю, что могут быть повышены только целые процессы или, возможно, некоторые экземпляры COM, а не отдельные функции. Но это было бы именно то, что мне нужно. По какому пути мне идти? Напишите два исполняемых файла, один с манифестом, а другой без; программно запустить тот же процесс, повышенный во второй раз; использовать какую-то вещь COM? Тогда у меня есть дополнительные привилегии, но как сказать другому процессу, что делать? Используйте .NET Remoting (что устарело / сложно?); реализовать мою собственную вещь IPC, используя сокеты / каналы / что угодно? Эта повышенная задача может потребовать от пользователя что-то спросить в середине процесса. И это должно быть отменено.

Многое говорит мне о том, как UAC работает внутри или как системные администраторы могут его настраивать, но я не нашел ничего, что отвечало бы на эти основные вопросы.

1 Ответ

3 голосов
/ 11 мая 2011

У нас, похоже, есть два разных вопроса:

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

Вот моя попытка ответить на них:

  1. Как видно из этого SO Вопрос: Windows 7 и Vista UAC - программно запрашивать повышение вC # то, что решение, как вы предложили в своем вопросе (запустить другой процесс и запросить повышение его уровня при запуске), является «правильным ответом»
  2. Если говорить другому процессу, что делать,вот как я бы это сделал:

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

Например, скажем, ваша программа должна остановить / запустить службу, я бы написал небольшую вспомогательную программу под названием servicecontroller (в действительностивы, вероятно, захотите использовать команду net ), которая принимает аргументы командной строки, подобные этой:

servicecontroller stop MyCoolService
servicecontroller start MyCoolService

Эти аргументы будут созданы программой 'Main' и переданы вместепосле нажатия «OK».

Существует несколько проблем, связанных с решением, описанным выше, которые могут вас не беспокоить:

  1. Вы передаете аргументы в командной строке, которыеможет быть легко обнаружен
  2. Вы ограничены длиной ProcessStartInfo.Argument + Путь к программе (из MSDN: Длина аргументов, добавляемых к длине полного путипроцесс должен быть меньше 2080. )
  3. Получение информации, передаваемой вам назад, может быть немного сложнее (если вам это нужно)

Чуть больше погуглил этот пост в блоге от DevZest , который в основном рекомендует то, что я описал выше.Удачи!


РЕДАКТИРОВАТЬ На основании дополнительных вопросов, заданных в комментариях:

  1. Вы бы порекомендовали запускать отдельный исполняемый файл или тот же исполняемый файл при необходимости выполнения повышенных действий?
  2. (я читаю между строк на этом) Как часто я должен запрашивать у пользователя эти действия?

Не зная точно, что вы здесь делаете, это мое мнениена нем:

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

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

Что касается примера текстового редактора, я бы сделал что-тоаналогично описанному выше, когда пользователь дает вам проверку каталога назначения, чтобы убедиться, что у вас есть доступ на запись в это местоположение, если он не уведомляет пользователя о том, что он сохраняет данные в месте, требующем повышения прав, сохраните свою работу в доступном для записи месте (ваша программа APPDATA , вероятно, хорошее место или даже TEMP ), затем запустите процедуру копирования, которая запрашивает повышение прав. Если пользователь отменяет диалоговое окно UAC, убедитесь, что вы захватили эту отмену и удалиливременный файл.

Я бы не рекомендовал вам поддерживать рабочий процесс с повышенными правами, если вы обнаружите, что вашей программе требуется запрашивать повышение более чем несколько раз (Чтение: 1 или 2 угловых случая) в течение срока службы программ, то я бы спросил, почемуне был отмечен как всегда повышенныйМне нравится следовать правилу «наименьшего удивления», когда я предоставляю вам повышенные права, я ожидаю, что вы будете выполнять только запрашивающее его действие, а не продолжать прокачивать действия, требующие повышения, в первом запросе.Все это говорит о том, что ничто не мешает вам выполнить вышеизложенное, если вы позволите какому-либо процессу получить повышенные права, которые он может пригласить во всех своих приятелях.Исходя из вашего желания поддерживать повышенный процесс, почему бы просто не сохранить текущее состояние программы, а перезапустить программу с повышенными привилегиями и восстановить состояние?На мой взгляд, это то же самое, что рабочий процесс существует в постоянно повышенном состоянии.

Если бы вы могли рассказать нам больше о том, что именно вы пытаетесь сделать, мы могли бы найти лучшие способычтобы сделать это, не сталкиваясь с проблемами UAC.Хотя есть несколько очень веских причин для записи в области, защищенные UAC, в большинстве случаев программы не нуждаются в записи / доступе к этим расположениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...