4 Stimmen

Versuch des Aufrufs einer ausführbaren Eingabeaufforderung in einer C# / ASP.NET / IIS 7.5 / Win7 Umgebung

Auf dem Server versuche ich, die Eingabeaufforderung zu öffnen und eine ausführbare Datei aufzurufen, die eine Datei in PDF konvertiert. Hierfür verwende ich das Open-Source-Programm PDFCreator.

In C# rufe ich mit diesem Code auf:

    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""");

Er läuft ohne Fehler, liefert aber kein Ergebnis. Diese PDFCreator.exe ruft ein anderes Programm auf, Autodesk Design Review, das sich öffnet, den PDF-Treiber zum Drucken in PDF verwendet und die Datei speichert. Der Befehl, den Sie sehen, funktioniert gut, wenn er von mir eigenständig ausgeführt wird.

Nach Durchsicht anderer Threads scheint es, dass die Sicherheit mein Problem sein könnte. Ich bin also zu den Ordnern/Ausführungsdateien von PDFCreator und Design Review gegangen und habe vollen Zugriff auf NETWORK, NETWORK SERVICE, IIS_WPG, IIS_IUSRS und ASP.NET Machine Account gewährt (ich weiß, dass dies wahrscheinlich ein Sicherheitsthread ist, aber ich werde ihn deaktivieren, sobald ich die Ursache des Problems herausgefunden habe). Dies hat nicht geholfen.

Es sollte angemerkt werden, dass ich das Verzeichnis mit dem ersten Befehl oben ändern kann und dann einen "test123"-Ordner sowohl im PDFCreator als auch im Design Review-Ordner erstellen kann. Scheint so, als käme ich der Sache näher, haben Sie eine Idee?

2voto

Emanuele Greco Punkte 12113

Die Kommentare von SteveCalPoly und Val Akkapeddi sind sehr interessant.
Wie auch immer, ich verwende die folgenden Methoden, um eine ausführbare Datei mit der Eingabeaufforderung auszuführen

    /// <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
        }
    }

0voto

Adil B Punkte 12422

Die Klasse System.Diagnostics.Process verfügt über eine Methode namens WaitForExit(), die darauf wartet, dass der von ihr gestartete Prozess beendet wird, bevor sie fortfährt, und dann ihren Rückgabecode zurückgibt.

Versuchen Sie, eine Batch-Datei mit Ihren Befehlen zu erstellen und die Batch-Datei dann über die Klasse Process auszuführen. Was passiert, wenn Sie Process.WaitForExit(); verwenden, nachdem Sie Process.Start(processInfo); aufgerufen haben? Gibt es überhaupt einen Rückgabewert von process.WaitForExit()?

0voto

codeulike Punkte 21491

Vielleicht gehen die Fehler in den StandardError-Stream, so dass Sie sie nie sehen?

Und warum rufen Sie PDFCreator.exe nicht direkt auf, statt über cmd.exe?

Versuchen Sie etwas wie dies

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();

0voto

SteveCalPoly Punkte 151

Habe das Problem bei serverfault herausgefunden. Die Anwendung, die ich aufgerufen habe, muss eine andere Anwendung auf dem Desktop öffnen und dann als PDF drucken. IIS kann keine Programme auf dem Desktop öffnen, es sei denn, dies ist in den services --> service name --> log auf der Registerkarte.

Leider ist die App, die ich aufrufe nicht in der Dienste-Panel, so dass ich derzeit wieder stecken, aber zumindest weiß ich, es ist nicht ein C#-Problem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X