7

IISWebアプリケーション内から小さなコンソールアプリケーションを起動しています。コードは、次のようなコードを使用してアプリプール内から開始されます。

Process process = new Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo();

processStartInfo.CreateNoWindow = true;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

// ..

process.Start();

以前は断続的にエラーが発生していましたが、

Win32Exception exception has occured  Message: No such interface supported
ErrorCode: 80004005  NativeErrorCode: 80004002

これが発生したとき、コンソールアプリケーションがまったく起動しないことを証明しました。

この上のコードに追加しました、

processStartInfo.UseShellExecute = false;

そして、問題は解決しました(これまでのところ、指が交差しています)。この変更を行うことで、実行に有効なデスクトップコンテキストが必要ないことを理解していますが、それは正確にはどういう意味ですか。デスクトップがない場合(システムユーザーで実行されているIISアプリプールに適用されます)に上記のコードを実行できない場合、毎回失敗するのではなく、過去に実行されていたのはなぜですか?

なぜこれが違いを生むのか誰かが知っていますか?このコンテキストでサポートされているインターフェイスがないということはどういう意味ですか?

アップデート:

私は人々が言っ​​たことすべてを取り入れ、自分自身でさらに調査を行いました。したがって、UseShellExecute = true(デフォルト)がある場合を要約すると、shell32.dllのShellExecuteEXを呼び出してプロセスを実行します。これは実際に行われます(ILSpyを使用してSystem.dllからコピーされます)。

public bool ShellExecuteOnSTAThread()
{
    if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
    {
        ThreadStart start = new ThreadStart(this.ShellExecuteFunction);
        Thread thread = new Thread(start);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
    }
    else
    {
        this.ShellExecuteFunction();
    }
    return this._succeeded;
}

UseShellExecute = falseの場合、kernel32.dllのCreateProcessを呼び出してプロセスを開始します。

上記のコードShellExecuteOnSTAThreadが新しいスレッドを作成しているという事実に問題があるかどうか疑問に思いましたか?アプリプールは、間接的にWin32Exceptionを引き起こす可能性のあるスレッドの制限に達する可能性がありますか?

4

1 に答える 1

8

このエラーは、特定のCOMオブジェクトが登録されていない場合に発生する可能性がありますが、断続的である理由は少し謎です。

ただし、公平を期すために、IIS内からローカル実行可能ファイルを生成することは非常にまれなことであり、実際にセキュリティの問題を引き起こす可能性があります。または、コマンドが何らかの理由で失敗して制御が戻らない場合は、少なくともIISで問題が発生する可能性があります。システムに。

実際には、そのようなもののベストプラクティスは、レジストリ、データベース、またはある種の設定ファイル内で実行する必要のあるアクションを記録し、ローカルアプリケーションをスケジュールされたタスクまたはWindowsサービスとして実行することです。

参考までに、UseShellExecは、カーネルがexeを直接起動する必要があるかどうか、またはエクスプローラーにファイルを起動するように要求する必要があるかどうかを示します。

ログインしているユーザーがいない場合にこの問題が発生する可能性があるため、exeを起動するためにシェルがロードされているとは限りません。

ただし、最終的には、現在実行しようとしていることは本番環境では悪いことです。このexeを起動しようとしたときにIISの状態を保証することはできません。そのため、IISはシェルではありません。

于 2012-04-19T23:57:14.650 に答える