以编程方式传递Windows凭据

时间:2014-08-29 16:57:34

标签: java windows credentials

我有一个VB脚本,我需要传递用户名和密码。

我想通过编程方式通过Java代码运行这个VB脚本。

我是否可以通过编程方式将Windows凭据传递给Java中的VB脚本?

1 个答案:

答案 0 :(得分:-1)

您可以在操作系统环境中拥有凭据并从那里读取它们:

String credentials = System.getenv().get("encrypted_credentials_or_something");

然后从Java运行您的命令。但是,Runtime.exec()在某些情况下不起作用:

  • 当命令不在系统的路径
  • 上时
  • 何时涉及参数
  • 如果您想要访问流程输出
  • 当你需要能够杀死进程时
  • 当您需要检查它是否成功终止或出错时(状态代码!= 0 - 这就是您编写System.exit(int)以终止Java应用程序的原因。例如,System.exit(1),表示异常终止)

这就是我创建此实用程序类以使用参数和所有内容执行外部进程的原因。它对我很有用:

import java.io.*;
import java.util.*;

public class ExternalCommandHelper {

    public static final void executeProcess(File directory, String command) throws Exception {
        InputStreamReader in = null;
        try {
            //creates a ProcessBuilder with the command and its arguments
            ProcessBuilder builder = new ProcessBuilder(extractCommandWithArguments(command));
            //errors will be printed to the standard output 
            builder.redirectErrorStream(true);
            //directory from where the command will be executed
            builder.directory(directory);

            //starts the process
            Process pid = builder.start();

            //gets the process output so you can print it if you want
            in = new InputStreamReader(pid.getInputStream());

            //simply prints the output while the process is being executed
            BufferedReader reader = new BufferedReader(in);
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            int status = 0;
            //waits for the process to finish. Expects status 0 no error. Throws exception if the status code is anything but 0.
            if ((status = pid.waitFor()) != 0) {
                throw new IllegalStateException("Error executing " + command + " in " + directory.getAbsolutePath() + ". Error code: " + status);
            }

        } finally {
            if (in != null) {
                in.close();
            }
        }
    }

    //Splits the command and arguments. A bit more reliable than using String.split() 
    private static String[] extractCommandWithArguments(String command) {
        StringTokenizer st = new StringTokenizer(command);
        String[] cmdWithArgs = new String[st.countTokens()];

        for (int i = 0; st.hasMoreTokens(); i++) {
            cmdWithArgs[i] = st.nextToken();
        }
        return cmdWithArgs;
    }
}