Asp.net CMD安全问题

时间:2011-09-19 12:03:35

标签: c# asp.net windows-server-2008

我在Windows 2008服务器上遇到权限问题。我有一个命令行实用程序,我需要运行它来将一些标准文件转换为CSV文件。这反过来用于将数据导入我的SQL数据库。我能够在我的2003服务器上完成工作,但我的Windows 2008服务器不允许代码运行。下面是代码的淡化版本。基本上在这个例子中我只是试图运行一个简单的命令。但我一直拒绝输出访问。我该如何纠正?

public partial class _Bank : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}


protected void btn_Click(object sender, EventArgs e)
{

    ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe");
    processStartInfo.RedirectStandardInput = true;
    processStartInfo.RedirectStandardOutput = true;
    processStartInfo.UseShellExecute = false;
    processStartInfo.RedirectStandardError = true;  

    Process process = Process.Start(processStartInfo);

    if (process != null)
    {

       process.StandardInput.WriteLine("dir");

       process.StandardInput.Close();
       string outputString = process.StandardOutput.ReadToEnd();
       Response.Write(outputString);

       string error = process.StandardError.ReadToEnd();
       Response.Write(error);

    }

}
private string ProcessRunner()
{
    ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe");
    processStartInfo.RedirectStandardInput = true;
    processStartInfo.RedirectStandardOutput = true;
    processStartInfo.UseShellExecute = false;

    Process process = Process.Start(processStartInfo);

    if (process != null)
    {

        //process.StandardInput.WriteLine("This is a test line");
        process.StandardInput.WriteLine("c:\\");
        process.StandardInput.WriteLine("This is a test line");

        process.StandardInput.Close(); // line added to stop process from hanging on     ReadToEnd()

        string outputString = process.StandardOutput.ReadToEnd();
        Response.Write(outputString);
        return outputString;

    }

    return string.Empty;
}

public static int ExecuteCommand(string Command, int Timeout)
{
    int ExitCode;
    ProcessStartInfo ProcessInfo;
    Process Process;

    ProcessInfo = new ProcessStartInfo("cmd.exe", "/C " + Command);
    ProcessInfo.CreateNoWindow = true;
    ProcessInfo.UseShellExecute = false;
    Process = Process.Start(ProcessInfo);
    Process.WaitForExit(Timeout);
    ExitCode = Process.ExitCode;
    Process.Close();

    return ExitCode;
}
}

1 个答案:

答案 0 :(得分:1)

这是在带有App-Pool的asp.net应用程序中运行的。 App-Pool有一个身份(LocalSystem,Network Service等)执行此过程。 确保此用户对您计划访问的文件夹具有必要的权限。

恕我直言:出于安全原因,在Web应用程序中启动另一个进程并非最佳做法,绝不应在Internet Web应用程序上进行。

编辑: 通常,用户名为ASPNET或IWAM_ [Servername](IWAM _... Internet Information Services的内置帐户,用于启动流程外应用程序)。只需授予该用户访问该文件夹的权限。