通过cmd

时间:2015-11-16 13:14:11

标签: java windows command-line

我正在尝试从Java中解锁由bitlocker保护的驱动器。据我所知,没有可以帮助我处理它的库,所以我通过cmd尝试它。这是代码:

    public static boolean unlockDisk(String pwd) throws IOException
{
    String[] script =
    {
            "manage-bde.exe", "-unlock", "D:", "-password",
    };

    Process process = new ProcessBuilder(script).start();
    InputStream inputStream = process.getInputStream();
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    final OutputStream outputStream = process.getOutputStream();
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
    writer.write(pwd);
    writer.newLine();
    writer.close();
    System.out.println("--------------------------------------");
    System.out.println("Bitlocker log:");
    String line;
    while ((line = bufferedReader.readLine()) != null)
    {
        System.out.println(line);
    }
    bufferedReader.close();

    BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    System.out.println("Here is the standard error of the command (if any):\n");
    String tmp;
    while ((tmp = stdError.readLine()) != null)
    {
        System.out.println(tmp);
    }
    System.out.println("--------------------------------------");

    return true;
}

我的问题

如果我执行此java代码,我会The handle is invalid获得Code 0x80070006

我已尝试过的内容

  1. 不同的JDK版本32和64位Java 8和Java 7(JDK 32以某种方式抱怨它无法找到命令manage-bde
  2. 输出流的不同组合,包括和不包含换行符......
  3. 流程构建器的另一个脚本命令,例如"cmd.exe", "/k", "manage-bde.exe", "-unlock", "D:", "-password",/c而不是/k
  4. 有和没有管理员权限
  5. 简单* .bat,命令为manage-bde.exe -unlock D: -password(效果很好)
  6. 通过java命令锁定驱动器(运行正常)
  7. 没有-password的命令(让“bitlocker声称我必须定义如何解锁驱动器”)
  8. 我google了一段时间,发现其他人遇到了这些问题,但与其他应用程序的方式不同。所以这似乎是一个非常常见的错误信息。

    我的猜测

    我认为这与我如何将Java输出作为Bitlocker输入处理有关。也许我正在使用错误的流写入。

    我无法在脚本变量中提供密码的值,因为Bitlocker不希望接受这种输入密码的方式。通常在命令行中输入manage-bde -unlock D: -password,在几行输出后Bitlocker会要求您输入密码。

    我把它描述得尽可能好,希望有人知道问题是什么。

    任何建议,即使它只是导致更准确的错误信息,我们将不胜感激。如果您有任何疑问,请告诉我们!

    提前致谢!

1 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题。我做了很多搜索。似乎mange-bde.exe没有从stdin读取用户输入。有人说在Linux上运行ssh client和telent clent并没有从stdin读取密码。另一个例子是Linux命令passwd。它有一个名为-stdin的标志,它使shell能够从stdin读取密码。因此,我猜想manage-bde.exe可能会以类似的方式工作。

我的解决方案是模拟键盘输入。 awt包可以完成这项工作。