Установите программу, которая должна быть запущена от имени администратора - PullRequest
3 голосов
/ 10 февраля 2010

Справочная информация: Я ни в коем случае не эксперт по безопасности Windows / правам пользователя. У меня есть приложение (написанное на C #), которое должно иметь возможность записывать / удалять файлы и папки в своем корневом каталоге, записывать / удалять файлы в другом месте на диске, записывать / изменять значения в системном реестре (локальный компьютер) и запускать & остановите другие приложения и службы. Я полагаю, что мне нужны права администратора по крайней мере для некоторых из этих действий.

Я попытался запустить это, и на компьютерах с выключенным UAC он прекрасно работает без каких-либо дополнительных настроек. Однако на компьютерах с включенным UAC (любой уровень выше «никогда не уведомлять» в Windows 7) произойдет сбой. Мне нужно, чтобы он работал на всех компьютерах.

До сих пор я бы просто вручную устанавливал флажок "запускать эту программу от имени администратора", и все было бы в порядке. Однако теперь мы решили, что мы позволим клиентам устанавливать это программное обеспечение самостоятельно, и оно должно запускаться «из коробки».

У меня есть проект развертывания в Visual Studio 2008, который устанавливает все и записывает необходимые данные запуска в реестр. Теперь мне нужно установить флаг «Запустить эту программу от имени администратора». Полагаю, это не так просто, как хотелось бы.

Так каков правильный способ сделать это? Эта программа запускается при запуске, и нашим клиентам будет неприятно, если UAC будет появляться (и, возможно, затемнять экран) каждый раз, когда они перезагружают свой компьютер.

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы. Я понимаю, что работа с UAC будет осуждена, и я вижу, что Microsoft не поддерживает «белые списки», поэтому она будет запрашивать разрешение только один раз. Это нормально, я могу это уважать, однако у меня есть несколько дополнительных вопросов:

  • Можете ли вы предоставить мне ссылку, которая покажет мне, как правильно поднять программу до исправления повышенного состояния? Есть ли какая-нибудь литература о том, какие варианты и т. Д ... В основном я хотел бы руководство UAC 101.

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

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

  • Будет ли такое решение работать с более старыми версиями Windows, включая Vista и Xp (и, возможно, с более старыми версиями?), Что потребуется для его работы?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2010

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

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

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

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";
0 голосов
/ 10 февраля 2010

Вы можете разбить вашу программу на два компонента:

  • пользовательское приложение, работающее без повышения прав
  • служба Windows, отвечающая за задачи, требующие повышения прав

Поскольку вы используете .NET, связь между компонентами, вероятно, проще всего сделать с помощью WCF.

И в качестве примечания: программное изменение файлов в C: \ Program Files не считается хорошей практикой и может привести к ряду других проблем. Windows имеет специальные места для хранения настроек конфигурации и других данных программы.

0 голосов
/ 10 февраля 2010

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

Итак, у вас есть два варианта:

  • Измените ваши задачи, чтобы они больше не требовали повышения прав администратора (например, запишите свои файлы в другом месте).
  • Разбейте ваше приложение на компонент службы Windows и компонент пользовательского интерфейса. Служебный компонент может работать под учетной записью с повышенными правами (надеюсь, учетная запись с повышенными правами минимум , необходимая для выполнения задач, которые необходимо выполнить) При необходимости компонент пользовательского интерфейса может общаться со службой (через именованные каналы или аналогичные).
...