У меня есть требование, чтобы выполнить несколько команд с повышенными правами, что-то вроде:Execute несколько возвышенных команд в оболочке (или аналогичной)
- программы вызова, который модифицирует .config файл службы (требуется права администратора)
- чистая остановка MyService (требуется права администратора)
- чистый старт MyService (требуется права администратора)
Все это динамическое, е. г. первая строка может содержать настройки прокси, включая имя пользователя и пароль, или любую другую модификацию файла настроек. (Файл настроек находится в папке программы, программа для изменения файла настроек предоставляется извне. Фактическая информация будет вводиться пользователем через графический интерфейс.)
Я думал создать очень гибкое решение, используя cmd.exe-процесс с перенаправлен stdin и stdout. Но .. это похоже на «runas» (требуется ShellExecute), а перенаправленные входы/выходы являются эксклюзивными.
(Также я заметил, что перенаправление и cmd.exe довольно сложно обрабатывать. это означает, что у вас есть текст в строке, такой как c: \ bla>, но нет NewLine. Тем не менее, не зная, что получается в результате, затрудняет запись чего-то общего.)
Есть 3 альтернативы, которые я могу думать из:
- получить приглашение UAC для каждой команды (я не хотел бы, что)
- запустите процесс, который будет повышен, это может затем вызвать все, что ему нужно -> нужен дополнительный проект (.exe), который я бы хотел избежать, также затрудняет развертывание (дополнительный файл)
- создать пакетный файл на летать, поднять его. Этого я также хочу избежать, поскольку в этом файле может быть информация о пароле в виде обычного текста (например, пользователь/пароль для прокси). Я бы по крайней мере должен был обязательно перезаписать его содержимое, а затем удалить его.
Как с этим справиться?
Правда о запуске/остановке сети, я мог бы просто использовать System.ServiceProcess.ServiceController. Использование командной строки здесь было всего лишь идеей, так как я хотел использовать параметр cmd. Я бы не хотел запускать приложение, из-за которого мой код будет работать, поскольку он огромен, поэтому небольшое, отдельное приложение было бы наименее плохим решением. Кроме того, поскольку у меня нет (короткого google) надежного способа избавиться от временного файла, всегда можно заблокировать его, пока я хочу его удалить, или, наоборот, приложение может потерпеть крах в худшем случае. –
@ AndreasReiff Я не уверен, что вам следует беспокоиться о повторном запуске одного и того же исполняемого файла.Не имеет значения, что он огромен. Он уже работает. Это уже смело, части его уже в памяти. Не должно быть проблемой. Помните, что в любом случае будет отображаться пауза в диалоговом окне UAC. –