C# Berechtigungsproblem? Process.Start() auf Server

MBGucky

Der Mausbiber
ID: 170456
L
21 Februar 2007
214
3
Hi,

In einer C#-Anwendung, die auf einem Windows Server 2003 derzeit ohne Probleme läuft und die ich auf einen anderen Server (Windows 2008 mit Plesk) umziehen soll, werden zunächst folgende Variablen erstellt:
PHP:
string dateieins = "c:\ein\ordner\mit\der\quelldatei\diequelldatei";
string dateizwei = "c:\ein\leerer\ordner\zieldatei"; // Die Zieldatei existiert noch nicht
string batdatei = "c:\ein\ordner\mit\batdatei\batdatei.bat";
string derbefehl "c:\ein\ordner\mit\einer\exedatei.exe -parameter1 -parameter2 " + dateieins + " " + dateizwei; 

// Danach wird in dem Pfad batdatei eine batdatei mit dem Inhalt aus derbefehl erzeugt. Der Befehl soll die Datei dateieins mit Hilfe der exedatei.exe und dem Ziel dateizwei verschlüsseln. Danach wird die bat-Datei ausgeführt und gewartet, bis sie vollständig ausgeführt wurde.

File.WriteAllText(batdatei,derbefehl);
Process prCrypt = Process.Start(batdatei);
while (!prCrypt.HasExited)
{
}
Mein Problem:
Auf dem alten Server klappts, auf dem neuen nicht. Wenn ich jedoch auf dem neuen Server die bat-Datei manuell ausführe, funktioniert diese. Die Pfade sind also alle richtig. Und da der Pfad zur bat-Datei als Variable abgelegt ist, muss dieser Pfad auch richtig sein. Dem Useraccount, der die bat-Datei erzeugt, habe ich Vollzugriff auf alle benötigten Ordner gegeben. Eigentlich sollte das doch der selbe Useraccount sein, über den die bat-Datei dann auch ausgeführt wird.

Leider erhalte ich keinen Log zu diesem Problem. Ich erhalte nur folgende Fehlermeldung durch das Programm, welches die Anwendung auf dem Server aufruft:

System.Web.Services.Protocols.SoapException: Die Anforderung konnte vom Server nicht verarbeitet werden. ---> The specified directory is invalid.

Das würde aber heissen, der Ordner sei falsch. Ich vermute irgendein Berechtigungsproblem, weiss aber nicht, wie ich den Fehler nun finden soll.
Vielleicht hat hier ja jemand eine Idee.
 
Zuletzt bearbeitet von einem Moderator:
Gehe davon aus das es im Visual Studio gemacht wurde, und der meldet "Nicht erkannte Escapesequenz".

Das ja nivht der OriginalCode und ich gehe aus, das wurde hier nur nicht gepostet das dor \\ steht oder ein @ davor ist.

Farge mich gerade woher die SoapException kommt!?
 
Da habe ich nicht aufgepasst. Irgendwo ist wohl bei dem ganzen Kopieren der jeweils zweite \ abhandengekommen. Er ist aber definitiv vorhanden! Denn vorher wird die bat-Datei ja erst geschrieben und der Pfad zum Schreiben der bat-Datei wird ja ebenfalls aus der Variablen genommen.

Daran scheitert es also nicht. Ich vermute immernoch ein Problem mit ner Berechtigung.


ach ja. Und das Gleichheitszeichen hab ich wohl auch beim Posten vergessen...

So und falls das noch wichtig ist (edit nummer 3):

Die Pfade habe ich natürlich zum Posten hier im Forum aus Sicherheitsgründen geändert. Die Ursprünglichen Pfade enthalten
die Domain auf der das Programm läuft, worin die Sonderzeichen . und - enthalten sind. Leerzeichen habe ich NICHT eingesetzt.

Meines Erachtens sollte dies kein Problem darstellen, da die bat-Datei ja im selben Programm mit der selben Pfadvariablen erzeugt wird. Sicherheitshalber poste ich es hiermit trotzdem, falls Process.Start() die Variable anders auswertet als File.WriteAllText()


Oh mann, Edit nummer 4.....

Ich sollte vielleicht erwähnen, dass ein ebenfalls in C# geschriebenes Programm auf meinem Rechner auf diese Anwendung auf dem Server zugreift. Um nun zu prüfen, ob die Anwendung auf dem neuen Server
funktioniert, ohne den alten Server abzuschalten (bzw. die Domain auf den neuen Server zu delegieren), habe ich die IP des neuen Servers in meiner HOSTS Datei als IP für die alte Domain eingetragen.

Die angegebene Fehlermeldung erscheint in dem Clientseitigen Programm.
Weitere darin enthaltene Fehlermeldungen weisen nur auf die Quelle im Sourcecode des Clientprogramms hin, helfen hier also nicht wirklich weiter, da der Fehler im Serverprogramm liegt.
 
Zuletzt bearbeitet:
Hallo,

gehe ich Recht in der Annahme, dass du auf dem 2003er Server entwickelt hast, mithilfe des VS?

Wege die du einschlagen solltest, um das Problem zu lösen.

1.) Wenn die Ordner existieren, nachschauen, ob auch der ServiceBenutzer Schreib/Lese Rechte in den besagten Ordnern hat. Dies war damals bei mir auch eine Fehlerquelle...
Würde auch dazu passen, dass ein eigenständiger Aufruf das Programm laufen lässt (Benutzer=Administrator?) und über den Service eben nicht (Benutzer=WebserviceBenutzer).

2.) Des Weiteren, die Probleme mit dem Logging sind leicht in den Griff zu bekommen. Benutz zum Beispiel NLog. Damit loggst du deine Exceptions auf dem Server und bekommst einen genaueren Überblick, was genau der Fehler ist...
Nicht jeder Fehler der passiert, will man ja über "throw Exception(e.Message)" zurückschicken.
 
Hi,

ich habe überhaupt nicht entwickelt. Ich soll nur auf dem neuen Server ans Laufen bringen. Genau genommen bin ich sogar gerade erst dabei, C# zu lernen.

Entwickelt wurde wohl auf einem Rechner mit Windows XP und VS 2005.
Ich wollte das Programm eigentlich mit VS 2008 Express überarbeiten, musste aber feststellen dass das damit nicht geht. Zum Glück gibts derzeit VS 2010 RC1 (?) und damit gehts dann wieder. Wenn ich das aber recht in Erinnerung habe, wird das von CD installiert. Da es sich bei dem Server aber um einen Cloudserver handelt, der zudem logischerweise in einem Rechenzentrum steht und nicht bei mir zu Hause, ist das mit CD einlegen en bisschen schwierig.

zu 1) Die Berechtigungen sollten meiner Meinung nach alle stimmen.
Die Datei wird ja erzeugt. Also sind Schreibrechte schonmal vorhanden. Und allen Usern, die Schreibrechte auf diesen Ordner haben, habe ich auch Execute-Rechte gegeben.

zu 2) NLOG werd ich mal ausprobieren. Ich bekomme zwar derzeit Fehlermeldungen in die System-Logfiles (zuvor hatte ich einen Ordner falsch geschrieben und das konnte ich im Logfile nachlesen.) Deshalb wundert mich, dass dies bei dem aktuellen Problem nicht der Fall ist. Vielleicht hilft NLOG ja.
 
Also du entwickelst ja nicht aufm Server, normal machst du das ja auf deinem Rechner, nur das man dann schon mal etwas anders machen muß fürn Server, deswegen stellt man dann auch sowas wie Debugg (lokal) Release(Server) ein. (oben in der menüleiste) und verwendet entsprechenden Code.

Wenn ich meins auf Debugg habe, dann wird die DB z.B. übern VPN angesprochen, wenn ich es auf Release stelle Local, so das es dann nur noch aufm Server funktioniert.

Ist der Code den du hast geheim/streng vertraulich? Sonst würde ich es mal anschauen und auf meinem Server testen wenn nicht.
 
Jupp, der Code ist leider streng vertraulich. Den darf ich nicht weitergeben.
Ich musste den geänderten Code "absegnen" lassen, bevor ich ihn hier poste.
Macht zwar wenig Sinn, da die Person die das abgesegnet hat sich nicht wirklich mit Programmieren auskennt, aber so hat es halt seine Richtigkeit.

Den Quellcode darf ich sogar nur auf einem Rechner speichern/bearbeiten, der keinen Internetzugang hat. (bisschen paranoid für meinen Geschmack, aber was der Kunde zahlt wird gemacht.)
 
Wenn du unter Start->Verwaltung->Ereignissanzeige->Windowsprotokolle gehst hast du auch keine Weitere Fehlermeldungen!?
 
Nope

das ist es ja, was mich wurmt. Bei den Fehlern zuvor, die ich alleine lösen konnte, hatte ich Einträge in eben diesem Log (Der ist ja Unterteilt in Sicherheit, Setup, ...) Da ist aber nun nix drin.

