2014-02-18 4 views
0

У меня есть требование, чтобы выполнить несколько команд с повышенными правами, что-то вроде:Execute несколько возвышенных команд в оболочке (или аналогичной)

  1. программы вызова, который модифицирует .config файл службы (требуется права администратора)
  2. чистая остановка MyService (требуется права администратора)
  3. чистый старт MyService (требуется права администратора)

Все это динамическое, е. г. первая строка может содержать настройки прокси, включая имя пользователя и пароль, или любую другую модификацию файла настроек. (Файл настроек находится в папке программы, программа для изменения файла настроек предоставляется извне. Фактическая информация будет вводиться пользователем через графический интерфейс.)

Я думал создать очень гибкое решение, используя cmd.exe-процесс с перенаправлен stdin и stdout. Но .. это похоже на «runas» (требуется ShellExecute), а перенаправленные входы/выходы являются эксклюзивными.

(Также я заметил, что перенаправление и cmd.exe довольно сложно обрабатывать. это означает, что у вас есть текст в строке, такой как c: \ bla>, но нет NewLine. Тем не менее, не зная, что получается в результате, затрудняет запись чего-то общего.)

Есть 3 альтернативы, которые я могу думать из:

  1. получить приглашение UAC для каждой команды (я не хотел бы, что)
  2. запустите процесс, который будет повышен, это может затем вызвать все, что ему нужно -> нужен дополнительный проект (.exe), который я бы хотел избежать, также затрудняет развертывание (дополнительный файл)
  3. создать пакетный файл на летать, поднять его. Этого я также хочу избежать, поскольку в этом файле может быть информация о пароле в виде обычного текста (например, пользователь/пароль для прокси). Я бы по крайней мере должен был обязательно перезаписать его содержимое, а затем удалить его.

Как с этим справиться?

ответ

1

Я думаю, что вы уже поставили диагноз и перечислили доступные варианты. На мой взгляд, лучший вариант - использовать runas, чтобы создать новый повышенный процесс и получить этот процесс для выполнения этой работы.

Другой процесс не должен быть другим исполняемым файлом, так как ваш существующий исполняемый файл может быть запущен с определенными аргументами командной строки. Когда у вас будет еще один процесс с повышенным уровнем, вы можете использовать cmd с перенаправленным stdin/stdout для выполнения работы. Однако зачем использовать net stop/start, а не API сервисов? И можете ли вы сделать модификацию файла .config без запуска отдельного процесса?

+0

Правда о запуске/остановке сети, я мог бы просто использовать System.ServiceProcess.ServiceController. Использование командной строки здесь было всего лишь идеей, так как я хотел использовать параметр cmd. Я бы не хотел запускать приложение, из-за которого мой код будет работать, поскольку он огромен, поэтому небольшое, отдельное приложение было бы наименее плохим решением. Кроме того, поскольку у меня нет (короткого google) надежного способа избавиться от временного файла, всегда можно заблокировать его, пока я хочу его удалить, или, наоборот, приложение может потерпеть крах в худшем случае. –

+0

@ AndreasReiff Я не уверен, что вам следует беспокоиться о повторном запуске одного и того же исполняемого файла.Не имеет значения, что он огромен. Он уже работает. Это уже смело, части его уже в памяти. Не должно быть проблемой. Помните, что в любом случае будет отображаться пауза в диалоговом окне UAC. –