У нас, похоже, есть два разных вопроса:
- Как мне обрабатывать операции, требующие повышенных привилегий?
- Если я использую отдельный процесс, как мне сказать другому процессучто делать?
Вот моя попытка ответить на них:
- Как видно из этого SO Вопрос: Windows 7 и Vista UAC - программно запрашивать повышение вC # то, что решение, как вы предложили в своем вопросе (запустить другой процесс и запросить повышение его уровня при запуске), является «правильным ответом»
- Если говорить другому процессу, что делать,вот как я бы это сделал:
Я бы начал с разделения каждого из действий, которые требовали повышенных привилегий, на их собственные программы-помощники.Эти вспомогательные программы будут выполнять только одно действие, принимая аргументы через командную строку.
Например, скажем, ваша программа должна остановить / запустить службу, я бы написал небольшую вспомогательную программу под названием servicecontroller (в действительностивы, вероятно, захотите использовать команду net ), которая принимает аргументы командной строки, подобные этой:
servicecontroller stop MyCoolService
servicecontroller start MyCoolService
Эти аргументы будут созданы программой 'Main' и переданы вместепосле нажатия «OK».
Существует несколько проблем, связанных с решением, описанным выше, которые могут вас не беспокоить:
- Вы передаете аргументы в командной строке, которыеможет быть легко обнаружен
- Вы ограничены длиной ProcessStartInfo.Argument + Путь к программе (из MSDN: Длина аргументов, добавляемых к длине полного путипроцесс должен быть меньше 2080. )
- Получение информации, передаваемой вам назад, может быть немного сложнее (если вам это нужно)
Чуть больше погуглил этот пост в блоге от DevZest , который в основном рекомендует то, что я описал выше.Удачи!
РЕДАКТИРОВАТЬ На основании дополнительных вопросов, заданных в комментариях:
- Вы бы порекомендовали запускать отдельный исполняемый файл или тот же исполняемый файл при необходимости выполнения повышенных действий?
- (я читаю между строк на этом) Как часто я должен запрашивать у пользователя эти действия?
Не зная точно, что вы здесь делаете, это мое мнениена нем:
- Я бы лично имел отдельные исполняемые файлы для каждого из этих действий, но не зная точно, что вы пытаетесь сделать, сложно сделать этот вызов.В целом, хотя кажется, что вы хотите отдельный процесс для каждого повышенного действия.
- Я немного смущен вашим вторым примером, еще раз, не зная точно, что вы пытаетесь сделать, я простоперейти на основе примеров, которые вы дали в своем комментарии.
В примере с файловым менеджером я хотел бы сделать то, что делает проводник, и сначала прокрутить каждый каталог назначения, чтобы определить, требуется ли для копирования в какое-либо место назначения повышенные привилегии.Если они это сделают, я отмечу флаг, указывающий, что действие должно быть выполнено от имени администратора, запрашивает пользователя, а затем выполняет все действие от имени администратора.
Что касается примера текстового редактора, я бы сделал что-тоаналогично описанному выше, когда пользователь дает вам проверку каталога назначения, чтобы убедиться, что у вас есть доступ на запись в это местоположение, если он не уведомляет пользователя о том, что он сохраняет данные в месте, требующем повышения прав, сохраните свою работу в доступном для записи месте (ваша программа APPDATA , вероятно, хорошее место или даже TEMP ), затем запустите процедуру копирования, которая запрашивает повышение прав. Если пользователь отменяет диалоговое окно UAC, убедитесь, что вы захватили эту отмену и удалиливременный файл.
Я бы не рекомендовал вам поддерживать рабочий процесс с повышенными правами, если вы обнаружите, что вашей программе требуется запрашивать повышение более чем несколько раз (Чтение: 1 или 2 угловых случая) в течение срока службы программ, то я бы спросил, почемуне был отмечен как всегда повышенныйМне нравится следовать правилу «наименьшего удивления», когда я предоставляю вам повышенные права, я ожидаю, что вы будете выполнять только запрашивающее его действие, а не продолжать прокачивать действия, требующие повышения, в первом запросе.Все это говорит о том, что ничто не мешает вам выполнить вышеизложенное, если вы позволите какому-либо процессу получить повышенные права, которые он может пригласить во всех своих приятелях.Исходя из вашего желания поддерживать повышенный процесс, почему бы просто не сохранить текущее состояние программы, а перезапустить программу с повышенными привилегиями и восстановить состояние?На мой взгляд, это то же самое, что рабочий процесс существует в постоянно повышенном состоянии.
Если бы вы могли рассказать нам больше о том, что именно вы пытаетесь сделать, мы могли бы найти лучшие способычтобы сделать это, не сталкиваясь с проблемами UAC.Хотя есть несколько очень веских причин для записи в области, защищенные UAC, в большинстве случаев программы не нуждаются в записи / доступе к этим расположениям.