2013-03-13 3 views
8

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

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

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

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

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

+0

Зачем нужна консольная программа для административных привилегий? –

ответ

7

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

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

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

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

+3

«Еще одна вещь, которую вы могли бы подумать, гораздо более серьезно относится к тому, почему консольному приложению нужны админы». Хорошо сказано. Это точно и точно правильный вопрос. –

+0

weel Я добавляю x509 сертификаты в хранилище Windows, читая сертификаты из магазина, получаю доступ к базе данных и подключаюсь к внешнему webservice.Is это обязательное иметь права администратора? – Marco

+0

Я также использую EventLog.WriteEntry() для регистрации ошибок в средстве просмотра событий. так что я думаю, что я прав. правильно? – Marco

0

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

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

Где% USERDOMAIN% и% USERNAME% заменяются на ваш администратор реквизитами.

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

+0

Это будет запускать приложение в качестве этого пользователя, но не будет поднимать сессию до администратора, даже если у пользователя есть права администратора. – War

22

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

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

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

+0

Отличное исправление, спасибо – Linef4ult

+0

Это должен быть ответ, гораздо более простой и простой. –