Проблема безопасности Asp.net CMD - PullRequest
0 голосов
/ 19 сентября 2011

У меня проблемы с разрешениями на сервере 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 Ответ

1 голос
/ 19 сентября 2011

Это выполняется в приложении asp.net с App-Pool.У пула приложений есть удостоверение (LocalSystem, Network Service и т. Д.), Этот процесс выполняется.Убедитесь, что у этого пользователя есть необходимые права доступа к папкам, к которым вы планируете получить доступ.

ИМХО: по соображениям безопасности запуск другого процесса в веб-приложении не является наилучшей практикой и никогда не должен выполняться в веб-приложениях Интернета.,

РЕДАКТИРОВАТЬ: Обычно пользователь называется ASPNET или IWAM_ [имя_сервера] (IWAM _... встроенная учетная запись для служб IIS для запуска вне приложений процесса).Просто дайте доступ к папке этому пользователю.

...