| |
 | Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
|
Autor
|
Thema: Steuerung eines DOS Programms (1707 mal gelesen)
|
Stelli1 Ehrenmitglied Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2010, Rasterdesign MapGuide 6.5 - 2010 Oracle 9i,10g Enterprise autodesk Topobase 2-2010 VS6, VS.net 2010
|
erstellt am: 10. Aug. 2009 10:44 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ich möchte aus einer Datenbank zur Steuerung der Benutzerrechte für einen Apache WebServer eine Datei "htusers" erzeugen. In der Datei steht User1:RxvCRMqtdryys User2:RxvCRMqtdryys Das Passwort ist verschlüsselt (so weit ich weiss als SHA1). Im Beispiel ist es das Passwort "test". Für den WebServer gibt es das Kommadozeilen Programm HTPASSWD.EXE. Hier kann man nun das Passwort mit Wiederholung eintippen und es wird ein Eintrag in die Datei htusers vorgenommen. Da ich in der Datenbank aber die realen Passwörter verwalten will, möchte ich quasi dieses Dienstprogramm fernsteuern um das Passwort zu übergeben. Es gelingt mir aber nicht die Standardeingabe aus dem Programm zu steuern. Gleichzeitig kommt noch die Frage auf wie man den Standard Output im Programm verwerten kann. Hier mal der noch nicht funktionierende Code
Code:
Dim InputStream As StreamWriter Dim OutStream As StreamReader Dim ExeDatei As String = "C:\Projekte\Entw\VS.NET\HTUser\htpasswd.exe" Dim Proginfo As New System.Diagnostics.Process Dim StartInfo As New ProcessStartInfo StartInfo.CreateNoWindow = False StartInfo.FileName = ExeDatei StartInfo.Arguments = "-c C:\Projekte\Entw\VS.NET\HTUser\htusers.txt User3" 'StartInfo.RedirectStandardOutput = True StartInfo.RedirectStandardInput = True StartInfo.UseShellExecute = False Proginfo.StartInfo = StartInfo Proginfo.Start() 'OutStream = Proginfo.StandardOutput InputStream = Proginfo.StandardInput InputStream.WriteLine("test" & vbCrLf) InputStream.WriteLine("test" & vbCrLf) InputStream.Flush()
Wilfried Stelberg------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cartoonhero Mitglied
 
 Beiträge: 246 Registriert: 21.04.2004
|
erstellt am: 10. Aug. 2009 10:56 <-- editieren / zitieren --> Unities abgeben:          Nur für Stelli1
Hallo ... warum verwendest du nicht den parameter -b von htpasswd ? damit kannst das passwort gleich beim programm aufruf mitübergeben htpasswd -b -c <passwdfile> <username> <password> wobei du ab dem zweiten eintrag da -c weglassen solltest, da sonst die bereits erstellte datei überschreiben wird und du immer nur den letzten eintrag drin hast. hilft jetzt zwar nicht zum lösen der generellen frage wie man standardein und -ausgang anspricht, sollte aber das konkrete problem lösen ... gruss cartoonhero Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Ehrenmitglied Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2010, Rasterdesign MapGuide 6.5 - 2010 Oracle 9i,10g Enterprise autodesk Topobase 2-2010 VS6, VS.net 2010
|
erstellt am: 10. Aug. 2009 13:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo, erst mal schon danke für die Antwort Zitat: Original erstellt von cartoonhero: warum verwendest du nicht den parameter -b von htpasswd ?
Bei der mir vorliegenden HTPASSWD.EXE wird der Parameter -b nicht unterstützt. Wo bekomme ich deine Version her ? Für das eine Problem wäre das eine (gute!) Lösung. Ich benötige diese Technik allerdings auch für andere Aufgaben. z.B. soll ein SQLLoaderfile per Batch eingelesen werden. Dafür möchte ich noch den Output umlenken um das Protokoll im Programmfenster anzuzeigen. Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cartoonhero Mitglied
 
 Beiträge: 246 Registriert: 21.04.2004
