2009-06-24 32 views
0

ASP.NET Webサイトから古い.NETアプリケーションを実行しようとしています。 WebとStackoverflow(同様の問題)を読んだ後、私は次のコードに行きます。 問題は、私は常にエラーコードを取得することです(私は管理目的のアカウント をテスト目的に使用しています)。 exeファイルを手動で実行すると問題なく動作します。私が手EXEファイルを実行しているASP.NET

private void Execute(string sPath) 
{ 
    System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
    proc.StartInfo.UserName = "administrador"; 
    string pass = "............."; 

    System.Security.SecureString secret = new System.Security.SecureString(); 
    foreach (char c in pass) secret.AppendChar(c); 

    proc.StartInfo.Password = secret; 
    proc.StartInfo.WorkingDirectory = ConfigurationManager.AppSettings["WORKINGDIRECTORY"].ToString(); 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.RedirectStandardError = true; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.FileName = sPath; 
    proc.Start(); 
    proc.WaitForExit(); 
    string result = proc.StandardOutput.ReadToEnd(); 
    Response.Write(result + " - " + proc.ExitCode); 
    proc.Close(); 
} 

}

終了コードは次のとおりです。-1066598274 結果変数が空です。 例外が、私はあなたがそう、管理者のユーザープロファイルのものがロードされtrueproc.StartInfo.LoadUserProfileプロパティを設定する必要がありますIIS 7.0とWindows 2008のに事前に

おかげで、

エセキエル

+0

私はIIS7でW2K8を使用しています – Ezequiel

+0

"エラーコード"を取得してください。 Exceptionをキャッチした後、ex.ToString()の結果をポストすることで、すべてのInnerExceptionを含む完全な例外をポストしてください。 –

+0

また、あなたの質問を編集し、コメントを残さないでください。 –

答えて

0

を使用しています をスローされませんレジストリ(AFAIKこれはデフォルトでは発生しません)。

また、「hello world」プログラムを実行して、問題がプロセスを作成しているかどうか、またはプロセス自体が与えられたコンテキストで問題が発生しているかどうかを確認することができます。

最後に、問題がどこにあるかを絞り込むためのステップとして、管理者またはシステムの資格情報でASP.NETプロセス自体を実行して、アカウントのアクセス許可インスタンスが問題の一部です(ただし、トラブルシューティングのためにのみ実行してください)。

+0

あなたの答えをありがとう、loadUserProfileを追加しました。私は別の形でcmd.exeの.exeを変更しましたが、同じ終了コードが表示されます。他のアイデア? – Ezequiel

4

これを行わないでください。これは単なる汚れていると、Windowsのサービス

  • ストアキュー
  • サービスはキューやプロセスをポーリングすべきでリクエストを書くASP.NET

    1. から行われるべきではありません。必要に応じてexeを実行します。サービスは別のサーバーに存在することを推奨します。

    これを行わないでください。これは

    をしないでください

    をしないWebサーバのための非常に悪いではなく、スケーラブルな、悪いではありません

  • +0

    これに同意します。 –

    1

    あなたは

    proc.StartInfo.RedirectStandardOutput = true; 
    

    、あなたを使用する場合、呼び出し前ではなくプロセスが実行されるときにストリームを読み取る必要があります。

    proc.WaitForExit(); 
    

    標準エラーストリームと同じです。詳細はMSDNのドキュメントをご覧ください。

    1

    最後に出力の読みを並べ替える必要があります。

    あなたが持っている必要がありますので、それは、あなたがwaitforexit()呼び出しの前に読むことを想定しています

     
    proc.Start(); 
    string result = proc.StandardOutput.ReadToEnd(); Response.Write(result + " - " + proc.ExitCode); proc.WaitForExit(); 
    proc.Close(); 
    

    1

    をあなたが言うように、あなたが実行しようとしているアプリケーションは、本当にあなたの.NETアプリケーションである場合別のプロセスで実行する必要はありません。代わりに、.NET実行ファイルもアセンブリであるという事実を利用できます。 Visual Studioでは、.exeで終わるアセンブリを参照させることはできませんが、コマンドラインコンパイラはこれを実行します。

    コマンドラインコンパイラを使用して、実行可能アセンブリを単に参照するラッパーアセンブリを作成し、通常はMain()メソッドを呼び出し、通常指定するコマンドラインパラメータの文字列配列を渡します。終了コードは、Mainメソッドの整数戻り値になります。次に、ASP.NETアプリケーションからラッパーアセンブリを呼び出すことができます。

    実行可能ファイルの種類とコンソールとの対話方法によっては、この方法がまったく機能しないことがあります。しかし、それがあなたのケースではうまくいけば、それは別のプロセスをスピンアップするよりもはるかに優れているはずです。コードの下

    0

    用途:

    ProcessStartInfo info = new ProcessStartInfo("D:\\My\\notepad.exe"); 
        info.UseShellExecute = false; 
        info.RedirectStandardInput = true; 
        info.RedirectStandardError = true; 
        info.RedirectStandardOutput = true; 
        //info.UserName = dialog.User; 
        info.UserName = "xyz"; 
        string pass = "xyz"; 
        System.Security.SecureString secret = new System.Security.SecureString(); 
        foreach (char c in pass) 
         secret.AppendChar(c); 
        info.Password = secret; 
        using (Process install = Process.Start(info)) 
        { 
         string output = install.StandardOutput.ReadToEnd(); 
         install.WaitForExit(); 
         // Do something with you output data   
         Console.WriteLine(output); 
        } 
    
    +0

    あなたがしていることを説明することは、常に面白いことです...ちょうどコードをダンプすることはずっと少ないです。 – Styxxy

    +0

    コードは私が推測する自己説明的です! – logical

    +0

    コードはたくさん説明しますが、トピックスターターとは何を変えたのか、なぜそれをしたのかについては言及する必要があります。コードをダンプするだけでは、人を完全に助ける方法ではありません。 – Styxxy

    1

    私は何をすべきかは、MS SQLジョブによって呼び出された実行可能ファイルを持っていることです。 実行ファイルはSQL Serverエージェントサービスアカウントとして実行されます。

    1. 型オペレーティングシステムの新しいステップを作成し、
    2. は、ジョブプロパティの一般的なページの手順ページで
    3. に、名前を付けて新しいSQL Serverジョブを作成します(のCmdExec)
    4. Speeifyコマンドジョブを保存するために[OK]をクリックし、新しいジョブが@jobnameが 開始したいジョブの名前を持つ変数であるEXEC msdb.dbo.sp_start_jobの@jobnameを使用して呼び出すことができ

    パラメータ。

    このジョブが開始されると、exeのUIは非表示になり、表示されません。タスクマネージャで見つけることができます。

    私はいくつかのアプリケーション、特にWebページでは実行できない時間のかかる操作でこのメソッドを使用しました。

    2
    protected void btnSubmit_Click(object sender, System.EventArgs e) 
        { 
         if (Page.IsValid) 
         { 
          litMessage.Visible = true; 
    
          System.Diagnostics.Process oProcess = null; 
    
          try 
          { 
           string strRootRelativePathName = "~/Application.exe"; 
    
           string strPathName = 
            Server.MapPath(strRootRelativePathName); 
    
           if (System.IO.File.Exists(strPathName) == false) 
           { 
            litMessage.Text = "Error: File Not Found!"; 
           } 
           else 
           { 
            oProcess = 
             new System.Diagnostics.Process(); 
    
            oProcess.StartInfo.Arguments = "args"; 
    
            oProcess.StartInfo.FileName = strPathName; 
    
            oProcess.Start(); 
    
            oProcess.WaitForExit(); 
    
            System.Threading.Thread.Sleep(20000); 
    
            litMessage.Text = "Application Executed Successfully..."; 
           } 
          } 
          catch (System.Exception ex) 
          { 
           litMessage.Text = 
            string.Format("Error: {0}", ex.Message); 
          } 
          finally 
          { 
           if (oProcess != null) 
           { 
            oProcess.Close(); 
            oProcess.Dispose(); 
            oProcess = null; 
           } 
          } 
         } 
        } 
    
    関連する問題