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

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

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

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

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

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


person Marco    schedule 13.03.2013    source источник
comment
Зачем этой консольной программе нужны права администратора?   -  person Bill_Stewart    schedule 13.03.2013


Ответы (3)


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

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

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

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

person Kate Gregory    schedule 13.03.2013
comment
Еще одна вещь, которую вы могли бы рассмотреть, — это более серьезно изучить, почему консольному приложению нужны права администратора. Хорошо сказано. Это точно и именно правильный вопрос, который нужно задавать. - person Bill_Stewart; 13.03.2013
comment
Хорошо, я добавляю сертификаты x509 в магазин Windows, читаю сертификаты из хранилища, получаю доступ к базе данных и подключаюсь к внешнему веб-сервису. Обязательно ли это иметь права администратора? - person Marco; 14.03.2013
comment
я также использую EventLog.WriteEntry() для регистрации ошибок в средстве просмотра событий. поэтому я думаю, что мне действительно нужны права администратора. правильно? - person Marco; 14.03.2013
comment
доступ к базе данных, подключение к веб-сервису и запись в журнал событий ОПРЕДЕЛЕННО не требуют прав администратора. Создание журнала событий в первый раз подходит. Не уверен насчет сертификатов, но стоит посмотреть - person Kate Gregory; 14.03.2013
comment
хорошо, запись в журнал событий требует повышенных привилегий. Я удалил эту строку кода и теперь веду журнал непосредственно в базу данных. теперь это работает. спасибо, что указали мне правильное направление. - person Marco; 14.03.2013

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

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

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

person Alexey    schedule 13.03.2013
comment
Это должен быть ответ, гораздо более прямой и простой. - person James Esh; 09.05.2017
comment
Что эквивалентно C++? Я не могу найти этот элемент Application Manifest File для консольного приложения C++. - person kakyo; 17.09.2019

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

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

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

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

person AnthonyLambert    schedule 13.03.2013
comment
Это запустит приложение от имени этого пользователя, но не повысит уровень сеанса до уровня администратора, даже если у пользователя есть права администратора. - person War; 09.12.2016