|
erstellt am: 10. Aug. 2009 13:52 <-- editieren / zitieren --> Unities abgeben:          Nur für Stelli1
also ... ich würde mir hier das installationspaket für den Apache für windows runterladen (z.b. apache_2.2.13-win32-x86-no_ssl.msi) und da ich ihn ja NICHT installieren will würde ich mir ein verzeichnis c:\apachetmp anlegen und die dateien dahin entpacken mit: msiexec /a apache_2.2.13-win32-x86-no_ssl.msi TARGETDIR=c:\apachetmp /qb jetzt findet man in Verzeichnis C:\apachetmp\program files\Apache Software Foundation\Apache2.2\bin die htpasswd.exe rauskopieren und das Verzeichnis C:\apachetmp löschen ... gruss cartoonhero Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MWN Mitglied Dipl.-Ing.
 
 Beiträge: 492 Registriert: 14.02.2007
|
erstellt am: 10. Aug. 2009 15:28 <-- editieren / zitieren --> Unities abgeben:          Nur für Stelli1
Hallo (Fan-)Gemeinde  , ich würd das so machen: Code: Private Sub cmbSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbSenden.Click Dim ip As String Dim text As String ip = txtIP.Text text = txtText.Text Dim p As Process p = New Process With p.StartInfo .FileName = Environ("COMSPEC") .CreateNoWindow = True '.Arguments = "Net Send " & ip & " " & text .RedirectStandardInput = True .RedirectStandardOutput = True .RedirectStandardError = True .UseShellExecute = False End With Me.WindowState = FormWindowState.Minimized p.Start() Dim StdIn As System.IO.StreamWriter = p.StandardInput StdIn.AutoFlush = True Dim StdOut As System.IO.StreamReader = p.StandardOutput Dim StdErr As System.IO.StreamReader = p.StandardError Dim sTemp As String sTemp &= StdOut.ReadLine() & vbNewLine sTemp &= StdOut.ReadLine() & vbNewLine sTemp &= StdOut.ReadLine() & vbNewLine StdIn.WriteLine("ECHO OFF") StdIn.WriteLine("cd\") StdIn.WriteLine("Net Send " & ip & " " & text & "") StdIn.WriteLine("Exit") 'Do Until p.HasExited ' System.Windows.Forms.Application.DoEvents() ' System.Threading.Thread.Sleep(1000) 'Loop If p.WaitForExit(20000) = False Then p.Kill() MsgBox("Die Gegenstelle antwortet nicht!") txtText.Clear() StdIn.Close() StdOut.Close() StdErr.Close() Exit Sub End If sTemp = StdOut.ReadLine sTemp = StdOut.ReadLine Dim sOutput As String sOutput = StdOut.ReadToEnd StdIn.Close() StdOut.Close() StdErr.Close() sOutput = Strings.Left(sOutput, _ sOutput.IndexOf(vbNewLine & "Exit")) sOutput = System.Text.Encoding.GetEncoding(850).GetString( _ System.Text.Encoding.Default.GetBytes(sOutput)) MessageBox.Show(sOutput, "Ausgabe") 'MsgBox("Nachricht erfolgreich gesendet") txtText.Clear() If Not p.HasExited Then p.Kill() End If p.Close() txtIP.Text = ip End Sub
Das Beispiel hier ist in VB.NET geschrieben und ein kleines "Messanger" - Tool mittels net-send realisiert! Viel Spass...Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Ehrenmitglied Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2010, Rasterdesign MapGuide 6.5 - 2010 Oracle 9i,10g Enterprise autodesk Topobase 2-2010 VS6, VS.net 2010
|
erstellt am: 13. Aug. 2009 10:23 <-- editieren / zitieren --> Unities abgeben:         
Hallo, danke für die Antworten. Da kommt man vpm Stöcken aufs Hölzchen @cartoonhero: Das mit der HTPASSWD vom Apache klappt. Da konkrete Problem hab ich jetzt so gelöst das die Daten quasi per Batch in eine Datei geschrieben werden die ich dann wieder lese. Hab aber auch noch gefunden das .Net auch einen Algorithmus zur Verfügung stellt.
Code: System.Security.Cryptography.MD5
Damit hab ich aus Zeitmangel noch nicht versucht.@Tobias: Danke für den Ansatz. Das klappt so wenn man die Ein- und Ausgabe kennt. Habe gesehen das es da auch noch ein paar Events gibt
Code: System.Diagnostics.Process.OutputDataReceived etc
Ich denke das ich das mal Teste um das Programm so auzulegen das es während der Auführung a Alle Ausgaben auffängt, b auf Fehler reagiert und c noch die Möglichkeit besteht das Dienstprogramm per Cancel zu stoppen.Muss mich gerade anderen Problemen widmen so das ich micht hierzu später nochmal melde. Wilfried Stelberg
------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |