Запросить повышение прав Windows Vista UAC, если путь защищен?

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

Итак, как мне проверить, защищен ли путь UAC, а затем как мне запросить повышение прав в середине выполнения?

Ответов (6)

Решение

Лучший способ определить, не могут ли они выполнить действие, - это попытаться выполнить его и перехватить UnauthorizedAccessException .

Однако, как правильно указывает @ DannySmurf , вы можете поднять только COM-объект или отдельный процесс.

В образцах кросс-технологий Windows SDK есть демонстрационное приложение под названием UAC Demo . Это демонстрационное приложение демонстрирует способ выполнения действий с процессом с повышенными правами. Он также демонстрирует, как узнать, является ли пользователь в настоящее время администратором.

Я не уверен, что это поможет вам, но вы можете взглянуть на это сообщение в блоге:

http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html

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

Запрос на повышение в середине выполнения требует, чтобы вы:

  1. Используйте COM-элемент управления с повышенными правами, который выведет запрос
  2. Запустите второй процесс, который повышен с самого начала.

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

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

Если у вашего вторичного диска есть собственные права доступа к файлам, например, у вас установлена ​​другая копия Windows. Это подскажет.

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

Если вы выполняете цикл FolderBrowserDialog, обязательно сообщите пользователю, почему, чтобы он не злился на ваше приложение.

Примечание: это действительно воняет, что нет способа .net запросить разрешение, возможно, p / вызвать win32 api ...?

UAC может повышать уровень объекта на основе их GUID, это (теоретически) означает, что любой класс с GUID может быть повышен, UACDemo также должен показать, как это сделать.