vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ASP.NET, WebServices u. Remoting
batch 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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: batch auf Webserver ausführen 
Autor: tat1308
Datum: 16.03.11 12:26

Hallo, bitte Hilfe...

=====================================

Gruss
Tobias

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: batch auf Webserver ausführen 
Autor: ModeratorDaveS (Moderator)
Datum: 16.03.11 12:45

Tja, der Helpdesk in diesem Bereich ist etwas unterbesetzt. Und mit der Info "gar nix passiert" kann mann wenig anfangen. Entweder wird der Code gar nicht ausgeführt, oder es passiert eine Exception. Oder sonst was ist los. "gar nix" passiert gar nicht wenn man Code ausführt. Und nur du kannst das zB mit dem Debugger untersuchen. Und was ist "pdfmerge2.cmd"? Sollte man nicht irgendwelche Parameter übergeben? Es fällt mir übrigens auch ein, dass ein neuer Prozess nicht mit Thread-Identität läuft wenn man Impersonation verwendet, sondern mit der Identität des aufrufenden Prozesses. Siehe hier zB.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: batch auf Webserver ausführen 
Autor: Drapondur
Datum: 21.03.11 18:11

StdErr auch auslesen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: batch auf Webserver ausführen 
Autor: tat1308
Datum: 21.03.11 21:24

Werde ich tun und morgen früh berichten...

=====================================

Gruss
Tobias

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: batch auf Webserver ausführen 
Autor: tat1308
Datum: 22.03.11 09:53

...jetzt zur Fehlermeldung:

[u]hier noch mal der batch der ausgeführt wird:
==============================================================
net use T: /delete
net use T: \\SERVER\ORDNER /USER:SERVER\USER PW
copy T:\*.pdf \\web1\ae /Y
pdftk \\web1\ae\*.pdf cat output \\web1\AE\AE_GES.pdf
net use T: /delete
==============================================================

[u]Fehlerausgabe bei der Ausführung im Intranet:
==============================================================
C:\WINDOWS>net use T: /delete
C:\WINDOWS>net use T: \\ICHAS\HOME\AE /USER:ICHAS\TRUMPFH TOBIAS
C:\WINDOWS>copy T:\*.pdf \\web1\ae /Y
C:\WINDOWS>pdftk \\web1\ae\*.pdf cat output \\web1\AE\AE_GES.pdf
C:\WINDOWS>net use T: /delete"\\WEB1\AE"

CMD.EXE wurde mit dem oben angegebenen Pfad als aktuellem Verzeichnis gestartet.
UNC-Pfade werden nicht untersttzt.
Stattdessen wird das Windows-Verzeichnis als aktuelles Verzeichnis gesetzt.
Die Netzwerkverbindung konnte nicht gefunden werden.

Sie erhalten weitere Hilfe, wenn Sie NET HELPMSG 2250 eingeben.

Systemfehler 85 aufgetreten.
Der lokale Ger„tename wird bereits verwendet.
Das System kann das angegebene Laufwerk nicht finden.

Error: Failed to open PDF file:
\\web1\ae\*.pdf
Errors encountered. No output created.
Done. Input errors, so no output created.
Die Netzwerkverbindung konnte nicht gefunden werden.

Sie erhalten weitere Hilfe, wenn Sie NET HELPMSG 2250 eingeben.
================================================================================

Ich habe gegoogelt und herausgefunden, daß Systemfehler 85 bedeutet, daß Netzlaufwerke schon verbunden sind und nicht noch mal verbunden werden können. Was eigentlich Quatsch ist, da ich im batch ja erstmal vorab zur Sicherheit evt existierende Netzlaufwerke (hier T trenne/lösche.

Wie bekomme ich diesen batch zum Laufen???

=====================================

Gruss
Tobias

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: batch auf Webserver ausführen 
Autor: tat1308
Datum: 23.03.11 10:15

Hallo, Hilfeeeeeee bitte.

=====================================

Gruss
Tobias

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel