Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Probleme bei Process.Start()

483 views
Skip to first unread message

Frank

unread,
Aug 14, 2009, 3:12:01 AM8/14/09
to
Hallo

hat jemand eine Idee, warum meine zu öffnende Anwendung nicht geöffnet wird?

Hier paar Daten:
Ich hab eine .NET Anwendung implementiert (WCF Service) die im Hintergrund
überprüft, ob ein Java Socket am laufen ist, der die Schnittstelle zu einer
weiteren entfernt liegenden Java Anwendung darstellt. Wenn der Socket
allerdings aus irgendwelchen Gründen nicht mehr läuft, will ich ihn von der
.NET Anwendung aus mit Process.Start("Pfad\Foo.exe"); starten.
Alles was ich an Exception erhalte ist:

- "foo.BasePriority" hat eine Ausnahme vom Typ
"System.InvalidOperationException" verursacht.

- base {System.SystemException} = {"Die angeforderten Informationen sind
nicht verfügbar, da der Prozess beendet wurde."}

- StackTrace:
bei System.Diagnostics.Process.EnsureState(State state)
bei System.Diagnostics.Process.get_ProcessName()

Gleiches kommt auch, wenn ich versuche die foo.exe über
Process.Start("Pfad\run.bat"); in der cmd zu öffnen oder wenn ich wie in
dutzenden Webbeispielen einfach mal versuche die notepad.exe zu starten.

Hier mal der Code:
----------------------------
Process[] socketProcess = Process.GetProcessesByName("ServerSocket");
if(socketProcess.Count() != 0) { return true; }
string appPath = GetAppPath();
string serverSocketPath = Path.Combine(appPath, "java_socket");
string serverSocketFileName = Path.Combine(serverSocketPath, "run.bat");

if(File.Exists(serverSocketFileName)) {
try {
ProcessStartInfo processInfo = new
ProcessStartInfo(serverSocketFileName);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
Process socketServer = Process.Start(processInfo);
socketProcess = Process.GetProcessesByName("ServerSocket");
int i = socketProcess.Count();
return true;
}
catch(Exception ex) {
return false;
}
}
return false;

Beste Grüße
Frank Huster

Frank Dzaebel

unread,
Aug 16, 2009, 2:15:56 PM8/16/09
to
Hallo Frank Huster,

> hat jemand eine Idee, warum meine zu öffnende
> Anwendung nicht geöffnet wird?
>
> Hier paar Daten:

> - base {System.SystemException} = {"Die angeforderten Informationen
> sind nicht verfügbar, da der Prozess beendet wurde."}

ja, meistens ist dann aber genau das auch der Grund,
nämlich das schlicht der Prozess beendet wurde.
Kannst Du ja ggf. prüfen.

> Gleiches kommt auch, wenn ich versuche die foo.exe über
> Process.Start("Pfad\run.bat");

wir wissen nicht, was "run.bat" tut, wie es implmentiert
ist, aber Batches terminieren natürlich ggf. irgendwann,
wenn nicht mit "cmd /k" aufgerufen, oder ReadLine
o.ä. gemacht wird. Auch ist das Terminierungsverhalten
für Batches benutzerdefiniert einstellbar.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Frank

unread,
Aug 17, 2009, 2:24:01 AM8/17/09
to
Hallo Frank,

run.bat befindet sich im selben Ordner, wie auch foo.exe und beinhaltet
lediglich den Programmaufruf foo.exe /k. In foo.exe wird ein Socket
gestartet, der auf Port xy auf einen InputStream wartet um diesen dann
jeweils in einem eigenen Thread weiter zu verarbeiten.
Benötige ich die Batch den eigentlich überhaupt? Eigentlich kann ich foo.exe
doch auch per Doppelklick im Explorer öffnen und der Prozess wird nicht
beendet, sondern läuft im Hintergrund. Warum lässt sich der Prozess dann
nicht auch aus meinem Service heraus starten?

Beste Grüße
Frank Huster


Frank Dzaebel

unread,
Aug 18, 2009, 1:25:03 AM8/18/09
to
Hallo Frank Huster,

> run.bat befindet sich im selben Ordner, wie auch foo.exe und
> beinhaltet lediglich den Programmaufruf foo.exe /k. In foo.exe wird
> ein Socket gestartet, der auf Port xy auf einen InputStream wartet um
> diesen dann jeweils in einem eigenen Thread weiter zu verarbeiten.
> Benötige ich die Batch den eigentlich überhaupt? Eigentlich kann ich
> foo.exe doch auch per Doppelklick im Explorer öffnen und der Prozess
> wird nicht beendet, sondern läuft im Hintergrund.

wie gesagt, es gibt dann aber einen Unterschied.
Wenn Du run.bat startest, wird eine Shell (normal cmd.exe)
aufgerufen. Der Prozess ist dann cmd.exe.
Dieser ruft foo.exe auf, die weiter läuft, aber cmd.exe
wird beendet. Wenn in run.bat eh nur "foo.exe"
aufgrufen wird, könntest viel einfacher *nur*
als FileName die "foo.exe" angeben.


> Warum lässt sich der Prozess dann nicht auch aus
> meinem Service heraus starten?

Es kann mehrere Gründe geben, aber Services laufen
normal unter Usern, die geringe Rechte haben.
Prozess-Aufrufrechte vererben sich, bzw. ohne
Impersonifikation kann der neu aufgerufene Prozess
nicht mehr Rechte bekommen, als der Quellprozess.

[Code mit anderen Rechten ausführen]
http://dzaebel.net/LogonUser.htm

Informiere Dich auch über die "Session 0 Isolation"
auf Betriebssystemen >= Vista

[Session0_Vista.docx]
http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Session0_Vista.docx
falls Word 2007 nicht zur Hand ... siehe:
[Downloaddetails: Word Viewer]
http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=3657ce88-7cfa-457a-9aec-f4f827f20cac

Frank Huster

unread,
Aug 20, 2009, 8:21:01 AM8/20/09
to
Hallo,

habs nun endlich auf die Reihe bekommen und möchte euch die Lösung nicht
vorenthalten. Hab die Lösung auf ner Seite im Netz gefunden, die den
Prozessstart aus einer ASP Anwendung heraus erläutert hat ... weiß aber
leider die URL nicht mehr ...

ProcessStartInfo processInfo = new ProcessStartInfo
{
FileName = fooFileName,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true,
RedirectStandardError = true,
WorkingDirectory = appPath,
Arguments = "Foo",
Verb = "Foo is started ..."
};
Process socketServer = Process.Start(processInfo);

VG
Frank Huster

Frank Dzaebel

unread,
Aug 20, 2009, 1:55:10 PM8/20/09
to
Hallo Frank Huster,

> habs nun endlich auf die Reihe bekommen und
> möchte euch die Lösung nicht vorenthalten.

> [...] RedirectStandardError = true,

das ist keine Lösung, damit leitest Du nur
die Fehlermeldungen ins Nirvana.


> Verb = "Foo is started ..."

noch falscher. Das wäre das Verb für
den FileName:

[ProcessStartInfo.Verb-Eigenschaft (System.Diagnostics)]
http://msdn.microsoft.com/de-de/library/system.diagnostics.processstartinfo.verb.aspx

Frank Huster

unread,
Oct 16, 2009, 12:25:01 PM10/16/09
to
Hallo Frank,

mein eigentlicher Fehler war wohl weniger die Verwendung von Verb, sondern
vielmehr, dass ich nicht wusste, dass bei FileName der komplette Pfad mit
angegeben werden soll. Ich fand die da die Propertiebezeichnung wohl etwas
irritierend und dachte, dass es langt den Pfad in WorkingDirectory zu setzen.

Wie dem auch sei, das Problem die exe nicht starten zu können ist gelöst.

Beste Grüße
Frank

0 new messages