none
ASP.NETからのEXE起動方法 RRS feed

  • 質問

  • ASP.NETのワーカプロセスから、ユーザプロセスを起動はできたのですが、現在はログオンユーザがいる状態で、そのログオンユーザでプロセスを起動しています。
    サーバだと誰もログオンしていない状態が考えられるので、その状態からユーザを指定してプロセスを起動できないかという問合せがきました。
    調べてみたところCreateProcessWithLogonWを使うと良さそうとのことだったのですが、うまく行きません。
    notepad.exeなら起動できたので、session0で起動されるようです。
    そもそも、誰もログオンしていない状態でASP.NETのワーカプロセスからユーザプロセス(AcroRd32.exe)の起動は可能なのでしょうか。

    やりたいことは、ユーザプロセス(AcroRd32.exe)にPDFファイル名とプリンタ名を渡して指定プリンタに出力(PDF印刷)することです。

    解決方法の情報提供をお願いいたします。

    2014年10月27日 13:06

すべての返信

  • AcroRd32.exe というのは Adobe Reader という理解でいいのですよね?

    質問の文章から想像するに、クライアントとプリンタが物理的に一緒の場所にあって、Web サーバーはリモート(クライアントから物理的に離れたどこか)にあって、クライアントから Web サーバーに要求を出すとクライアントの PC で Adobe Reader が起動されてプリンタに pdf が印刷されるということを考えているように思えます。

    上記の理解が間違っていたら具体的にどう違うのか指摘ください。

    上記の理解で正しいとすると、質問者さんは考え違いをしていると思います。少なくともそれは不可能です。サーバーで起こっていることとクライアントで起こっていることが区別できているでしょうか?


    > notepad.exeなら起動できた

    とのことですが、それは ASP.NET 開発サーバーを使って、開発環境(全てローカル)でやっているからではないですか?

    Session 0 という言葉をご存知のようですが、IIS 上で(開発サーバーではなくて)Web アプリが動いている場合は、Windows Vista, Windows Server 2008 以降なら Session 0 分離のためできない(InvalidOperationException 例外がスローされる)はずです。



    • 編集済み SurferOnWww 2014年10月27日 14:07 一部訂正
    2014年10月27日 14:04
  • そもそも、誰もログオンしていない状態でASP.NETのワーカプロセスからユーザプロセス(AcroRd32.exe)の起動は可能なのでしょうか。
    そうではなくて、ログオンしていないとユーザープロファイル(%USERPROFILE%)やレジストリ(HKEY_CURRENT_USER)が用意されていないので、大抵のアプリケーションは何らかのエラーで停止してしまうかと。
    2014年10月27日 17:54
  • Session 0 という言葉をご存知のようですが、IIS 上で(開発サーバーではなくて)Web アプリが動いている場合は、Windows Vista, Windows Server 2008 以降なら Session 0 分離のためできない(InvalidOperationException 例外がスローされる)はずです。

    あれ?例外になるんでしたっけ?
    どういう動きなんでしょこれ…というかどうやって例外をだすんだろう…?
    2014年10月28日 2:08
  • 質問者さんの書かれているCreateProcessWithLogonW()がSurferOnWwwさんの書かれているInvalidOperationExceptionをスローすることはあり得ないため、少なくともSurferOnWwwさんの記述は間違っていると思います。
    2014年10月28日 3:47
  • 佐祐理さん>

    私の質問に対して質問者さんから返事がなく、先の私のレスに書いた私の理解が合っているのか違っているのかが分からないところで、想像ベースで議論してもあまり意味がないかもしれませんが・・・

    > 質問者さんの書かれているCreateProcessWithLogonW()がSurferOnWwwさんの書かれている
    > InvalidOperationExceptionをスローすることはあり得ないため、少なくともSurferOnWww
    > さんの記述は間違っていると思います。

    そのあたりは質問者さんの質問の解釈の相違によるものだと思います。

    佐祐理さんは、質問者さんがすでに CreateProcessWithLogonW() を使っている(メモ帳の起動にも)と理解されているのですよね? 確かに「notepad.exeなら起動できた」というところが、notepad.exe なら CreateProcessWithLogonW() を使って起動できたというようにも取れます。

    でも自分そう解釈していません。質問者さんは CreateProcessWithLogonW() を使おうとしたがうまく行かないので、メモ帳の起動にも使っていないと解釈しました。何にせよ、CreateProcessWithLogonW() が InvalidOperationException をスローすると言ったつもりはありません。

    その前に Session 0 分離の問題があると思います。CreateProcessWithLogonW() でそれが回避できるかどうかは分かりませんが(それを考える前に、サーバーで Adobe Reader を起動することに意味があるのかが疑問)。

    以下のページからダウンロードできる Word ドキュメントによると、Session 0 は "noninteractive" で "any attempt that a service makes to render graphics fails" とのことです。

    Impact of Session 0 Isolation on Services and Drivers in Windows
    http://msdn.microsoft.com/ja-jp/library/windows/hardware/dn653293(v=vs.85).aspx

    その例として、ASP.NET ベースの web アプリで MessageBox を表示している場合(使い方が間違っているうんぬんの話はちょっと置いといて)、ASP.NET 開発サーバーでは MessageBox は表示されるが、IIS にデプロイすると InvalidOperationException 例外がスローされるという話をここでも時々聞きます。

    メモ帳や Adobe Reader を実際に試してみたわけではありませんが、"any attempt that a service makes to render graphics fails" という点に関しては MessageBox と同じことのはずです。

    ただし、佐祐理さんが指摘されているように、メモ帳や Adobe Reader は(MessageBox と違って)、ユーザープロファイルやレジストリとかの関係でそもそも(上に書いた "fails" 以前に?)起動できないかもしれませんが。(未検証です)


    • 編集済み SurferOnWww 2014年10月28日 5:49 一部追加
    2014年10月28日 5:39
  • SurferOnWwwさん。返信ありがとうございます。

    AcroRd32.exe というのは Adobe Reader という理解でいいのですよね?

    その通りです。

    上記の理解が間違っていたら具体的にどう違うのか指摘ください。

    クライアントはブラウザでサーバーにPDFファイルの印刷を依頼するだけで、Adobe Reader、プリンタドライバ共にサーバーにインストールしたものを使用してサーバーがサーバーに置いてあるPDFファイルの印刷を行います。

    追記しますと、最初以下の方法でSYSTEMユーザーから印刷する方法を実装したのですが、プリンタを追加するたびにサーバーのレジストリを修正する必要あるので、別の方法を考えてくださいと依頼されました。

     http://support.microsoft.com/kb/419321/ja 

    次が最初にかいたログオンユーザから印刷する方法です。これは誰もサーバーにログオンしていない場合、印刷できませんでした。

    佐祐理さんご指摘の通り、ログオンユーザの情報が無いので。。。

    2014年10月28日 5:54
  • ちょっと見てみましたが、InvalidOperationExceptionをスローするのは.NETのライブラリです。

    起動されたアプリが、.NETの、UIを持つWindowsアプリの場合は結果的に(起動された側のプロセスで)発生すると思われますが、メモ帳やAdobe Readerは該当しないでしょう。

    .NETアプリに限定すれば発生しますが、普通に読めば最初の投稿SurferOnWwwさんがそういう意図で書いたようには見えないです。

    SurferOnWwwさんは、「そんなことは限定していない」と言うだけでしょうけど。

    別にあなたは間違ってるといいたいんじゃないですよ、普通に読んで「え?」と疑問に感じたから書いたまでです。

    少なくとも普通に読めば誤って解釈する公算が高い、ということです。

    普通に読めば、です。


    • 編集済み なちゃ 2014年10月28日 7:23
    2014年10月28日 5:59
  • 次が最初にかいたログオンユーザから印刷する方法です。これは誰もサーバーにログオンしていない場合、印刷できませんでした。

    佐祐理さんご指摘の通り、ログオンユーザの情報が無いので。。。

    アプリケーションプールの設定で、ユーザプロファイルをロードする指定が、IISのどのバージョンだったかから追加されたような記憶があります。

    カスタムアカウントを作成して、そのオプションをつけると、もしかしたらいけるかもしれません(ちょっと未確認です、ごめんなさい)。

    2014年10月28日 6:07
  • > 次が最初にかいたログオンユーザから印刷する方法です。

    逆に質問してすみませんが、それは具体的にどうやったのでしょうか?

    Process.Start メソッドで、コマンドライン引数(下の arguments)に /t path printername drivername portname を指定して実行するというようなことでしょうか?

    public static Process Start(
     string fileName,
     string arguments,
     string userName,
     SecureString password,
     string domain
    )

    Windows Server のバージョンは何でしょうか?

    2014年10月28日 7:49
  • クライアント向けに無償配布している機能限定ソフトウェアの多くは、サーバでの使用を禁止しています。
    Adobe Reader も サーバでの使用を禁止していたと思います。
    サーバでの利用を前提としたものを選択することをお勧めします。
    また最近は、プリンタ自体もPDFファイルをメールで送って印刷できるものもあります。
    サーバで AcroRd32.exe を無理に実行するメリットはほとんどないと思います。
    2014年10月28日 7:52
  • > Adobe Reader も サーバでの使用を禁止していたと思います。

    そのようですね。

    Adobe Reader のサーバー利用について
    http://helpx.adobe.com/jp/x-productkb/policy-pricing/cpsid_87204.html

    2014年10月28日 8:14