Ich mache irgendwo wieder einen Fehler, bin jetzt schon 3 Stunden beschäftigt aus einer Dosbox die ich öffne, Daten aus zu lesen.
Es geht darum um eine eventuelle Fehlermeldung anzuzeigen. Ich rufe psexec an was wiederum ein andere Programm aufruft mit anderen Benutzerdaten. Dies funktioniert auch ohne probleme, also wenn man die richtigen Daten eingibt. Aber bei falschen Daten blinkt nur kurz das schwarze CMD Schirm auf und sonst passiert nichts. Habe er mit try capture probiert, aber auch wenn die Daten falsch sind wird psexec noch immer ohne Fehler ausgeführt.
Jetzt möchte ich die Daten die psexec ausgibt, einlesen und filtern auf diversen Text. Also wenn der drin steht halt eine Fehlermeldung erzeugen.
Also mit Vitrual Basic habe ich es schon hin bekommen, jetzt möchte ich es aber mit C# auch mal hin bekommen. Auch wenn ich eine MessageBox.Show(result) mache ist diese Leer. Kann es sein das string result = reader.ReadToEnd(); nur die letzte Zeile liest?
Hier mal ein Ausschnitt:
bool error;
private void OK_Click(object sender, EventArgs e)
{
ProcessStartInfo StartNAV = new ProcessStartInfo();
StartNAV.FileName = "C:\\Windows\\System32\\psexec.exe";
StartNAV.UseShellExecute = false;
StartNAV.RedirectStandardOutput = true;
StartNAV.Arguments = "diverse Argumente";
using (Process process = Process.Start(StartNAV))
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
error = result.Contains("Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort.");
if (error == true) MessageBox.Show("error");
}
// Close();
}
Es gibt meiner Meinung nach zwei Möglichkeiten:
process.WaitForExit(); abwarten, erst danach den Streamauslesen. Wenn du Fehler auslesen möchtest, muss du noch
StartNAV.RedirectStandardError = true;
...
StreamReader errorReader = process.StandardError;
implementieren.
Grüße
**:::
Danke, wie es aussieht hat es funktioniert.
Aber wie weiß C# das psexec ein Error statt eines normale output hat?
Auf WaitForExit brauch ich scheinbar nicht zu warten, also auch ohne kommt die Meldung.
Ich bastle mal weiter....
process.StandardOutput/.StandardError darf eiglich nicht in einen Using-Block.
Weil dein Code hat diesen StreamReader nicht erstellt, also darf dein Code den auch nicht disposen.
Zwar scheints trotzdem zu gehen, aber trotzdem.
Der frühe Apfel fängt den Wurm.
Hmm, also meine Regel ist die folgende, ich finde zwingend logische:
"Bereinige keine Resourcen, die dir nicht gehören."
Daher nehme ich an, dass deiner Quelle da ein Lapsus unterlaufen ist.
Der frühe Apfel fängt den Wurm.
Das Dispose
des Process
sollte den Stream automatisch bereinigen, sofern es korrekt implementiert wurde.
Stimme hier ErfinderDesRades zu; man sollte nur die Ressourcen bereinigen, die einem direkt gehören. Ansonsten ist das jeweilige Parent dafür verantwortlich (hier offensichtlich die Klasse Process
).
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code