Java GetRuntime (). Exec EXE, который требует UAC - PullRequest
1 голос
/ 13 апреля 2011

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

1 Ответ

5 голосов
/ 13 апреля 2011

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

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


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

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

...