Ich werds aber erstmal mit NLog probieren. Und ansonsten hab ich noch ProcessMonitor. Das scheint effektiver zu sein als ich bisher dachte.
Vielleicht hilft mir das weiter.
 
ähm mal doof frage, in der bat steht wirklich nur ein Befehl der die Exe mit nem Parameter aufruft oder doch mehr??

Wozu eigentlich die Bat undd wieso nciht direkt die Datei mit den Parametern aufrufen?

Setup? Du meinst System oder? Und unter Anwendung steht auch so nichts?
 
Hi,

genaugenommen steht der gleiche Befehl zwei mal hintereinander in der bat-Datei, nur mit unterschiedlichen Parametern (Pfaden im selben Ordner). Es werden damit zwei Dateien aus dem einen Ordner verschlüsselt in dem anderen Ordner abgelegt.

Die Protokolle, die mir unter Ereignisanzeige zur Verfügung stehen, sind:
Anwendung, Sicherheit, Setup, System, Weitergeleitete Ereignisse.
Und unter keinem davon steht ein Hinweis auf den Fehler.

Mir fällt aber gerade noch was auf....

Der Ordner mit der bat-Datei befindet sich ebenso wie die Exe-Datei in den httpdocs. Kann es sein, dass dies grundsätzlich unzulässig ist, wenn man die Anwendung aus dem Web heraus aufruft? (Wie gesagt als Administrator über Remotedesktop funktioniert die bat ja.)
 
Wie rufst du die denn ausm netz ab??

Rufst du eine .aspx auf, die den Aufruf der Bat durchführt? Oder versuchst du etwa die Bat direkt aufzurufen? Das letztere geht ja nciht.
 
Eine in C# programmierte Anwendung beim Clientrechner greift auf die ebenfalls in C# programmierte Serveranwendung zu. Diese Anwendung enthält halt den unten genannten Code.
 
Du hast geschrieben wenn du die bat-Datei manuell ausführst funktioniert es ja? Die bat-Datei hattest du selber erstellt oder wurde die vom Programm erstellt?
 
Die bat-Datei wird jedes Mal vom Programm erstellt und direkt danach vom selben Programm ausgeführt. Der Pfad zu der bat-Datei steht in der Variablen, die vorher erstellt wird. Er kann also eigentlich nicht falsch sein.

Noch ein kleiner Nachtrag:

In den Namen der batdatei wird eine laufende Zahl (derzeit vierstellig) eingefügt, bevor sie erzeugt wird. Das soll verhindern, dass sich zwei Clients in die Quere kommen wenn zufällig beide selbst das Programm nutzen.


Und noch was muss ich hinzufügen:

Ich kann die .aspx Datei auf dem Server, die auch von der Anwendung angesprochen wird, dazu verwenden, quasi lokal auf dem Server dieses Script anzustoßen. In dem Fall komme ich ebenfalls genau zu der beschriebenen Stelle, die bat-Datei wird erzeugt, und es kommt zu einem "Internal Server Error" (500) der ja eigentlich ein Log erzeugen sollte um mir den Fehler zu zeigen. Aber genau dieser Logeintrag wird nicht erstellt. Rufe ich hingegen die Anwendung mit einem falschen Parameter auf, so dass das Script vorher schon abbricht, wird mir eine ausführliche Fehlermeldung angezeigt und ein Logeintrag erstellt (Unter Ereignisanzeige > Anwendungen).
 
Zuletzt bearbeitet:
Sorry, wenn ich mir selbst antworte, aber ich muss was wichtiges nachtragen was von jedem gelesen werden sollte, der das Thema aboniert hat:


1. Nachdem ich im IE des Servers mal in den Einstellungen "Kurze http-Fehlermeldungen" ausgeschaltet habe, erhielt ich auch zu dem 500er Fehler eine Beschreibung.

2. Anhand dieser Beschreibung konnte ich den Grund für die Fehlermeldung lokalisieren und beheben. Es wird nun keine Fehlermeldung mehr ausgegeben und das Programm scheint !!! Auf den ersten Blick !!! korrekt zu funktionieren.

3. Allerdings stellte ich daraufhin fest, dass eben nicht wie gewünscht die verschlüsselten Dateien erstellt werden. Das Programm wird zwar komplett abgearbeitet, es scheint jedoch so als würde genau dieses Process.Start trotzdem nicht ausgeführt.