- PR -

Runtime#execにてWindows2000上で実行出来ないコマンド

投稿者投稿内容
AXEL
会議室デビュー日: 2003/08/15
投稿数: 5
投稿日時: 2003-08-15 04:35
はじめまして、AXELと申します。
Java暦3日です。
Windows 2000 SP4上にて下記ソースを実行したのですが、上手くいかず困っています。しかし、Windows XP SP1上では上手くいきます。
mbsacli.exeは、MicrosoftのMBSA Ver1.1.1に同梱されているコマンドで、セキュリティパッチ等の適用状況を調べるツールで、実行途中に外部サーバーへ接続しているようです。

ただし、Windows XP SP1でも、コマンドプロンプトから実行するのと、出力結果が多少異なり、外部サーバーへ接続する部分が無くなっています。実際は、Servletにて記述しておりましたが、上手くいかないためコマンドプロンプト上で実行出来るよう書き換えました。

どなたか、Windows 2000上で実行出来るような回避策をご教授願えますでしょうか。
また、不足している情報等ございましたらお知らせ願えますでしょうか。
よろしくお願いいたします。
下記、ソースを添付いたします。

import java.io.*;

public class exec_mbsacli {
public static void main(String[] args) {
//実行するコマンド
String[] command = {"C:\\Program Files\\Microsoft Baseline Security Analyzer\\mbsacli.exe","/hf","-x","stksecure.xml"};
try {
// プロセスオブジェクトを生成
Process process = Runtime.getRuntime().exec(command);

// 外部コマンドの標準出力を取得するための入力ストリームを取得
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(new BufferedInputStream(is)));

// 標準出力を1行づつ取り出す
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//プロセスの破棄
process.destroy();
}
catch (Exception e) {
e.printStackTrace();
}
}
}

[ メッセージ編集済み 編集者: AXEL 編集日時 2003-08-15 04:37 ]

[ メッセージ編集済み 編集者: AXEL 編集日時 2003-08-15 04:38 ]

[ メッセージ編集済み 編集者: AXEL 編集日時 2003-08-15 04:39 ]

[ メッセージ編集済み 編集者: AXEL 編集日時 2003-08-15 04:45 ]
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2003-08-15 11:12
AXELさん、こんにちはニシトミです。

まずどのような例外が出力されていますか?
まずないとは思いますが
ただOSによってexeファイルのパスが違ったりなどという
単純なことだったりしませんか?
あとクラス名は先頭大文字じゃなかったでしたっけ?

的はずれだったらごめんなさい
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-08-15 15:59
>AXELさんの書き込み (2003-08-15 04:35) より:
>Windows 2000 SP4上にて下記ソースを実行したのですが、上手くいかず困っています。しかし、Windows XP SP1上では上手くいきます。

単に「上手くいく/いかない」だけでは、何が問題なのかよくわかりません。
もう少し問題を具体的に書いてください。読んだ限りでは、コマンドの出力結果が
期待通りでない、ということかなと思いますが…
AXEL
会議室デビュー日: 2003/08/15
投稿数: 5
投稿日時: 2003-08-15 16:03
引用:

ニシトミさんの書き込み (2003-08-15 11:12) より:

まずどのような例外が出力されていますか?
まずないとは思いますが
ただOSによってexeファイルのパスが違ったりなどという
単純なことだったりしませんか?
あとクラス名は先頭大文字じゃなかったでしたっけ?



ニシトミさん、ご返答ありがとうございます。

私の書き方が悪い部分がございました。Windows XPでは、mbsacli.exeをRuntime#execにて実行開始できて、終了してコマンドプロンプトに戻って来ます。それが、Windows 2000では実行開始できるが、終了しないという現象がおきています。失礼致しました。Windows 2000上での実行開始されたことの確認は、タスクマネージャーのプロセスを確認致しました。
本日再度、Windows 2000上で実行してみたところバージョンのみ表示されて、コマンドプロンプトに戻って来るという現象がありました(再現出来なくて困っています)

ちなみに、クラス名は先頭大文字、小文字どちらでもいけました。

Web上で見かけたのですが、 読み出しバッファがいっぱいにならないようProcess#getInputStream()とProcess#getErrorStream()で読み出し、各々別スレッドで動かす必要があるというようなものが見つかったのですが、スレッドをどうのこうのという話になると、現状ではお手上げ状態にあります。
AXEL
会議室デビュー日: 2003/08/15
投稿数: 5
投稿日時: 2003-08-15 16:30
引用:

