Delphi-Programm funktioniert nicht richtig auf Terminal-Server bei nicht angemeldetem User

    Delphi-Programm funktioniert nicht richtig auf Terminal-Server bei nicht angemeldetem User

    Hallo,

    hoffe das ist die richtige Rubrik für meine Frage.^^

    Situation:
    Also ich habe ein Grafisches Delphi-Programm geschrieben welches im Grunde vollautomatisch laufen soll. Es soll jedoch trotzdem auch z.B. bei Fehlern manuell ansprechbar sein.
    Das Tool SOLL per Taskplanung zu einer bestimmten Uhrzeit auf einem Terminalserver angestoßen werden und sich automatisch beenden sobald es erfolgreich durchgelaufen ist.
    Nach Ablauf des Programms (ob erfolgreich oder nicht) werden verschiedene Logs erstellt.

    Nun zu meinem Problem : Das Tool läuft bei ANGEMELDETEM User und Taskplanung genau so wie es soll. Wenn jedoch kein User am Server angemeldet ist, wird zwar das Programm gestartet (es ist im Taskmanager als laufender Task aufgeführt) aber es wird kein Log erstellt und wenn man sich während des Tasks am Server anmeldet sieht man auch keine Grafische-Oberfläche! Außerdem beendet sich das Tool bei NICHT ANGEMELDETEM User nicht mehr!

    Was ist da los? Bei mir auf dem lokalen Entwickler-Rechner mit Win10 funktioniert alles wie es soll ?(

    Fehlen vielleicht iwelche Bibliotheken die ich noch einbinden muss? Wenn ja: Welche? Ich weiß das ich noch eine SSL Bibliothek manuell einbinden musste die bei mir auf dem Rechner bereits installiert war, am Server jedoch nicht, damit das Programm bei angemeldetem User ordnungsgemäß startet...

    Für jede Hilfe bin ich wie immer sehr dankbar! :)
    In welchem Benutzerkontext läuft der Task im Scheduler? Ggf. mal versuchen, den Kontext auf System zu ändern.

    Aber ich kenne das Problem selbst seit Windows 2003, meine Lösung war immer ein harter Ausstieg via Terminate, klappt aber seit 2008 auch nicht mehr richtig, wenn du auf der Anzeige des Form bestehst. Solange alles ausgeführt wird, bevor die Form angezeigt wird (also in Form.Create) funktioniert auch das Terminate. Nicht schön und auch nicht sauber, aber es funktioniert.

    Grüße
    Mikhal
    Computer erleichtern die Arbeit -
    und die Welt ist eine Scheibe!
    Ich kann nur vermuten, weil ich hier kein System zum Test habe (ich habe versucht, das mit interaktiven Services zu simulieren, aber das klappt nicht).
    Probiere doch mal, die DefaultMonitor-Eigenschaft der Hauptform der Anwendung auf dmDesktop zu setzen. Wenn sie das nämlich nicht ist, versucht die Anwendung sobald Application.Run ausgeführt wird, verfügbare Monitore auszulesen und die Form irgendwo zu platzieren. Möglicherweise liegt klappt das nicht, wenn der Benutzer nicht angemeldet ist und das führt zu dem Problem. Aber das ist natürlich nur Stochern im Nebel. Besser wäre es, wenn du die Anwendung debuggen könntest: Beim Start direkt nach das Begin eine Endlosschleife, die einfach nur wartet, dann mit einem Remote-Debugger verbinden und über diesen die Schleife verlassen, so dass du die Anwendungsentwicklung inklusive aller VCL-Codes von Beginn an (oder zumindest nach allen Initalizations) verfolgen kannst.
    Master of the EDH ;)
    <glaskugel>
    Ich vermute mal es liegt an den Berechtigungen auf dem Verzeichnis, in das das Log geschrieben werden soll.
    </glaskugel>
    Wenn dazu dann das Exception-Handling nicht sauber ist, wirft Dein Programm 'ne Exception die niemand mehr wegklicken kann.
    Bei Dingen die automatisch laufen sollen muss man peinlich darauf achten, dass alle eventuellen Exceptions behandelt werden und ein sauberer Ausstieg möglich ist.
    Bau doch ein paar "OutputDebugString" ein, starte DebugView (SysInternals von Mark Russinovich) und anschließend in der Aufgabenplanung den Task manuell.

    Dass man nix sieht wenn man sich bei laufendem Programm per RDP anmeldet ist normal.
    Schau mal in den Taskmanager. Du siehst den Task nur dann, wenn Du auf "Prozesse aller Benutzer anzeigen" klickst.
    "After three days without programming, life becomes meaningless." (The Tao of Programming, Book 2)
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler, 'Refactoring')
    @Mikhal:
    Also der Scheduler läuft (so viel ich weiß) auf System Kontext. Habe da aber leider auch nicht so die Einsicht, das machen bei uns eher die Systemadmins. Ich habe Ihnen den Link zu diesen Foreneintrag gegeben, also denke ich das es mittlerweile auf System-Kontext läuft. Es funktioniert jedoch leider immer noch nicht ganz richtig :/
    Den Tipp mit dem Form.Create behalte ich mal im Hinterkopf, ich würde es halt wirklich bevorzugen wenn ich es iwie hin bekommen könnte das es mit grafischer Oberfläche startet. Aber dein vorgeschlagener Workaround hört sich zumindest für die Automatisierung sehr interessant an.

    @projekter:
    Den Tipp mit der Desktop-Eigenschaft habe ich ausprobiert. Leider keine Änderung.
    Von Remote-Debuggern habe ich bisher leider noch keine Ahnung. Müsste mich also erstmal darüber schlau machen, wie genau das mit Delphi XE6 funktioniert.

    @BerndG
    Den Tipp mit den Berechtigungen werde ich mal weitergeben. Außerdem werde ich mal mein Exception-Handling überprüfen.


    Bei weiteren Tests ist mir aufgefallen das er GENERELL über die Taskplanung nicht richtig startet. ?( Der Prozess ist zwar im Taskmanager aber ich sehe weder ein Fenster noch wird ein Log erstellt...

    Fragger93 schrieb:

    Bei weiteren Tests ist mir aufgefallen das er GENERELL über die Taskplanung nicht richtig startet. ?( Der Prozess ist zwar im Taskmanager aber ich sehe weder ein Fenster noch wird ein Log erstellt...

    Nochmal: Du wirst niemals ein Fenster "sehen", wenn Du das Programm über den Taskplaner startest.
    Probier's aus und starte Notepad über den Taskplaner.
    Du wirst im Taskmanager zwar den Prozess finden, siehst aber nicht das Notepad-Fenster, wenn Du Dich remote anmeldest.

    Dein Programm muss vollkommen standalone laufen können und kann höchstens etwas loggen, was Du dann bei einer parallelen RDP-Anmeldung lesen kannst (schau Dir DebugView und OutputDebugString an).
    Grafikausgabe parallel betrachten ist nicht!

    Das mit dem Log liegt wie gesagt vermutlich an den Verzeichnisberechtigungen.
    In welches Verzeichnis soll geschrieben werden? Eines aus Deinem Benutzeraccount? Nimm zum Testen mal "C:\Temp" oder etwas anderes unverfängliches.
    "After three days without programming, life becomes meaningless." (The Tao of Programming, Book 2)
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler, 'Refactoring')
    Die Verzeichnisse sollten auch explizit gesetzt werden, da Windows im Taskplaner (je nach Version) das Arbeitsverzeichnis nicht korrekt setzt.
    Proggen bis die Tastatur qualmt ;)

    Eine Grundanforderung an die Softwareentwicklung ist:
    ES IST NICHT WICHTIG ALLES ZU WISSEN, ES REICHT ZU WISSEN WO MAN NACHSCHAUEN KANN!
    Und da hilft oft Suchbegriff + F1
    Okay ich habe verstanden das ich kein Fenster sehe, wenn ich ein Programm direkt über die Aufgabenplanung (remote) starten will.
    Das Log sollte bisher im gleichen Verzeichniss erstellt werden wo auch die Exe liegt (Also auf einem Benutzerkonto). Ich werde deinen Tipp mal ausprobieren und "C:\Temp" versuchen.

    EDIT: Auch mit geändertem Speicherpfad von slGesamterLog.SaveToFile('log.txt'); auf slGesamterLog.SaveToFile('C:\Temp\log.txt'); auf meinem lokalen Rechner und nicht angemeldetem User hat es leider nicht funktioniert :(

    EDIT 2: Da das Tool über die Aufgabenplanung MIT angemeldetem User so funktioniert wie es soll (Also mit Grafischer Oberfläche und Logs), werde ich unseren Admins eventuell sagen, dass das Tool halt eben einen angemeldeten User braucht. Schließlich SOLL man ja auch falls es iwelche Schwierigkeiten gibt, auch manuell damit arbeiten können und spätestens dann braucht es einen angemeldeten User...Ich bin ja erst im ersten Lehrjahr (3.Ausbildungsmonat) und ich weiß nicht wie lange ich dafür wieder brauchen werde alles wieder umzugestalten auf Komplette Automatisierung ohne Benutzeroberfläche...

    Dieses Tool ist eine "Aufgabe für Nebenbei" gewesen, deshalb weiß ich auch nicht wie viel Zeit ich dafür noch aufwenden darf...

    Trotzdem danke an alle die mir dabei zu helfen versucht haben. Ich werde eure Lösungsvorschläge auf jeden Fall notieren und wenn ich noch einmal Zeit haben sollte für "etwas Nebenbei" zu machen, ausprobieren.
    Außerdem melde ich mich natürlich noch mal wenn ich zu einer Lösung gekommen bin.

    FINAL EDIT 3: Es funktioniert jetzt! Und ich muss mich entschuldigen, es lag doch an dem Pfad bzw. an fehlenden Berechtigungen. Der Grund warum ich vorher annahm das es nicht daran liegen konnte war, das ich vergessen hatte eine kleine Unter-Unit zu durchsuchen bei der der Pfad einfach angegeben wurde ("log.txt"). Ich hatte im Quelltext nur angegeben logfile.savetofile("log.txt"). Wenn man das als angemeldeter User ausführt, speichert er es im gleichen Verzeichniss wo auch die Exe zu finden ist. Führt man es jedoch über die Aufgabenplanung (bei unangemeldetem User) aus, versucht er es im System32 Ordner zu speichern wo ihm natürlich die Berechtigungen zu fehlen. Jetzt lasse ich den Log wie BerndG bereits vorgeschlagen hat im Temp-Ordner speichern.

    Vielen Dank nochmal an BerndG und DelphiHacker die mich in die richtige Richtung gestoßen haben! ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fragger93“ ()