| |
ASP.NET, WebServices u. Remotingbatch auf Webserver ausführen | | | Autor: tat1308 | Datum: 15.03.11 17:29 |
| Hallo,
Win XP SP3, Visual Studio 10
Hoffentlich finde ich hier Hilfe, obwohl bestimmt dieses Thema schon mehrmal ausgelutscht wurde - aber ich bekomms nicht hin und benötige Hilfe.
Vorab Berechtigungen und Freigaben der Ordner sind gesetzt.
Hintergrund: Ich habe in einem Ordner 16 pdf-Dateien, die ich über eine Batchdatei zu einer PDF mache. Über den Click auf einen Button soll folgende Batch-Datei auf dem Webserver gestartet werden. Die Batch-Datei (pdfmerge.cmd) führt folgenden Befehl aus (Server sind in diesem Fall Ordner im Netzwerk):
pdftk \\server1\HOME\AE\*.pdf cat output \\server2\AE\AE_GES.pdf
auf der aspx seite:
Dim p As New Process
Dim psii As New ProcessStartInfo( _
"C:\AE\pdfmerge2.cmd")
psii.UseShellExecute = False
psii.RedirectStandardError = True
psii.RedirectStandardOutput = True
p.StartInfo = psii
p.Start() Das funktioniert lokal auf meinem Rechner prima, sobald ich aber die entsprechenden Dateien (aspx, cmd etc) auf den Webserver lege, passiert gar nix. Ich möchte ja nur, daß aus den 16 Dateien eine Datei wird, welches über die Batch-Datei automatisch generiert wird. Diese generierte Datei wird dann abgeholt und per Mail versendet. Ist auch alles schon programmiert, nur noch die Batch-Datei muss auf dem Webserver ausgeführt werden.
Der User kommt mit NT-Autorität/Netzwerkdienst rein und der Ordner hat in den Berechtigung den Netzwerkdienst mit vollen Berechtigungen.
Bitte helft mir.
=====================================
Gruss
Tobias | |
Re: batch auf Webserver ausführen | | | Autor: tat1308 | Datum: 16.03.11 12:26 |
| Hallo, bitte Hilfe...
=====================================
Gruss
Tobias | |
Re: batch auf Webserver ausführen | | | Autor: tat1308 | Datum: 16.03.11 15:21 |
| Nach Starten des Buttons auf dem Webserver und auf der Konsole laut pdfmerge2.cmd passiert folgendes:
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.
C:\AE>net use t: \\ichas\home\ae /user:SERVER\BENUTZER PASSWORT/persistent:no
C:\AE>copy T:\*.pdf c:\ae /Y
C:\AE>pdftk C:\AE\*.pdf cat output C:\AE\AE_GES.pdf
C:\AE>
C:\AE>exit
der dazugehörige Code in der aspx.vb sieht folgendermassen aus:
Dim strFilePath2 As String = "C:\AE\pdfmerge_xxx.cmd"
' Create the ProcessInfo object
Dim psi2 As New System.Diagnostics.ProcessStartInfo("cmd.exe")
psi2.UseShellExecute = False
psi2.RedirectStandardOutput = True
psi2.RedirectStandardInput = True
psi2.RedirectStandardError = True
psi2.WorkingDirectory = "C:\AE\"
' Start the process
Dim proc2 As System.Diagnostics.Process = _
System.Diagnostics.Process.Start(psi2)
'' Open the batch file for reading
Dim strm2 As System.IO.StreamReader = System.IO.File.OpenText( _
strFilePath2)
'' Attach the output for reading
Dim sOut2 As System.IO.StreamReader = proc2.StandardOutput
'' Attach the in for writing
Dim sIn2 As System.IO.StreamWriter = proc2.StandardInput
'' Write each line of the batch file to standard input
While strm2.Peek() <> -1
sIn2.WriteLine(strm2.ReadLine())
End While
strm2.Close()
'' Exit CMD.EXE
Dim stEchoFmt2 As String = "# {0} run successfully. Exiting"
sIn2.WriteLine([String].Format(stEchoFmt2, strFilePath2))
sIn2.WriteLine("EXIT")
' Close the process
proc2.Close()
'' Read the sOut to a string.
Dim results2 As String = sOut2.ReadToEnd().Trim()
'' Close the io Streams;
sIn2.Close()
sOut2.Close()
''Write out the results.
Dim fmtStdOut2 As String = "<font face=courier size=0>{0}</font>"
Me.Response.Write([String].Format(fmtStdOut2, results2.Replace( _
System.Environment.NewLine, "<br>")))
'
output3.Text = System.Security.Principal.WindowsIdentity.GetCurrent( _
).Name
output4.Text = results2 Jetzt ist es so, daß der Batch zwar gelesen, aber nicht ausgeführt wird.
Dieser o.g. Code wird lokal auf meinen Rechner korrekt ausgeführt, aber nicht auf dem Webserver. Die Ereignisanzeige des Webserver bringt auch keine Fehlermeldung. Egal, ob ich mit impersonate=true mit AdminUser und Passwort oder ohne arbeite, der Batch führt die Befehle nicht auf dem Webserver aus. Auch der Netzwerkdienst hat genügend Rechte. Auch die Lokalen Sicherheitsrichtlinien und die Gruppenrichtlinien sind so eingestellt, daß die entsprechenden User Stapelverarbeitungsprogrammen ausführen können. Ich weiß nicht mehr weiter.
Bitte Hilfe. Danke.
=====================================
Gruss
Tobias | |
Re: batch auf Webserver ausführen | | | Autor: Preisser | Datum: 16.03.11 17:30 |
| Hallo,
wieso liest du die Batch-Datei ein und schreibst die einzelnen Befehle an den stdin der cmd.exe, anstatt sie gleich mit der cmd.exe auszuführen? Hierzu gibt es beispielsweise den Parameter /c, damit die cmd.exe den Befehl ausführt und dann endet. Die Befehlszeile würde dann z.B. "cmd.exe /c pfad_zur_datei.cmd" lauten.
Wenn es dann irgendwelche Fehler beim Ausführen der Batch-Datei gibt, sollte die cmd.exe dies ja normalerweise in den stdout/stderr schreiben.
Mir ist auch aufgefallen, dass du die Process.Close()-Methode zum Beenden des Prozesses benutzt. Aber bricht die nicht den Proezss ab (bzw. löscht die Handles), ohne auf ihn zu warten? Wäre hier nicht .WaitForExit() o.ä. besser?
Beitrag wurde zuletzt am 16.03.11 um 17:46:19 editiert. | |
Re: batch auf Webserver ausführen | | | Autor: tat1308 | Datum: 17.03.11 08:10 |
| Hallo Konstantin,
vielen Dank, daß Du Dich diesem Thema angenommen hast...
Hintergrund des Schreibens ist, damit ich gleich sehen kann, ob der Befehl ausgeführt wird bzw. evt. Fehler gleich angezeigt werden. Denn beim Ausführen auf dem Webserver kann ich ja nicht debuggen und so sehe gleich auftretende Fehlermeldungen.
Wenn ich Dich jetzt richtig verstehe müsste in der Variablen strFilePath2 folgendes stehen:
Dim strFilePath2 As String = "c/ C:\AE\pdfmerge_xxx.cmd" Desweiteren müsste ich dies ergänzen, um den Process nicht abbrechen zu lassen:
' Create the ProcessInfo object
Dim psi2 As New System.Diagnostics.ProcessStartInfo("cmd.exe")
psi2.UseShellExecute = False
psi2.RedirectStandardOutput = True
psi2.RedirectStandardInput = True
psi2.RedirectStandardError = True
psi2.WorkingDirectory = "C:\AE\"
psi2.WaitForExit() Wenn ich Deinen Hinweisen nachgehe, würde dies einiges erklären. Dummerweise habe ich jetzt zwei Tage Urlaub und ich kann das gar nicht testen, um Rückinfo geben zu können - erst am kommenden Montag wieder.
Ist denn das so richtig wie ich es angegeben habe? Würde mich dann am Montag wieder melden.
Vielen Dank für Deine Hilfe.
=====================================
Gruss
Tobias | |
Re: batch auf Webserver ausführen | | | Autor: Preisser | Datum: 17.03.11 16:22 |
| Hallo,
die strFilePath2-Variable hattest du ja im letzten Post dafür benutzt, um die Datei manuell einzulesen und die Befehle an den Stanard-Input zu schreiben. Das ist hier aber nicht nötig, weil die cmd.exe die Datei ja von alleine ausführen kann. In einem der ProcessStartInfo-Konstrukturen kann man als 1. Argument den Dateinamen und als 2. Argument die Parameter angeben. Die Zeile müsste dann so aussehen:
Dim psi2 As New System.Diagnostics.ProcessStartInfo(
"cmd.exe", "/c C:\AE\pdfmerge_xxx.cmd") Die Zeile "psi2.RedirectStandardInput = True" ist dann wohl auch nicht mehr notwendig, da man ja keine Eingaben mehr senden muss.
Und der Code, der die cmd.exe Datei einlesen würde und die Zeilen nach stdin schreiben würde, ist dann auch nicht mehr nötig.
Das psi2.WaitForExit() dient dazu, den aktuellen Thread so lange anzuhalten, bis der Prozess beendet wurde. Wenn du allerdings sowiso aus dem stdout und stderr-Kanal lesen musst, ist das aber normalerweise nicht notwendig, sondern dann kannst du einfach solange aus dem InputStream des Prozesses lesen, bis dieser nichts mehr liefert (ist ja normalerweise eine blockierende Operation), allerdings ohne das .Close() davor. Sicherheitshalber würde ich es aber trotzdem mal mit dem WaitForExit() probieren.
Ich weiß jetzt nicht, ob man in .Net den stderr-Kanal gleich mit in den stdout-Kanal umleiten kann. Wenn nicht, könntest du mal probieren, anstatt vom stdout vom stderr-Kanal zu lesen (bzw. zusätzlich), da ja normalerweise die Fehlerausgabe in den stderr-Kanal geschrieben wird. Den bekommt man mit proc2.StandardError.
Beitrag wurde zuletzt am 17.03.11 um 16:26:16 editiert. | |
Re: batch auf Webserver ausführen | | | Autor: tat1308 | Datum: 21.03.11 16:05 |
| Hallo,
hier der Code den ich geändert habe. Der Batch wird zwar aufgerufen, aber nach wie vor nicht ausgeführt.
Dim strfilePath1 As String = "/c "
Dim strFilePath2 As String = "\\WEB1\AE\pdfmerge_xxx.cmd"
Dim strfilePath3 As String = strfilePath1 & strFilePath2
' Create the ProcessInfo object
Dim psi2 As New System.Diagnostics.ProcessStartInfo("cmd.exe", _
strfilePath3)
psi2.UseShellExecute = False
psi2.RedirectStandardOutput = True
'psi2.RedirectStandardInput = True
psi2.RedirectStandardError = True
psi2.WorkingDirectory = "\\WEB1\AE\"
' Start the process
Dim proc2 As System.Diagnostics.Process = _
System.Diagnostics.Process.Start(psi2)
proc2.WaitForExit()
'' Open the batch file for reading
Dim strm2 As System.IO.StreamReader = System.IO.File.OpenText( _
strFilePath2)
'' Attach the output for reading
Dim sOut2 As System.IO.StreamReader = proc2.StandardOutput
strm2.Close()
''Close the process
'proc2.Close()
' Read the sOut to a string.
Dim results2 As String = sOut2.ReadToEnd().Trim()
'Write out the results.
Dim fmtStdOut2 As String = "<font face=courier size=0>{0}</font>"
Me.Response.Write([String].Format(fmtStdOut2, results2.Replace( _
System.Environment.NewLine, "<br>")))
''
output3.Text = System.Security.Principal.WindowsIdentity.GetCurrent( _
).Name Ich werd noch wahnsinnig, an welchem Schräubchen soll ich denn jetzt noch drehen?
Ich muss den Batch übers Intranet aufrufen können.
[u]Und das steht in der Ausgabe der Website nach Ausführung des Batches:
C:\WINDOWS>net use T: \\SERVER\ORDNER /USER:SERVER\USER PW
C:\WINDOWS>pause
Drcken Sie eine beliebige Taste . . .
C:\WINDOWS>copy T:\*.pdf \\web1\ae /Y
C:\WINDOWS>pause
Drcken Sie eine beliebige Taste . . .
C:\WINDOWS>pdftk \\web1\ae\*.pdf cat output \\web1\AE\AE_GES.pdf
C:\WINDOWS>net use /delete T:
C:\WINDOWS>exit
Hier fehlen die Erfolgsmeldungen der Konsole.
=====================================
Gruss
Tobias
Beitrag wurde zuletzt am 21.03.11 um 16:15:41 editiert. | |
Re: batch auf Webserver ausführen | | | Autor: Drapondur | Datum: 21.03.11 18:11 |
| StdErr auch auslesen? | |
Re: batch auf Webserver ausführen | | | Autor: tat1308 | Datum: 21.03.11 21:24 |
| Werde ich tun und morgen früh berichten...
=====================================
Gruss
Tobias | |
Re: batch auf Webserver ausführen | | | Autor: tat1308 | Datum: 23.03.11 10:15 |
| Hallo, Hilfeeeeeee bitte.
=====================================
Gruss
Tobias | |
Re: batch auf Webserver ausführen | | | Autor: tat1308 | Datum: 23.03.11 22:48 |
| So, nach vielen Recherchen habe ich es jetzt herausgefunden:
zwei Registry Einträge mussten hinzugefügt werden
und die Datei pdfmerge... habe ich dem Windows Ordner hinzugefügt
und schon funzt es.
Danke nochmal an alle die mitgeholfen haben.
Ihr habt mich auf den richtigen Weg gebracht.
Danke.
=====================================
Gruss
Tobias | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|