Я пытаюсь получить доступ к командной строке и выполнить команду, а затем вернуть результат на мою страницу 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);
}
}





Скорее всего, у вас проблема с разрешениями. Пользователь, под которым запускается процесс ASP.NET, имеет очень ограниченные права.
Итак, вы должны либо установить соответствующие разрешения для этого пользователя, либо запустить ASP.NET от имени другого пользователя.
Однако это скрывает риски безопасности, поэтому вы должны быть очень осторожны.
Возникла проблема с синтаксисом аргументов командной строки для cmd.exe. Вот почему cmd никогда не завершается. Чтобы cmd.exe запустил программу, а затем завершил работу, вам необходимо отправить ему синтаксис «/ c [команда]». Попробуйте запустить тот же код со строкой
si.StartInfo.Arguments = "dir";
заменен на
si.StartInfo.Arguments = "/c dir";
и посмотрите, работает ли это.
Спасибо большое! Прекрасно работает. Я на самом деле использую, чтобы взаимодействовать по необходимости.
Это безумие! Используйте пространство имен System.IO, чтобы создать список файлов внутри вашей программы на C#! Сделать это очень просто; хотя у этого метода также есть проблемы с авторизацией.
Я думаю, что это был просто пример, а не предполагаемое использование.
Это меня рассмешило - проницательная!
Используйте 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 для запуска команд против воли.
Если бы проблема была в разрешениях, программа не зависала бы - это вызвало бы исключение. Он говорит, что программа зависает и никогда не завершает работу.