質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

ASP.NET IIS側でexeを実行するプログラムを配置しても動作しない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 11K+

Rocky

score 82

ASP.NETで別プロセスとしてexeを動作させ、そのexeの標準出力を得たいと考えています。
具体的に想定している使用ケースは以下の通りです。

  1. webページに利用者がアクセスし、文字列を入力する
  2. 入力された文字列をwindowsサーバ側にインストールしてあるexeファイル(コンソールアプリケーション)に引数として渡し、実行する
  3. 得られた出力をwebページ上に表示する

ここでVisualstudio上でのデバッグはうまく動作し、タスクマネージャでもコンソールウィンドウホストが起動することが確認できているのですが、いざ発行してasaxファイルを配置→実行しても、なにも値が返ってきません。コンソールウィンドウホストが立ち上がる気配もありません。

ASP.NETではexeを呼び出すような処理を記述する場合、何か気を付けたり特殊な処理をしなければいけないのでしょうか。
どうぞご教示ください。よろしくお願いします。

開発はwindows serverにインストールしたvisualstudioでおこなっています。
参考までに問題個所のソースを記述します。

string FileName = @"C:\Program Files (x86)\動作させたい.exe";

ProcessStartInfo psInfo = new ProcessStartInfo();
Process mp = new Process();

mp.StartInfo.FileName = FileName;
mp.StartInfo.Arguments = "引数";
mp.StartInfo.UseShellExecute = false;
mp.StartInfo.RedirectStandardInput = true;
mp.StartInfo.RedirectStandardOutput = true;
mp.StartInfo.CreateNoWindow = false;
mp.Start();

mp.StandardInput.WriteLine("ユーザーが入力した文字");
mp.StandardInput.Close();

String s = mp.StandardOutput.ReadToEnd();
//→sをブラウザに表示させる
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

ASP.NETで稼動するプロセスは、通常、ASP.NET用のWindowsサービスのコンテキストで動作して、適切な権限を割り当てています。Windowsサービスはデスクトップとの対話ができないようになっているので、従って標準入出力のハンドルもあらかじめ閉じられていて、プロセスを起動できても、標準入出力を介したやり取りは恐らくできないと思います。

Visual Studio でのデバッグですと、そのデバッグしているユーザーアカウントでローカルなデバッグ用ASP.NETサーバーとデバッグ対象のプログラムが動作するので、ASP.NETの本番用とは動作環境が異なることになります。

もし、HTMLのフォームに入力された値を標準入出力でやり取りしたいのであれば、ASP.NETではなく、CGIとして設置する必要があります。


2018/03/22 12:48 追記
※コメントに書こうとしましたが、長文になりましたので追記します。

そもそもこの構成が実現可能なのかどうかも含めて、何卒、ご教示くださいませ。

その構成ですと不可能だと思います。バッチファイル中で標準入出力を利用して作成したファイルは意図通りの結果とならないと思ってください。パイプ(|)もリダイレクト(>)も、標準入出力が使えてこそ、意図通りに動作します。

詳細な理由は別回答でSurferOnWwwさんが述べられている内容を理解する必要があります。
端的に書くと「IISは、ユーザー対話モードでアプリを実行しない、ワーカープロセスから起動したバッチファイル内では標準入出力を使えない」と言うことになるのですが、これは回避できません。

IISではないですが、私も過去、Windowsサービス中で標準入出力で他プロセスとやり取りしようとして挫折しました。と言いますかアプローチが間違っているのでとっとと違う方法にしたのですが。

話を戻しますと、、

実行したいexeがC\Program Filesにあるのが原因だと思うのですが、

