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