ukさんの書き込み (2003-08-15 15:59) より:
単に「上手くいく/いかない」だけでは、何が問題なのかよくわかりません。
もう少し問題を具体的に書いてください。読んだ限りでは、コマンドの出力結果が
期待通りでない、ということかなと思いますが…



ukさん、ご指摘どうもありがとうございます。
説明不足で申し訳ありません。

ニシトミさんへの返信でも書かせて頂いたのですが、Windows 2000上だと、mbsacli.exeコマンドは実行しているようなのですが、実行したままで出力結果が何も出力されず、さらに、いつまで経っても終了致しません。また、コマンドへのパス名は、エスケープを使ってダブルクォーテーションで囲むようにも記述してみましたが、やはり同じ現象でした。さらに、コマンドとオプションの間にスペースを空けるようにしてみましたが、同様でした。

何か、単純な所で引っかかっているような気もするのですが・・・

よろしくお願いいたします。
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2003-08-15 17:01
引用:

AXELさんの書き込み (2003-08-15 16:30) より:

Windows 2000上だと、mbsacli.exeコマンドは実行しているようなのですが、実行したままで出力結果が何も出力されず、さらに、いつまで経っても終了致しません。



こんにちはお疲れ様ですニシトミです。
まず確かめて欲しいのですが、Javaから実行せずに、
mbsacli.exeは動いていますでしょうか?
私はmbsacli.exeについては全く判らないのでご了承ください。

AXELさんもお気づきの様にProcessクラスのgetErrorStream()に
例外が入っているかもしれないので
process.destroy();
のまえにでも

InputStreamReader inError = new InputStreamReader(process.getErrorStream());
BufferedReader brError = new BufferedReader(inError);

こんな感じで取得して、出力してみてはどうでしょうか
へたなソースですが参考までに
では


[ メッセージ編集済み 編集者: ニシトミ 編集日時 2003-08-15 17:25 ]
AXEL
会議室デビュー日: 2003/08/15
投稿数: 5
投稿日時: 2003-08-15 21:44
引用:

ニシトミさんの書き込み (2003-08-15 17:01) より:

まず確かめて欲しいのですが、Javaから実行せずに、
mbsacli.exeは動いていますでしょうか?

InputStreamReader inError = new InputStreamReader(process.getErrorStream());
BufferedReader brError = new BufferedReader(inError);

こんな感じで取得して、出力してみてはどうでしょうか
へたなソースですが参考までに
では


ニシトミさん、ご返答どうもありがとうございます。
すごく丁寧に教えて頂きまして感謝しております。

まず、mbsacli.exeですが、コマンドプロンプト上からJavaを通さずに実行して
動作することが確認取れています。
先に、結論を申し上げますと、見事出力結果が得られました。
前もってもっと、getErrorStream()について調べ上げるべきでした。

mbsacli.exeを実行すると、外部サーバーに接続し、パッチ適用を調査するための
パターンファイルを取りに行き、自分のマシンのパッチ適用状況をスキャンするという
操作を行います。これらの操作の過程をコマンドプロンプト上に表示しているのですが、
getErrorStream()にて、エラーとして取得されていました。
ただし、mbsacli.exeの最終的な実行結果の部分の出力結果は、エラーではないので、
getInputStream()にて取得できました。

下記、プロセスオブジェクトを生成してからのソースコードを添付致します。
どうもありがとうございました。大変助かりました。

// 外部コマンドの標準出力を取得するための入力ストリームを取得
InputStreamReader inError = new InputStreamReader(process.getErrorStream());
BufferedReader brError = new BufferedReader(inError);

// 外部コマンドのエラー出力を取得するための入力ストリームを取得
InputStreamReader noError = new InputStreamReader(process.getInputStream());
BufferedReader br = new BufferedReader(noError);

// 標準出力,エラー出力を1行づつ取り出す
String lineError,line;
while ((lineError = brError.readLine()) != null) {
if((line = br.readLine()) != null || lineError != line)
System.out.println(line);
}

[ メッセージ編集済み 編集者: AXEL 編集日時 2003-08-15 21:46 ]
AXEL
会議室デビュー日: 2003/08/15
投稿数: 5
投稿日時: 2003-08-15 21:49


[ メッセージ編集済み 編集者: AXEL 編集日時 2003-08-15 21:52 ]

スキルアップ/キャリアアップ(JOB@IT)