Попытка вызвать командную строку, исполняемую в среде C # / ASP.NET / IIS 7.5 / Win7 - PullRequest
4 голосов
/ 25 января 2012

На сервере я пытаюсь открыть командную строку и вызвать исполняемый файл, который преобразует файл в PDF. Для этого я использую программу с открытым исходным кодом PDFCreator.

В C # я звоню с этим кодом:

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

    process.StandardInput.WriteLine(@"cd c:\program files (x86)\pdfcreator");
    process.StandardInput.WriteLine(@"PDFCreator.exe /PF""c:\dwf\dwf.dwf""");

Работает без ошибок, но безрезультатно. Этот PDFCreator.exe выполняет вызов другой программы - Autodesk Design Review, которая использует драйвер PDF для печати в PDF и сохраняет файл. Команда, которую вы видите, прекрасно работает, если я запускаю ее самостоятельно.

Из-за того, что я обыскиваю другие темы, похоже, проблема в безопасности Поэтому я перешел к папкам / исполняемым файлам PDFCreator и Design Review и получил полный доступ к учетной записи NETWORK, NETWORK SERVICE, IIS_WPG, IIS_IUSRS и ASP.NET Machine (понимаю, что это, вероятно, поток безопасности, но отключится, как только я выясню источник проблема). Это не помогло.

Следует отметить, что я могу изменить каталог с помощью первой команды, приведенной выше, а затем создать папку «test123» в папках PDFCreator и Design Review. Кажется, я здесь подхожу, есть идеи?

Ответы [ 4 ]

2 голосов
/ 25 января 2012

Комментарии SteveCalPoly и Val Akkapeddi очень интересны.
Во всяком случае, я использую следующие методы для запуска исполняемого файла с командной строкой

    /// <summary>
    /// Executes a shell command synchronously.
    /// </summary>
    /// <param name="command">string command</param>
    /// <returns>string, as output of the command.</returns>
    public void ExecuteCommandSync(object command)
    {
        try
        {
            // create the ProcessStartInfo using "cmd" as the program to be run,
            // and "/c " as the parameters.
            // Incidentally, /c tells cmd that we want it to execute the command that follows,
            // and then exit.
            System.Diagnostics.ProcessStartInfo procStartInfo =
                new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);

            // The following commands are needed to redirect the standard output.
            // This means that it will be redirected to the Process.StandardOutput StreamReader.
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;
            // Do not create the black window.
            procStartInfo.CreateNoWindow = true;
            // Now we create a process, assign its ProcessStartInfo and start it
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = procStartInfo;
            proc.Start();
            // Get the output into a string
            string result = proc.StandardOutput.ReadToEnd();
            // Display the command output.
            Console.WriteLine(result);
        }
        catch (Exception objException)
        {
            // Log the exception
        }
    }
    /// <summary>
    /// Execute the command Asynchronously.
    /// </summary>
    /// <param name="command">string command.</param>
    public void ExecuteCommandAsync(string command)
    {
        try
        {
            //Asynchronously start the Thread to process the Execute command request.
            Thread objThread = new Thread(new ParameterizedThreadStart(ExecuteCommandSync));
            //Make the thread as background thread.
            objThread.IsBackground = true;
            //Set the Priority of the thread.
            objThread.Priority = ThreadPriority.AboveNormal;
            //Start the thread.
            objThread.Start(command);
        }
        catch (ThreadStartException objException)
        {
            // Log the exception
        }
        catch (ThreadAbortException objException)
        {
            // Log the exception
        }
        catch (Exception objException)
        {
            // Log the exception
        }
    }
0 голосов
/ 26 января 2012

Обнаружена проблема при сбое сервера.Приложение, которое я вызывал, должно открыть другое приложение на рабочем столе и затем распечатать в PDF.IIS не может открывать программы на рабочем столе, если на вкладке services --> service name --> log не установлено значение.

К сожалению, вызываемое мной приложение не отображается на панели служб, поэтому в данный момент я снова застрял, но по крайней мере знаюэто не проблема C #.

0 голосов
/ 25 января 2012

Возможно, ошибки поступают в поток StandardError, и вы их никогда не видите?

Кроме того, почему бы не вызвать PDFCreator.exe напрямую, а не через cmd.exe?

Попробуйте что-то вродеэто

ProcessStartInfo processStartInfo = new ProcessStartInfo(@"c:\program files (x86)\pdfcreator");
processStartInfo.Arguments = @"/PF""c:\dwf\dwf.dwf"""
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
processStartInfo.UseShellExecute = false;
Process process = Process.Start(processStartInfo);

// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
string errors = p.StandardError.ReadToEnd();
0 голосов
/ 25 января 2012

В классе System.Diagnostics.Process есть метод WaitForExit (), который будет ожидать завершения запуска запущенного процесса, а затем вернет свой код возврата.

Попробуйте создать пакетный файл с вашими командамиа затем запустить пакетный файл через класс Process.Что произойдет, если вы используете Process.WaitForExit ();после вызова Process.Start (processInfo);?Есть ли вообще код возврата от process.WaitForExit ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...