Java GetRuntime (). Exec EXE, который требует UAC

1

Итак, у нас есть java-процесс, который работает как служба Windows. Он должен выполнить команду с Runtime.getRuntime().exec(command). Для выполнения команды требуется UAC. Это на сервере Windows 2008 и похоже, что вы не можете отключить UAC для одного исполняемого файла, так есть ли другой способ сделать эту работу?

Показать ещё 1 комментарий
Теги:
uac
windows-server-2008
runtime.exec

1 ответ

5
Лучший ответ

Если ваше приложение Java работает как служба Windows, оно скорее всего работает под одной из системных учетных записей: SYSTEM (наиболее вероятно), LOCAL SERVICE или NETWORK SERVICE. Таким образом, если служба работает под учетной записью SYSTEM, все, что вы начинаете с службы, наследует учетную запись. В любом случае ваша служба должна иметь возможность взаимодействовать с Desktop.

Подводя итог, если ваш процесс работает как повышенный, то запущенные из него процессы также будут работать с повышенным уровнем.


Чтобы поднять, вы должны использовать ShellExecute или ShellExecuteEx функций Windows API. Если запускаемый .exe помечен level=requireAdministrator в манифесте, оболочка отобразит диалог UAC. Если он не отмечен, вы можете использовать runas verb/operation для принудительного подтверждения подтверждения UAC. Примечание: runas в Windows XP отобразится диалоговое окно "Запуск от имени другого пользователя".

Если Runtime.getRuntime().exec(command) реализуется через ShellExecute, то будет отмечаться .exe с соответствующим манифестом; если exec использует CreateProcess, процесс будет запущен с текущими пользовательскими привилегиями, то есть не повышен; кроме того, процесс не будет запущен вообще, если .exe имеет requireAdministrator в своем манифесте.

  • 0
    спасибо Алексей, я думаю, что в частности, exe (patch.exe из UnxUtils) не определен правильный манифест. Использование patch.exe из cygwin не вызывает всплывающее окно UAC (или сбой при отказе в разрешении), поэтому я предполагаю, что это так.
  • 0
    @vinnyjames Рад, что это помогло. Вы можете проверить манифест, просмотрев файл .exe. В случае с Cygwin, я думаю, вы можете добавить к нему манифест, если это поможет.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню