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.NET MVC 3 和 IIS 7.5

当我在本地计算机(Windows 7)上运行此代码时,它运行良好。

当我在我的服务器 (Windows Server 2008 R2) 上运行此代码时,它不起作用。进程启动但批处理文件未执行且进程没有任何 StandardOutput 或 StandardError。我无法获得任何信息,也没有错误。

如果我没有指定任何用户名和密码,它可以在我的服务器上运行。批处理文件使用我的网络服务帐户执行。

我真的需要使用特定的用户名执行该过程。

你知道为什么它不起作用吗?

---编辑:微软支持找到了解释

由于 Windows Vista 和会话隔离,服务和用户应用程序在不同的会话中执行。

Windows 不允许使用其他凭据执行从会话到另一个会话的进程。该过程将使用会话的默认凭据(AppPool 凭据)执行。

更多信息在这里这里

4

1 回答 1

0

你试过myProcess.StartInfo.CreateNoWindow = true;吗?

我曾经发现过这段很棒的代码(我猜在这里)对我来说很好用:

    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 回答