java / scala веб-приложение и psexec - PullRequest
1 голос
/ 23 февраля 2011

Я разрабатываю веб-приложение, которое должно обрабатывать некоторые ресурсы в файловой системе и запускать некоторые приложения с привилегиями конкретного пользователя. До сих пор я вызывал 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 (создавать, копировать, перемещать файлы), есть ли лучшее и безопасное решение для этого?

Спасибо, миллион.

Флавио

1 Ответ

0 голосов
/ 24 февраля 2011

Я решил проблему с помощью winrs / winrm, предоставленной Windows 2008

Я настроил сервер winrm и после этого код клиента:

def get() = {
 var currentOutputLine = ""
 val pb = new ProcessBuilder("winrs.exe", "-r:http://localhost:5985", "-u:user1", "-p:password",
 "-ad","-d:workingpath","\""+commandtorun+"\"")

 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
 }) {

}
...