java/scala web应用程序和psexec

java/scala web应用程序和psexec,java,windows,scala,psexec,Java,Windows,Scala,Psexec,我正在开发一个webapp,它应该处理文件系统中的一些资源,并以特定用户的权限运行一些应用程序。到目前为止,我调用了适用于Windows 7和其他版本的ProcessBuilder和psexec服务: def get() = { var currentOutputLine = "" val pb = new ProcessBuilder("psexec.exe", "/ACCEPTEULA", "-u", "user1", "-p", "password", "-w", batch

我正在开发一个webapp,它应该处理文件系统中的一些资源,并以特定用户的权限运行一些应用程序。到目前为止,我调用了适用于Windows 7和其他版本的ProcessBuilder和psexec服务:

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”。这段代码在Windows7x64上运行良好,但我在Windows2008SP2上遇到了一个问题

使用Windows 2008 server sp2,从java应用程序执行psexec时返回了1073741502错误,通过查看eventviewr,我可以看到操作系统在cmd.exe上报告了一个错误,因为无法打开弹出窗口

经过大量测试,我发现我必须将“user1”和“tomcatuser”分配给调用psexec的系统中的管理员组,并使用hostname参数调用psexec,如下所示:

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(创建、复制、移动文件)的身份工作,有更好、更安全的解决方案吗

谢谢你


Flavio

我使用windows 2008提供的winrs/winrm解决了这个问题

我配置了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
 }) {

}