Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm aus Dienst starten die xte (https://www.delphipraxis.net/107581-programm-aus-dienst-starten-die-xte.html)

Angel4585 30. Jan 2008 07:25


Programm aus Dienst starten die xte
 
Moin!

Ich möchte folgendes tun:

Ich hab einen Dienst und möchte aus diesem heraus ein Programm starten.
Ich melde mich über LogonUser als Admin an und führe das Programm mit CreateProcessAsUser aus.
Das Programm wird ausgeführt und erscheint auch im Taskmanager.
Steht auch dabei das es unter dem Konto Admin läuft.
Soweit so gut.

Das Problem: Das Programm tut absolut nichts.
Ich hab nur eine kleine Funktion drin die eine Stringlist erzeugt, einen Eintrag in diese macht und diese in ne datei speichert.
Wenn ich das Programm manuell starte klappt das ohne Probleme. Nur wenn ich das Programm aus dem Dienst heraus starte tut es absolut nichts.

Direkt aus dem Dienst heraus kann ich jedoch ohne Probleme in eine Datei speichern.
Anfangs war das Programm eine Formularanwendung, sodass ich dachte das dies nunmal einfach nciht geht.
Jetzt hab ich eine Konsolenanwendung daraus gemacht in der Hoffnung das diese mehr kann, aber selbes Problem.


Hab ich irgendwas übersehen?

:angel:

Angel4585 30. Jan 2008 07:41

Re: Programm aus Dienst starten die xte
 
:lol: :wall: Hat sich erledigt, ich muss im CreateProcessAsUser das Flag CREATE_NEW_PROCESS_GROUP setzen, dann gehts.

Angel4585 30. Jan 2008 08:51

Re: Programm aus Dienst starten die xte
 
Hmm.. Das programm wird jetzt zwar gestartet, auch unter dem Benutzer und es arbeitet auch.
Aber: Es hat keinen Zugriff auf die Netzlaufwerke.. der Admin hat den aber eigentlich.
nutze ich jedoch die UNC-Notationen dann geht es. Sollten die Netzlaufwerke mit dem LogonUser nicht auch verfügbar werden?

OregonGhost 30. Jan 2008 10:03

Re: Programm aus Dienst starten die xte
 
Da hab ich vor kurzem erst etwas drüber gelesen. Das passiert auch bei einer Elevation unter Vista, da verliert man nämlich plötzlich auch bereits eingegebene Passwörter für Netzlaufwerke etc. Vermutlich ist das ein ähnliches Problem, wenn nicht dasselbe. Kannst du mit den UNC-Pfaden leben oder sind Laufwerke notwendig?

Dezipaitor 30. Jan 2008 11:43

Re: Programm aus Dienst starten die xte
 
LogonUser erstellt eine neue LogonSession. Eine Session ist ein LUID-Typ, der den neuen eingeloggten Benutzer auszeichnet. Mit dieser Session wird man auch bei anderen Computern angemeldet. D.h. jede Session hat eine andere Remote-Anmeldung. Daher kann man auf bereits existierende Netzwerkresourcen nicht zugreifen. Man muss sie erneut erstellen.
Übrigens habe ich erfahren, dass so erstellte Programme auch keine Nachricht bekommen, wenn der Computer herunterfährt. Das muss der eigene Dienst übernehmen, die Programme zu benachrichtigen.

Übrigens ist die folgende Reihenfolge von Funktionsaufrufen sehr empfehlenswert:

LogonUser
LoadUserProfile
CreateEnvironmentBlock(p^)
CreateProcessAsUser
Wait for Process (ka wie das genau heißt)
delete p;
UnloadUserProfile

für nicht Administratoren muss es so aussehen:


LogonUser
LoadUserProfile
CreateEnvironmentBlock(p^)
-hinzufügen von Benutzer in DACL von Winstation und Desktops
CreateProcessAsUser
Wait for Process (ka wie das genau heißt)
delete p;
UnloadUserProfile
-entfernen von Benutzer aus DACL von Winstation und Desktops

Alternative zur Änderung der W/D DACL wäre:

-Hinzufügen der LogonSID des Konsolenbenutzers in die TokenGruppen
LsaLogonUser(TokenGruppen)
LoadUserProfile
CreateEnvironmentBlock(p^)
CreateProcessAsUser
Wait for Process (ka wie das genau heißt)
delete p;
UnloadUserProfile


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz