0

ASP.NET Web サイトから古い .NET アプリケーションを実行しようとしています。WebとStackoverflowを読んだ後(同様の問題について)、次のコードにたどり着きました。問題は、常にエラー コードが表示されることです (テスト目的のためだけに管理者アカウントを使用しています)。exeを手動で実行すると、問題なく動作します。

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 結果変数は空です。IIS 7.0 で Windows 2008 を使用していますが、例外はスローされません。

前もって感謝します、

エセキエル

4

8 に答える 8

4

これをしないでください。これは単なる汚れであり、ASP.NET から実行するべきではありません

  1. Windows サービスを作成する
  2. リクエストをキューに格納する
  3. サービスはキューをポーリングして処理する必要があります。必要に応じて、exe を実行します。サービスを別のサーバーにとどめることをお勧めします。

これをしないでください。これは非常に悪いことであり、スケーラブルではなく、Web サーバーにとって悪いことです。

しないでください

しないでください

しないでください

于 2009-06-24T17:18:50.967 に答える
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;
                }
            }
        }
    }
于 2014-09-13T10:07:26.827 に答える
1

私がすることは、ms sql ジョブによって実行可能ファイルを呼び出すことです。実行可能ファイルは、SQL サーバー エージェント サービス アカウントとして実行されます。

  1. 新しい SQL サーバー ジョブを作成する
  2. 求人プロパティの一般ページで名前を付けます
  3. ステップ ページで、オペレーティング システム (CmdExec) タイプの新しいステップを作成します。
  4. コマンドを指定し、[OK] をクリックしてジョブ パラメータを保存します。

新しいジョブは、EXEC msdb.dbo.sp_start_job @jobname を使用して呼び出すことができます。ここで、@jobname は、開始するジョブの名前を持つ変数です。

このジョブが開始されると、exe の UI は非表示になり、表示されないことに注意してください。ただし、タスクマネージャーで見つけることができます。

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

于 2012-07-23T18:46:13.217 に答える
1

使用する場合

proc.StartInfo.RedirectStandardOutput = true;

次に、呼び出しの前ではなく、プロセスの実行時にストリームを読み取る必要があります

proc.WaitForExit();

標準エラーストリームについても同様です。詳細については、MSDNドキュメントを参照してください。

于 2009-06-24T18:00:35.513 に答える
1

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

waitforexit() 呼び出しの前に読み取る必要があるため、次のようにする必要があります。

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

于 2009-06-24T18:46:51.770 に答える
0

proc.StartInfo.LoadUserProfile管理者のユーザープロファイルがレジストリに読み込まれるように、プロパティをに設定する必要がある場合がありtrueます(AFAIKこれはデフォルトでは発生しません)。

また、「hello world」プログラムを実行して、問題がプロセスの実際の作成にあるのか、プロセス自体に指定されたコンテキストでの実行に問題があるのか​​を確認することも教育的かもしれません。

最後に、問題が発生する可能性のある場所を絞り込むための手順として、管理者またはシステムの資格情報を使用してASP.NETプロセス自体を実行し、ASP.NETインスタンスが実行されているアカウントのアクセス許可に何かがあるかどうかを確認することをお勧めします。は問題の一部です(ただし、これはトラブルシューティングのためにのみ行ってください)。

于 2009-06-24T17:09:43.227 に答える
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);
    }
于 2012-01-31T11:23:54.263 に答える