1

我正在开发一个 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”。此代码适用于 Windows 7 x64,但我在使用 Windows 2008 sp2 时遇到问题。

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

经过大量测试,我发现我必须将“user1”和“tomcatuser”分配给调用 psexec 的系统中的管理员组,并使用主机名参数调用 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(创建、复制、移动文件)工作,有没有更好和安全的解决方案来做到这一点?

谢谢万。

弗拉维奥

4

1 回答 1

0

我使用 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
 }) {

}
于 2011-02-24T08:28:50.790 回答