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/)
-   -   NT-Service auf 64bit Windows (https://www.delphipraxis.net/152257-nt-service-auf-64bit-windows.html)

kuba 16. Jun 2010 16:42

NT-Service auf 64bit Windows
 
Hallo,

ich habe einen NT-Service programmiert und mache damit das da:

Delphi-Quellcode:
    ZeroMemory( @si, sizeof(si) );
    si.lpDesktop := PChar('WinSta0\Default');
    si.cb := sizeof(si);
    ZeroMemory( @pi, sizeof(pi) );
    ReadDir(PW);
    command:=PW+'\remote.exe';

    try
      if not CreateProcessAsUser(
        token,
        nil,
        PChar(command),
        nil,
        nil,
        False,
        CREATE_NEW_CONSOLE, //cf,
        nil,
        PChar(ExtractFilePath(command)),
        si,
        pi )then exit;
    except
      exit;
    end;
Unter Windows X86 funktioniert das einwandfrei, mit Windows 64Bit scheint es nicht mehr zu funktionieren (habe nur zeitweise eine Testumgebung).

Was muss ich machen damit es auch mit Windows 64Bit funktioniert ?

KUBA

s.h.a.r.k 16. Jun 2010 16:44

AW: NT-Service auf 64bit Windows
 
Wo scheitert es denn?

kuba 16. Jun 2010 16:46

AW: NT-Service auf 64bit Windows
 
remote.exe startet nicht, taucht nicht im Taskmanager auf.

ups, ich sehe gerade dass ich den falschen Auszug gepostet habe:

So sieht's aus:
Delphi-Quellcode:
ReadDir(PW3);
ShellExecute(0,Nil,'remote.exe','',PCHar(PW3), SW_HIDE);
Also shellexecute tuts bei 64Bit nicht, warum ?

kuba

Bummi 16. Jun 2010 17:15

AW: NT-Service auf 64bit Windows
 
Ich entwickle hier mir Server2008R2 und hatte noch nie Probleme mit Shellaufrufen.

Ist remote.exe im Suchpfad?

kuba 16. Jun 2010 17:27

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von Bummi (Beitrag 1029417)
Ich entwickle hier mir Server2008R2 und hatte noch nie Probleme mit Shellaufrufen.

Ist remote.exe im Suchpfad?

Gute Frage, kann ich erst überprüfen wenn ich wieder bei meiner Testumgebung bin.

Dieser Code scheint auch Probleme zu machen:

Delphi-Quellcode:
        ReadDir(PW1);
        PW2 := 'watchdog.exe';
        PW3 := '';
    try
        CmdLine := Format('"%s%s" %s',[IncludeTrailingPathDelimiter(PW1),PW2,PW3]);
        FillChar(SI, SizeOf(SI), #0);
        FillChar(PI, SizeOf(PI), #0);
        SI.cb := SizeOf(SI);
        SI.lpDesktop := PChar('Winsta0\Default');
        SI.dwFlags := STARTF_USESHOWWINDOW;
        SI.wShowWindow := SW_SHOWDEFAULT;
        ProcCreated := CreateProcessAsUser(
                            hUserToken,
                            nil,
                            PChar(CmdLine), // pointer to command line string
                            nil,            // pointer to process security attributes
                            nil,            // pointer to thread security attributes
                            True,           // handle inheritance
                            0,              // creation flags
                            nil,            // pointer to new environment block
                            nil,            // pointer to current directory name
                            SI,             // STARTUPINFO
                            PI);            // PROCESS_INFORMATION

        if ProcCreated then
        begin
            CloseHandle(PI.hProcess);
            CloseHandle(PI.hThread);
        end
        else
            ShowMessage('Error ' + SysErrorMessage(GetLastError));
    finally
        CloseHandle(hUserToken);
    end;
Meinst du mit Suchpfad PATH ? Ich starte das Programm doch mit Pfadangabe, oder könnte es an den Rechten des Programmverzeichnis liegen ? Der Dienst als solcher funktioniert einwandfrei, nur die Programme starten nicht in der 64Bit Umgebung.

Ich installiere den Service mit einem Setup (InnoSetup), folgende Zeile habe ich eingefügt damit ich im Programmverzeichnis auf ini-Dateien zugreifen kann:

Delphi-Quellcode:
[Dirs]
Name: "{app}"; Permissions: authusers-full;

Muss ich bei Windows 64Bit irgendwelche Verzeichnisrechte setzten ?

kuba

Luckie 16. Jun 2010 17:59

AW: NT-Service auf 64bit Windows
 
Das ShowMessage wirst du nie sehen, da es ab Windows Vista keine interaktiven Dienste mehr gibt. Schreib besser eine Logdatei.

Den Remarks Abschnitt im Windows SDK hast du gelesen?

kuba 16. Jun 2010 18:02

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von Luckie (Beitrag 1029426)
Das ShowMessage wirst du nie sehen, da es ab Windows Vista keine interaktiven Dienste mehr gibt. Schreib besser eine Logdatei.

Den Remarks Abschnitt im Windows SDK hast du gelesen?

Das Showmessage werde ich nicht sehen, schon klar. Trotzdem, Danke für den Tip mit der Log-Datei. Irgendwo sollte man schon sehen können wenn ein Fehler passiert.

Remarks Abschnitt ?? Hab ich nicht gelesen, wo ???

kuba

Luckie 16. Jun 2010 18:05

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von kuba (Beitrag 1029429)
Irgendwo sollte man schon sehen können wenn ein Fehler passiert.

Sollte man, tut man aber eben in einen Dienst so nicht.

Zitat:

Remarks Abschnitt ?? Hab ich nicht gelesen, wo ???
Im Windows SDK oder eben online im MSDN.

kuba 16. Jun 2010 18:13

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von Luckie (Beitrag 1029430)
Zitat:

Remarks Abschnitt ?? Hab ich nicht gelesen, wo ???
Im Windows SDK oder eben online im MSDN.

Hier ?

Solange mir meine Testumgebung nicht zur Verfügung steht kann ich wohl nur mutmaßen.

kuba

Luckie 16. Jun 2010 18:14

AW: NT-Service auf 64bit Windows
 
Nein, hier: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

kuba 16. Jun 2010 19:17

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von Luckie (Beitrag 1029433)

das da ? "use quotation marks around the executable path"

Kann ich im Moment leider nicht testen...

kuba

Luckie 16. Jun 2010 21:22

AW: NT-Service auf 64bit Windows
 
Nicht nur das. Ich meine auch alles andere. Du musst eben gucken, was bei dir zutreffen könnte.

kuba 18. Jun 2010 15:49

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von Bummi (Beitrag 1029417)
Ich entwickle hier mir Server2008R2 und hatte noch nie Probleme mit Shellaufrufen.

Ist remote.exe im Suchpfad?

Hy,

heute honnte ich ein paar Tests machen, also ShellExecute funktioniert ohne Probleme. Aber bei CreateProcessAsUser scheitert es. Im Moment habe ich noch keine Idee woran es liegen könnte.

kuba

kuba 21. Jun 2010 15:51

AW: NT-Service auf 64bit Windows
 
Hy,

heute konnte ich noch ein paar Versuche machen. Es gibt anscheinend Probleme mit dem UserToken. Wenn ich CreateProcessAsUser verwende dann startet das Programm nicht wie gewünscht auf dem Desktop des angemeldeten Benutzers sondern in Session 0. Ich erhalte also die Meldung "Erkennung interaktiver Dienste".

Sonst konnte ich noch nichts weiter herausfinden...

kuba

Bernhard Geyer 21. Jun 2010 15:57

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von kuba (Beitrag 1030664)
Wenn ich CreateProcessAsUser verwende dann startet das Programm nicht wie gewünscht auf dem Desktop des angemeldeten Benutzers sondern in Session 0.

As Designed. Interaktion von User-Destop mit Dienst ist nicht mehr. Und somit umgekehrt Start einer App aus dem Dienst für den User-Desktop auch nicht mehr. Ist seit Vista nicht mehr möglich (auch wenn dort das Häckchen für Userinteraktion noch vorhanden ist).

taveuni 22. Jun 2010 08:38

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1030666)
As Designed. Interaktion von User-Destop mit Dienst ist nicht mehr. Und somit umgekehrt Start einer App aus dem Dienst für den User-Desktop auch nicht mehr. Ist seit Vista nicht mehr möglich (auch wenn dort das Häckchen für Userinteraktion noch vorhanden ist).

Hallo,
Das kann man so nicht einfach stehen lassen.
Es ist nur nicht mehr so einfach wie zuvor. Folgende Schritte sind (im groben) nötig.

WTSGetActiveConsoleSessionId um die ID der aktiven Windows Session zu holen.
WTSQueryUserToken um den Token für diese Session zu ermitteln.
DuplicateTokenEx um den Token zu duplizieren.
CreateEnvironmentBlock um eine Umgebung zu erzeugen welche uns zu dem Prozess durchlässt.
CreateProcessAsUser mit dem duplizierten Token und der erzeugten Umgebung.
Am Ende nicht vergessen die Tokens und Environment wieder freizugeben.

So ist es weiterhin möglich aus einem Dienst welcher im System Kontext läuft Z.B. einen Prozess im User Kontext zu erzeugen.

Gruss Werner

Bernhard Geyer 22. Jun 2010 09:05

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von taveuni (Beitrag 1030817)
Hallo,
Das kann man so nicht einfach stehen lassen.
Es ist nur nicht mehr so einfach wie zuvor. Folgende Schritte sind (im groben) nötig.

Ok, 1:0 für dich. :-) Jedoch wird man sich bei so vielen Schritten überlegen ob man die Funktionalität überhaupt so benötigt (oder nicht sein Konzept überarbeitet).

Ach ja: Gibts das als fertigen Delphi-Code den man in die CodeLib aufnehmen könnte :?: :zwinker:

kuba 22. Jun 2010 12:29

AW: NT-Service auf 64bit Windows
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1030818)
Ach ja: Gibts das als fertigen Delphi-Code den man in die CodeLib aufnehmen könnte :?: :zwinker:

Ich habs jetzt am Laufen :-D:-D:-D
Mit diesem Code funktioniert es !!

kuba


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.

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