Я разрабатываю веб-приложение, которое должно обрабатывать некоторые ресурсы в файловой системе и запускать некоторые приложения с привилегиями конкретного пользователя. До сих пор я вызывал ProcessBuilder и службу psexec, доступные в Windows 7 и других версиях:
def get() = {
var currentOutputLine = ""
val pb = new ProcessBuilder("psexec.exe", "/ACCEPTEULA",
"-u", "user1", "-p", "password", "-w", batchpath, batchfile)
pb.directory(new File(batchpath))
pb.redirectErrorStream(true)
val proc = pb.start
val input = new BufferedReader(new InputStreamReader(proc.getInputStream))
while ({
currentOutputLine = input.readLine();
currentOutputLine != null
}) {
}
Сервер приложений работает как специальный пользователь, такой как TOMCATUSER, и я пытаюсь вызвать пакетный файл как "user1". Этот код отлично работает с Windows 7 x64, но у меня проблема с Windows 2008 sp2.
При использовании сервера Windows 2008 sp2, выполнение psexec из приложения java вернуло ошибку 1073741502 и, наблюдая за средством просмотра событий, я вижу, что ОС сообщила об ошибке в cmd.exe, поскольку не может открыть всплывающее окно.
После многих испытаний я обнаружил, что должен назначить «user1» и «tomcatuser» группе администраторов в системе, где вызывается psexec, и вызвать psexec с параметром hostname, например:
def get() = {
var currentOutputLine = ""
val pb = new ProcessBuilder("psexec.exe","\\\\localhost", "/ACCEPTEULA",
"-u", "user1", "-p", "password", "-w", batchpath, batchfile)
pb.directory(new File(batchpath))
pb.redirectErrorStream(true)
val proc = pb.start
val input = new BufferedReader(new InputStreamReader(proc.getInputStream))
while ({
currentOutputLine = input.readLine();
currentOutputLine != null
}) {
}
Есть ли способ избежать этой проблемы? Я не хочу назначать права администратора для учетной записи user1, потому что мне нужно только запустить скрипт как user1. Я использую psexec, потому что в основном мне нужно работать в файловой системе как «user1», а не как tomcatuser (создавать, копировать, перемещать файлы), есть ли лучшее и безопасное решение для этого?
Спасибо, миллион.
Флавио