Запросить повышение прав UAC для Windows Vista, если путь защищен?
-
09-06-2019 - |
Вопрос
В моем приложении C# я не хочу всегда запрашивать повышение прав при запуске приложения, но если они выберут выходной путь, защищенный UAC, мне нужно будет запросить повышение прав.
Итак, как мне проверить, защищен ли путь UAC, а затем как запросить повышение прав в середине выполнения?
Решение
Лучший способ определить, не могут ли они выполнить действие, — попытаться его выполнить и поймать ошибку. UnauthorizedAccessException
.
Однако, поскольку @ДэнниСмурф правильно подмечает вы можете повысить только COM-объект или отдельный процесс.
В рамках Windows SDK Cross Technology Samples есть демонстрационное приложение под названием Демо-версия ОАК.В этом демонстрационном приложении показан метод выполнения действий с процессом с повышенными правами.Он также демонстрирует, как узнать, является ли пользователь в настоящее время администратором.
Другие советы
Для запроса повышения прав в середине выполнения необходимо либо:
- Используйте элемент управления COM с повышенными правами, который выведет приглашение
- Запустите второй процесс с повышенными правами с самого начала.
В .NET в настоящее время нет способа повысить уровень запущенного процесса;вам придется выполнить одну из хакерских операций, описанных выше, но все, что при этом будет сделано, — это создать у пользователя впечатление, что текущий процесс получает повышенные права.
Единственный способ, который я могу придумать, чтобы проверить, имеет ли путь повышенный уровень UAC, - это попытаться выполнить какую-нибудь тривиальную запись в него, пока вы находитесь в неповышенном состоянии, перехватить исключение, повысить уровень и повторить попытку.
Я не уверен, поможет ли это вам, но вы можете взглянуть на это сообщение в блоге:
http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html
Возможно, вы захотите уведомить пользователя о том, что путь защищен, и попросить его вывести файл в «более безопасную» область.Таким образом, вашему приложению не потребуется повышение прав.Я уверен, что это зависит от ваших пользователей и от того, что вы пытаетесь сделать, однако я не думаю, что это слишком любезно сообщить пользователю, что вы не чувствуете себя нормально, сбрасывая xyz в папку Windows/System32.
Если ваш дополнительный диск имеет собственные права доступа к файлам, например, на нем установлена другая копия Windows.Это подскажет.
Он также спросит, используются ли файлы, что иногда происходит, если у вас открыт проводник Windows в том же каталоге и файл выбран с помощью средства предварительного просмотра файлов, отображающего содержимое...есть и другие странности, но обычно вас спрашивают о разрешении файла, если файл используется или является конфиденциальным каталогом.
Если вы зацикливаете FolderBrowserDialog , обязательно сообщите пользователю, почему, чтобы он не злился на ваше приложение.
Примечание:это действительно воняет, нет способа .net запросить разрешение, может быть, p/invoke API Win32...?
UAC может повышать уровень объекта на основе его GUID. Это (теоретически) означает, что любой класс с GUID может быть повышен. UACDemo также должно показать, как это сделать.