Установите программу, которая должна быть запущена от имени администратора
Предыстория: я ни в коем случае не эксперт по безопасности windows / пользовательским разрешениям. У меня есть приложение (написанное на C#), которое должно быть в состоянии записывать / удалять файлы и папки в своем корневом каталоге, записывать / удалять файлы в другом месте на диске, записывать/изменять значения в системном реестре (локальная машина) и запускать и останавливать другие приложения и службы. Я считаю, что мне нужны права администратора по крайней мере для некоторых из этих действий.
Я попробовал запустить это и дальше компьютеры с выключенным UAC отлично работают без каких-либо дополнительных настроек. Однако на компьютерах с включенным UAC (любой уровень выше "никогда не уведомлять" в Windows 7) это приведет к сбою. Мне нужно, чтобы он работал на всех компьютерах.
До сих пор я просто вручную проверял флажок "запустить эту программу от имени администратора", и все было бы хорошо. Однако теперь мы решили, что позволим клиентам устанавливать это программное обеспечение самостоятельно, и оно должно работать "из коробки".
У меня есть проект развертывания в Visual Studio 2008, который устанавливает все и записывает необходимые данные запуска в реестр. Теперь мне нужно установить флаг "запуск этой программы от имени администратора". Я предполагаю, что это не так просто, как мне бы хотелось.
Так как же правильно это делать? Эта программа запускается при запуске, и было бы раздражающе для наших клиентов, если бы UAC всплывал (и, возможно, затемнял экран) каждый раз, когда они перезагружают свой компьютер.
Спасибо спасибо тебе за помощь.
EDIT: Спасибо за ваши ответы. Я понимаю, что работа вокруг UAC будет неодобрительно воспринята, и я вижу, что Microsoft не поддерживает "Белые списки", поэтому она попросит разрешения только один раз. Это прекрасно, я могу уважать это, однако у меня есть некоторые последующие вопросы:
-
Вы можете предоставить мне ссылку, которая покажет мне, как правильно поднять программу, чтобы исправить повышенное состояние? Есть ли какая-либо литература о том, какие существуют варианты, и т.д... В основном я хотел бы получить руководство по UAC 101.
-
Есть ли способ повысить статус безопасности, когда мне нужны дополнительные привилегии (и только тогда запрашивать с помощью UAC). В основном это приложение работает в фоновом режиме, в основном ничего не делая большую часть времени. Время от времени он будет проверять некоторые файлы (на этом этапе мне потребуется возможность записи на диск и чтения реестра (только чтение нормально на этом этапе), однако, поскольку это временная папка, не имеет значения, где я буду поставить его. Если есть место, где приложение может писать без каких-либо привилегий, это было бы идеально.)
Однако в какой-то момент мне нужно будет предварительно сформировать все остальные задачи (пользователь должен подтвердить это действие в любом случае), так что если UAC предложит в этот момент, это не будет проблемой. Есть ли способ поднять его только на этом этапе, а затем вернуть его к разрешениям по умолчанию?
-
Будет ли такое решение работать с более старыми версиями Windows, включая Vista и Xp (и может быть, старше?) Что нужно сделать, чтобы это сработало?
3 ответа:
Правильный способ заключается в повышении при запуске программы, с помощью подсказки UAC (которую вы можете установить через манифест программы) - попытка быть умным и обойти его неодобрительно.
Подумайте об этом - если бы вы могли установить что-то, что поднималось бы автоматически без подсказки UAC ... в чем будет смысл ОАК?
Чтобы добавить манифест UAC в программу, вы просто добавляете манифест в проект и редактируете его. Пример манифеста для UAC - это здесь. Если вы хотите поднимите в последний возможный момент, тогда вам нужен отдельный процесс возрождения - вы не можете поднять существующий процесс. Так что отделите этот бит, а затем начните его с помощью
Process.StartInfo.UseShellExecute = true; Process.StartInfo.Verb = "runas";
Вам нужно переосмыслить, как работает ваше приложение. Вы совершенно правы, что было бы раздражающе отображать запрос на повышение при входе в систему. Так что не делай этого. С другой стороны, у вас вполне могут быть задачи, которые вам необходимо выполнить с помощью административного доступа.
Итак, у вас есть два варианта:
Измените свои задачи так, чтобы они больше не требовали административного повышения (например, напишите ваши файлы в другом месте).
- разбейте приложение на компонент службы Windows и пользователя элемент интерфейса. Компонент службы может работать под учетной записью с повышенными правами (будем надеяться, чтонаименее -повышенная учетная запись, необходимая для выполнения задач, которые вам необходимо выполнить). Компонент пользовательского интерфейса может при необходимости обращаться к сервису (через именованные каналы или аналогичные каналы).
Вы можете разделить вашу программу на два компонента:
- пользовательское приложение, работающее без повышения прав
- служба Windows, которая отвечает за задачи, требующие повышения прав
Поскольку вы используете .NET, связь между компонентами, вероятно, проще всего осуществлять с помощью WCF.
И в качестве дополнительного Примечания: программно изменять файлы под C:\Program файлы не считается хорошей практикой и может привести к ряду других проблем. Windows имеет выделенные места для хранения настроек конфигурации и других программных данных.