C:\Program Files下にあっても、起動自体はできてます。`"echo "入力データ" | 実行ファイル" として、実行したいEXEに標準入力を流し入れようとすること自体が不可能、と言うことです。

CGIであれば、そのCGIプロセスが標準入力として取り込めるようにIISが準備してから呼び出します。 (UNIX系OSのように、ソケットのハンドルを標準入出力のハンドルに繋ぎ換えているはず)

テキストファイルは生成されるものの、空のテキストファイルが生成されてしまいます…(ローカル実行なら問題なく動作します)

(>)の指定でバッチファイルを実行しているCMD.EXEがファイルを新規で開くものの、標準入力が流れてこないまま終わり、ファイルを閉じる為、空になってます。

ローカルで実行するとOKなのは、デスクトップで実行しているからです。(デスクトップで実行している、などと言う表現がそもそも分かりづらいのですが、要はユーザーがログオンして画面上で操作している、と思ってください)

私の先の回答では、ワーカープロセス内から 

実行したいexe /IN 入力データが入ったファイル /OUT 出力結果を格納するファイル


のような感じでコマンドラインオプションを指定できるよう、実行したいexeプログラムを改変する、と言う提案のつもりでした。実行したいexeのプログラム自体をRockyさんの方で改変できないのであれば、CGIとして動作させるしか簡単な方法はないように思います。

あと方法として思いつくものとしては(まったくお勧めできませんが)、IISのワーカープロセスと名前付きパイプ等のプロセス間通信を行うデスクトップアプリをひとつ作成してログオンしたデスクトップに常駐させ、ワーカープロセスからのリクエストに応じて実行し、結果をワーカープロセスへ返す、とのような方法です。これだとデスクトップからログオフするともう使えないので致命的です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/22 14:06 編集

    ええー!そうなんですか… exeの出力を加工してからレスポンス返したいのですが、無理なんですねorz
    では、exeファイルを標準出力ではなくファイル出力するようにラップする方法を検討しようかと思います。(サードパーティ製のソフト同梱使用が必須案件で、この呪縛が非常に効いています…)

    せっかくの機会なのでCGI実装についてもちゃんと勉強してみますね。わざわざありがとうございます。

    キャンセル

  • 2018/03/22 14:10

    無理とも言い切れません。exeの修正内容次第です。
    > exeファイルを標準出力ではなくファイル出力
    これができるならCGIでなく、話しが戻りますが当初のワーカープロセス案で行けるはずです。CGIも含め調査ご検討ください。

    キャンセル

  • 2018/03/22 14:12

    右往左往している最中ですが、強力な道しるべをありがとうございました。試行錯誤して頑張ります。

    キャンセル

+2

開発環境では IIS Express 上で動かしいて ASP.NET から起動するコンソールアプリは期待通り動いたが、運用環境で IIS にデプロイすると動かないと言っているのですよね?

であれば、IIS Express で動かしたときと IIS で動かしたときのワーカープロセスの違いを認識して下さい。(そのあたりが認識されてないと、今後また同様な問題で悩むことになるかもしれません)

IIS Express では質問者さんが Visual Studio を立ち上げた時のアカウント(管理者アカウント?)で Web アプリは動いているはずです。一方、IIS 上で動かした場合はアプリケーションプールのアカウントになります。

そうすると、IIS Express ではユーザー対話モードでアプリが実行され、IIS ではそうではないということになります。(前者は Environment.UserInteractive プロパティが true、後者は false になるので調べてみてください。true / false でどう違うかは MSDN ライブラリを読んでください)

さらに、Windows Server 2008 から採用されている Session 0 分離というセキュリティ対策による制約もあります。詳しくは、以下の記事からダウンロードできる word 文書を見てください。

Impact of Session 0 Isolation on Services and Drivers in Windows
https://docs.microsoft.com/en-us/previous-versions/windows/hardware/design/dn653293(v=vs.85)

解決策は UI を使わないことです。

あと、開発環境でも IIS Express は使わないで、ローカル IIS を使うことをお勧めします。そうすれば今回のようなトラブルは未然に防ぐことができます。今回の問題は UI が使えないことによるものですが、それだけでなく、アクセス権の違いという問題でまた悩むことになるかも。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/22 11:24

    お返事が遅れまして、失礼しました。
    ご丁寧にもオフィシャルの資料引用までありがとうございます。
    おかげさまで足りていない知識分野がはっきりとし、学習の励みになりました。
    アクセス権、、、ややこしいですね、、、頑張ります。

    キャンセル

0

まずはそこにログ仕込むとかデバッグ用出力させるとかで、本当にそこに到達してるかを見てみればどうでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 17:54

    プロセスを生成する前後でログを出したりなどして動作を確認していますが、
    本番環境では空の出力を受け取って、空の文字列を出力するだけです。
    (=exeプロセスの生成がされないまま、コードが先に進んでしまいます)
    ASP.NETではそもそもexeの実行が無理なのでしょうか?

    キャンセル

  • 2018/03/16 18:05

    すみません、おっしゃられたようにプロセスのIDをログで出すようにしたところ、ちゃんとIDが生成されていました。どうやら標準出力の受け渡し?で失敗しているようです。しばらく調査します。

    キャンセル

  • 2018/03/16 18:24

    ああ、標準入出力があさって向いてるってのはありがちっちゃーありがちですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる