3

このコードが開発用コンピューター (win7 32 ビット) とターゲット サーバー (2008r2 64 ビット) でコンソール アプリとして完全に実行される理由。しかし、ターゲット サーバーで Web サービスとして実行しようとしても、何もしません。エラーなし、何もありません。

外すと

exitMsg = proc.StandardOutput.ReadToEnd();

その後、エラーで失敗します:

System.InvalidOperationException: 要求された情報を特定するには、プロセスを終了する必要があります。

   [WebMethod]
    public string GetRunningProcesses()
    {
        ProcessStartInfo pInfo = new ProcessStartInfo();
        pInfo.FileName = @"E:\bin\PsList.exe";        
        pInfo.WindowStyle = ProcessWindowStyle.Hidden;
        pInfo.CreateNoWindow = true;
        pInfo.UseShellExecute = false;
        pInfo.RedirectStandardOutput = true;

        string exitMsg = "";
        int exitCode = 1;

        using (Process proc = Process.Start(pInfo))
        {
            exitMsg = proc.StandardOutput.ReadToEnd();
            proc.WaitForExit(1000);
            exitCode = proc.ExitCode;
        }

        return exitMsg;
    }

コードが実行されるユーザーについて何かがあるに違いないと思います。Web サービスとして、このコードは asp.net ユーザーの下で実行されるため、問題が発生する可能性があります。

これを修正する方法を教えてください。どうもありがとうございました。

解決済み


問題は EULA ダイアログにあり、ポップアップが表示されましたが、ProcessStartInfo 設定のために表示されませんでした。この Web サービスのアプリケーション プールにも使用されているアカウントで CMD 経由で PsList.exe を実行すると、EULA 契約を求めるプロンプトが表示され、その後はすべて正常に動作します。

奇妙なことに、「pInfo.Arguments = "/accepteula";」があることです。私の実際のコードで。これは私の問題を防ぐはずですが、そうではなく、理由がわかりません。理由を知っている方がいましたら教えてください。

大変お世話になりました。あなたはここにいる本当に良い人々です。

4

3 に答える 3

2

私はあなたの唯一の問題は次のことだと思います:

proc.WaitForExit(1000);

これは、プロセスが終了するまで1秒待つようにプログラムに指示します。お使いのマシンでは、プロセスは正常に終了します。ただし、別のマシンでは、さらに時間がかかる場合があります。次のように変更してみてください:

proc.WaitForExit();

プログラムが終了するまで無期限に待機します。

また、プロセスの出力をリダイレクトして、プログラミングがハングしているか、他の何か(この場合はコード)を待っているかどうかを確認することもできます。

さらに、プロセスがエラーに遭遇し、StandardErrorではなくにメッセージを書き込んでいる可能性がありますStandardOutput。それを設定pInfo.RedirectStandardError = true;して読んでみて、足りないものがあるかどうかを確認してください。

于 2011-06-30T19:43:52.830 に答える
1

問題は、ポップアップしたEULAダイアログにありましたが、ProcessStartInfo設定のために表示されませんでした。このWebサービスのアプリケーションプールにも使用されているアカウントでCMDを介してPsList.exeを実行すると、EULA契約の入力を求められ、その後はすべて正常に機能します。

奇妙なことに、私は「pInfo.Arguments ="/accepteula";」を持っています。私の実際のコードでは。これは私のprobemを防ぐはずですが、それはできませんでした。理由はわかりません。理由をご存知の方がいらっしゃいましたら、教えてください。

助けてくれてありがとう。あなたはここで本当に良い人です。

于 2011-07-01T06:45:22.677 に答える