如何通过java执行cmd时输入密码

时间:2015-01-22 06:21:20

标签: java cmd runas

我想编写一个java程序来检索在不同服务器上运行的所有服务的状态(大约20个)。为此我使用SC命令,我可以使用java程序。但现在我陷入了一种情况,我想通过使用RUNAS作为不同的用户运行SC命令,我面临的问题是,一旦命令第一次执行,我无法输入密码。以下是我正在使用的代码: -

        String[] command = new String[3];
        command[0] = "cmd";
        command[1] = "/c";
        command[2] = "runas /noprofile /user:domain\\admin \"sc \\\\serverName queryex type= service state= all\"";

        Process p = Runtime.getRuntime().exec(command);

        PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true);

        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = reader.readLine();

        while (line != null) {

            new PrintWriter(p.getOutputStream(),true).println("AdminPassword");

            System.out.println(line);
            line = reader.readLine();
        }

        BufferedReader stdInput = new BufferedReader(newInputStreamReader(p.getInputStream()));

        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

        String Input;
        while ((Input = stdInput.readLine()) != null) {
            System.out.println(Input);
        }            

        String Error;
        while ((Error = stdError.readLine()) != null) {
            System.out.println(Error);
        }

但我无法打印所有服务的状态。提供密码后我不确定是否需要捕获其他流或者其他?

对此有何帮助?

由于

2 个答案:

答案 0 :(得分:0)

while (line != null)循环中,为您阅读的每一行打开一个新的PrintWriter。您可以将管理员密码打印到这些编写器,但不要关闭或刷新它们。

尝试上面创建的PrintWriter writer,写完密码后flush(),否则它仍会在缓冲区中。

您还可以在Process的inputStream上创建多个BufferedReader,这可能会相互干扰。

所以:只创建一个读者。 writer的inputStream,errorStream和outputStream的编写器。

答案 1 :(得分:-1)

使用java.io.Console包可以读取密码。请使用以下代码从cmd提示中读取密码

Console c = System.console(); String login = c.readLine("Enter your login: "); char [] password= c.readPassword("Enter your password: ");