2

Process.Startを使用してバッチファイルを実行しようとしています

私は次のコードを使用しています:

Process myProcess = new Process();
myProcess.StartInfo.FileName = "D:\\test.bat";
myProcess.StartInfo.UserName = "user";
var strPass = new SecureString();

for (int i = 0; i < strUserPass.Length; i++)
    {
        strPass.AppendChar(strUserPass[i]);
    }
strPass.MakeReadOnly();

myProcess.StartInfo.Password = strPass;
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.StartInfo.RedirectStandardError = true;

myProcess.Start();

ASP.NETMVC3とIIS7.5を使用しています

このコードをローカルコンピューター(Windows 7)で実行すると、完全に機能します。

このコードをサーバー(Windows Server 2008 R2)で実行すると、機能しません。プロセスは開始されますが、バッチファイルは実行されず、プロセスにはStandardOutputまたはStandardErrorがありません。情報が得られず、エラーもありません。

ユーザー名とパスワードを指定しない場合、サーバーで機能します。バッチファイルは私のネットワークサービスアカウントで実行されます。

私は本当に特定のユーザー名でプロセスを実行する必要があります。

なぜそれが機能しないのか知っていますか?

---編集:Microsoftサポートが説明を見つけました

Windows Vista etセッションは分離されているため、サービスとユーザーアプリケーションは異なるセッションで実行されます。

Windowsでは、セッションから他の資格情報を持つ別のセッションへのプロセスを実行することはできません。プロセスは、セッションのデフォルトのクレデンシャル(AppPoolクレデンシャル)を使用して実行されます。

ここここでより多くの情報

4

1 に答える 1

0

試してみましたmyProcess.StartInfo.CreateNoWindow = true;か?

私はこの素晴らしいコードを一度見つけました(私はここでSOで推測します)これは私にとってうまく機能します:

    private bool RunProcess(string executableProgram, string arguments, int timeOut)
    {
        bool Result = false;
        int exitCode = 0;

        using (Process process = new Process())
        {
            process.StartInfo.FileName = executableProgram;
            process.StartInfo.Arguments = arguments;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

            StringBuilder output = new StringBuilder();
            StringBuilder error = new StringBuilder();

            using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
            using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
            {
                process.OutputDataReceived += (sender, e) =>
                {
                    if (e.Data == null)
                    {
                        outputWaitHandle.Set();
                    }
                    else
                    {
                        output.AppendLine(e.Data);
                    }
                };
                process.ErrorDataReceived += (sender, e) =>
                {
                    if (e.Data == null)
                    {
                        errorWaitHandle.Set();
                    }
                    else
                    {
                        error.AppendLine(e.Data);
                    }
                };

                process.Start();

                process.BeginOutputReadLine();
                process.BeginErrorReadLine();

                if (process.WaitForExit(timeOut) && outputWaitHandle.WaitOne(timeOut) && errorWaitHandle.WaitOne(timeOut))
                {
                    exitCode = process.ExitCode;
                    Result = (exitCode == 0);
                }
                else
                {
                    // Timed out.
                    Result = false;
                }
            }

            if (!string.IsNullOrEmpty(output.ToString()))
            {
                Logger.Info(output.ToString());
            }
            if (!string.IsNullOrEmpty(error.ToString()))
            {
                Logger.Error(error.ToString());
            }

        }
        return (Result);
    }
于 2012-05-14T07:50:58.450 に答える