Если ваше 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
.