Как сделать так, чтобы консольное приложение всегда запускалось от имени администратора?

У меня есть консольное приложение, которое было разработано для вызова программного обеспечения ERP.

Они вызывают мое приложение внутри erp, и когда они делают это, я всегда получаю ошибки, связанные с недостаточным разрешением для этого.

Я установил флажок "запускать эту программу как администратор" в свойствах exe для всех пользователей, но результат тот же.

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

Может кто-нибудь объяснить мне, как заставить это консольное приложение всегда запускаться от имени администратора?

3 ответа

Решение

Во-первых, поймите, что в какой-то момент этого процесса БУДЕТ диалог UAC. Нет способа избежать этого. Есть несколько подходов, которые вы можете использовать:

  • Пусть люди запускают программное обеспечение ERP с повышенными правами. Я включил это только для полноты. Ужасно соглашаться на приглашение UAC каждый раз, когда вы запускаете приложение, когда вам обычно не нужны полномочия. Тем не менее, это был бы удобный быстрый тест для подтверждения того, что если ваше приложение будет повышено, все будет работать. Все, что запускается из процесса с повышенными правами, повышается, поэтому, если ваше приложение все еще получает сообщение об ошибке, это не то, что вы исправите с помощью повышения.
  • Измените код в приложении ERP, чтобы запустить ваше приложение с повышенными правами. Вы упоминаете C#. Бери с runas глагол это подход здесь. Это ложится бременем на разработчика ERP, и они могут быть не в состоянии это сделать.
  • Добавьте манифест в ваше приложение. Вы можете встроить его, или, если ваше приложение называется foo.exe, просто вручную создайте файл foo.exe.manifest с соответствующим требуемым значением ExecutionLevel. Чтобы встроить его, используйте страницу "Свойства" вашего проекта C#, чтобы выбрать правильный тип манифеста. Убедитесь, что вы запустили с UseShellExecute установите в значение true, иначе манифест будет игнорироваться.

Если вы выберете первый вариант, запрос UAC будет отображаться каждый раз при запуске приложения ERP. Нехорошо. Если вы выберете второе или третье, запрос UAC будет появляться каждый раз, когда ваше консольное приложение запускается из приложения ERP. Вероятно, приемлемо.

Еще одна вещь, которую вы могли бы рассмотреть, - это более серьезно изучить, почему консольное приложение нуждается в привилегиях администратора. Вы пишете в корень C или в Program Files? Вы обновляете ключ реестра в HKLM? Что бы вы ни делали, почему вы так делаете? Если ваше приложение не устанавливает или не настраивает что-либо (в этом случае получение приглашения UAC является хорошим и правильным), вы должны попытаться адаптировать его так, чтобы оно записывалось в хранилище перед пользователем и не требовало повышения прав. Тогда вы больше не будете беспокоиться о том, как запустить его с повышенными правами, в любом случае.

Добавьте в свой проект файл манифеста приложения (Добавить -> Новый элемент -> Общие -> Файл манифеста приложения) и добавьте следующий узел в app.manifest:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

http://msdn.microsoft.com/en-us/library/windows/desktop/bb756929.aspx

Создать командный файл, содержащий что-то вроде:

runas /env /user:%USERDOMAIN%\%USERNAME% cmd.exe /K YourProgramName.exe

Где%USERDOMAIN% и%USERNAME% заменяются данными вашей учетной записи администратора.

И запустить это вместо?

Другие вопросы по тегам