Запуск командной строки со страницы ASPX и возврат вывода на страницу

Я пытаюсь получить доступ к командной строке и выполнить команду, а затем вернуть результат на мою страницу aspx. Хорошим примером будет запуск dir при загрузке страницы aspx и возврат вывода через Response.Write (). Я пробовал использовать приведенный ниже код. Когда я пытаюсь отладить это, он запускается, но никогда не завершает загрузку и вывод не выводится. Я использую C# и .NET Framework 3.5sp1. Любая помощь очень ценится.

Спасибо, Брайан

public partial class CommandLine : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        System.Diagnostics.Process si = new System.Diagnostics.Process();
        si.StartInfo.WorkingDirectory = @"c:\";
        si.StartInfo.UseShellExecute = false;
        si.StartInfo.FileName = "cmd.exe";
        si.StartInfo.Arguments = "dir";
        si.StartInfo.CreateNoWindow = true;
        si.StartInfo.RedirectStandardInput = true;
        si.StartInfo.RedirectStandardOutput = true;
        si.StartInfo.RedirectStandardError = true;
        si.Start();
        string output = si.StandardOutput.ReadToEnd();
        si.Close();
        Response.Write(output);
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
31 086
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Скорее всего, у вас проблема с разрешениями. Пользователь, под которым запускается процесс ASP.NET, имеет очень ограниченные права.

Итак, вы должны либо установить соответствующие разрешения для этого пользователя, либо запустить ASP.NET от имени другого пользователя.

Однако это скрывает риски безопасности, поэтому вы должны быть очень осторожны.

Если бы проблема была в разрешениях, программа не зависала бы - это вызвало бы исключение. Он говорит, что программа зависает и никогда не завершает работу.

configurator 29.10.2008 20:33
Ответ принят как подходящий

Возникла проблема с синтаксисом аргументов командной строки для cmd.exe. Вот почему cmd никогда не завершается. Чтобы cmd.exe запустил программу, а затем завершил работу, вам необходимо отправить ему синтаксис «/ c [команда]». Попробуйте запустить тот же код со строкой

        si.StartInfo.Arguments = "dir";

заменен на

        si.StartInfo.Arguments = "/c dir";

и посмотрите, работает ли это.

Спасибо большое! Прекрасно работает. Я на самом деле использую, чтобы взаимодействовать по необходимости.

user32474 29.10.2008 21:54

Это безумие! Используйте пространство имен System.IO, чтобы создать список файлов внутри вашей программы на C#! Сделать это очень просто; хотя у этого метода также есть проблемы с авторизацией.

Я думаю, что это был просто пример, а не предполагаемое использование.

Ben Scheirman 29.10.2008 20:45

Это меня рассмешило - проницательная!

pfeds 26.09.2013 06:29

Используйте System.Diagnostics.Process.

Вот пример оболочки кода ASP.NET для запуска команд подрывной деятельности в командной строке.

    ///////////////////////////////////////////////////////////////////////
    public static string run_svn(string args_without_password, string svn_username, string svn_password)
    {
        // run "svn.exe" and capture its output

        System.Diagnostics.Process p = new System.Diagnostics.Process();
        string svn_path = Util.get_setting("SubversionPathToSvn", "svn");
        p.StartInfo.FileName = svn_path;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;

        args_without_password += " --non-interactive";
        Util.write_to_log ("Subversion command:" + svn_path + " " + args_without_password);

        string args_with_password = args_without_password;

        if (svn_username != "")
        {
            args_with_password += " --username ";
            args_with_password += svn_username;
            args_with_password += " --password ";
            args_with_password += svn_password;
        }

        p.StartInfo.Arguments = args_with_password;
        p.Start();
        string stdout = p.StandardOutput.ReadToEnd();
        p.WaitForExit();
        stdout += p.StandardOutput.ReadToEnd();

        string error = p.StandardError.ReadToEnd();

        if (error != "")
        {
            Util.write_to_log(error);
            Util.write_to_log(stdout);
        }

        if (error != "")
        {
            string msg = "ERROR:";
            msg += "<div style='color:red; font-weight: bold; font-size: 10pt;'>";
            msg += "<br>Error executing svn.exe command from web server.";
            msg += "<br>" + error;
            msg += "<br>Arguments passed to svn.exe (except user/password):" + args_without_password;
            if (error.Contains("File not found"))
            {
                msg += "<br><br>***** Has this file been deleted or renamed? See the following links:";
                msg += "<br><a href=http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html>http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html</a>";
                msg += "<br><a href=http://subversion.open.collab.net/articles/best-practices.html>http://subversion.open.collab.net/articles/best-practices.html</a>";
                msg += "</div>";
            }
            return msg;
        }
        else
        {
            return stdout;
        }
    }

Спасибо, я на самом деле делаю что-то похожее, используя строку cmd для запуска команд против воли.

user32474 29.10.2008 21:57

Другие вопросы по теме