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/)
-   -   Seltsames Verhalten NT-Service Komponente (https://www.delphipraxis.net/167348-seltsames-verhalten-nt-service-komponente.html)

kuba 25. Mär 2012 17:34

Seltsames Verhalten NT-Service Komponente
 
Hallo,

ich habe mit Delphi XE2 eine Service Anwendung angelegt. Dann einen Timer auf das Formular und folgenden Code hinterlegt:

Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
  Vcl.ExtCtrls;

type
  TService2 = class(TService)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  Service2: TService2;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service2.Controller(CtrlCode);
end;

function TService2.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;


function CreateProcessWithLogon(lpUsername: PWideChar;
                                lpDomain: PWideChar;
                                lpPassword: PWideChar;
                                dwLogonFlags: DWORD;
                                lpApplicationName: PWideChar;
                                lpCommandLine: PWideChar;
                                dwCreationFlags: DWORD;
                                lpEnvironment: Pointer;
                                lpCurrentDirectory: PWideChar;
                                var lpStartupInfo: TStartupInfo;
                                var lpProcessInfo: TProcessInformation): BOOL; stdcall;
                                external 'advapi32' name 'CreateProcessWithLogonW';

function CreateEnvironmentBlock(var lpEnvironment: Pointer;
                                hToken: THandle;
                                bInherit: BOOL): BOOL; stdcall; external 'userenv';

function DestroyEnvironmentBlock(pEnvironment: Pointer): BOOL; stdcall;
external 'userenv';

const
  LOGON_WITH_PROFILE = $00000001;

{------------
Emulate the RunAs function
--------------}

function RunAs(User, Password, Command: String): Integer;
var dwSize:       DWORD;
    hToken:       THandle;
    lpvEnv:       Pointer;
    pi:           TProcessInformation;
    si:           TStartupInfo;
    szPath:       Array [0..MAX_PATH] of WideChar;
begin

  ZeroMemory(@szPath, SizeOf(szPath));
  ZeroMemory(@pi, SizeOf(pi));
  ZeroMemory(@si, SizeOf(si));
  si.cb:=SizeOf(TStartupInfo);

  if LogonUser(PChar(User), nil, PChar(Password), LOGON32_LOGON_INTERACTIVE,
  LOGON32_PROVIDER_DEFAULT, hToken) then
  begin
    if CreateEnvironmentBlock(lpvEnv, hToken, True) then
    begin
        dwSize:=SizeOf(szPath) div SizeOf(WCHAR);
        if (GetCurrentDirectoryW(dwSize, @szPath) > 0) then
        begin
          if (CreateProcessWithLogon(PWideChar(WideString(User)), nil,
          PWideChar(WideString(Password)),
              LOGON_WITH_PROFILE, nil, PWideChar(WideString(Command)),
              CREATE_UNICODE_ENVIRONMENT,
              lpvEnv, szPath, si, pi)) then
          begin
              result:=ERROR_SUCCESS;
              CloseHandle(pi.hProcess);
              CloseHandle(pi.hThread);
          end
          else
              result:=GetLastError;
        end
        else
          result:=GetLastError;
        DestroyEnvironmentBlock(lpvEnv);
    end
    else
        result:=GetLastError;
    CloseHandle(hToken);
  end
  else
    result:=GetLastError;
end;


procedure TService2.Timer1Timer(Sender: TObject);
begin
  RunAs('user','password','notepad.exe');
  Timer1.Enabled:=false;
end;

end.
Wenn ich den NT-Service mit run.exe /install installiere, dann startet notepad.exe. Starte ich den NT-Service mit "net start Service"2 passiert nichts. Starte ich run.exe in der Eingabeaufforderung, dann startet auch notepad.exe. Warum wird notepad.exe nicht gestartet wenn ich "net start Service2" eingebe ?? Beim Deinstallieren mit run.exe /uninstall startet notepad.exe übrigens auch.

kuba

Sir Rufo 25. Mär 2012 17:56

AW: Seltsames Verhalten NT-Service Komponente
 
Wenn der Service als Service läuft, dann gelten andere Spielregeln.

Kontrollier mal die Prozessliste (Prozesse aller Benutzer) und schau, ob dort Notepad auftaucht.

himitsu 25. Mär 2012 18:15

AW: Seltsames Verhalten NT-Service Komponente
 
Und dazu noch, RunAs gibt zwar den Fehlercode zurück ( wieso eigentlich als vorzeichenbehafteter Integer und nicht als vorzeichenloses HRESULT? ),
aber du wertest diesen nicht aus.

Nja, du wirst auch noch den Ziel-Desktop irgendwie zuweisen müssen, ansonsten wird der des Services verwendet und wenn der als "nicht interaktiv" eingestellt ist, dann gibt es Keinen.

kuba 25. Mär 2012 19:24

AW: Seltsames Verhalten NT-Service Komponente
 
Im Taskmanager taucht notepad.exe nur auf wenn ich den Service installiere/deinstalliere oder per Eingabeaufforderung run.exe eingebe.

Ich wollte ein Programm starten bevor ein Benutzer am Desktop angemeldet ist, natürlich nicht notepad.exe, sondern ein DOS Programm. Geht das überhaupt ??

KUBA

Luckie 25. Mär 2012 20:29

AW: Seltsames Verhalten NT-Service Komponente
 
Das Programm wird auf dem Desktop des Service laufen. Du wirst es also nicht sehen.

Dalai 25. Mär 2012 20:37

AW: Seltsames Verhalten NT-Service Komponente
 
Darf ich fragen, warum du dir den Aufwand des RunAs machst, wenn du eh schon einen Dienst hast und damit genug Rechte (sei es nun SYSTEM, LocalService oder NetworkService)? Oder geht's um ein längerlaufendes Programm, das mit dem Desktop interagieren können soll/muss?

MfG Dalai

kuba 25. Mär 2012 20:53

AW: Seltsames Verhalten NT-Service Komponente
 
Ich möchte ein Programm im Benutzerkontext starten bevor der Benutzer am Desktop angemeldet ist. Es geht mir konkret um die Benutzeranmeldung, während der Benutzeranmeldung erscheint der Start ORB. Wenn man darauf klickt geht das Startmenü auf. Ich möchte schon vor der Benutzeranmeldung ein Programm aktiv im Hintergrund haben, welches den Start ORB "unbrauchbar" macht sodaß kein Startmenü mehr erscheint.

Bisher habe ich noch keine Möglichkeit (z.B. Registry Tweak) gefunden um das Startmenü auszublenden.

Da hab ich einfach mal ein bischen experementiert und bin auf dieses seltsame Verhalten mit RunAs gestoßen. Ist doch schon seltsam dass notepad.exe beim Installieren des Service gestartet wird, oder ?

KUBA

Sir Rufo 25. Mär 2012 21:33

AW: Seltsames Verhalten NT-Service Komponente
 
Nein, ist es nicht, es hätte mich gewundert, wenn es da nicht starten würde

himitsu 25. Mär 2012 21:42

AW: Seltsames Verhalten NT-Service Komponente
 
Zitat:

Zitat von kuba (Beitrag 1158509)
Ist doch schon seltsam dass notepad.exe beim Installieren des Service gestartet wird, oder ?

Ich dachte nicht?

Zitat:

Und dazu noch, RunAs gibt zwar den Fehlercode zurück ( wieso eigentlich als vorzeichenbehafteter Integer und nicht als vorzeichenloses HRESULT? ),
aber du wertest diesen nicht aus.
Und was sagt es?

Bummi 25. Mär 2012 22:09

AW: Seltsames Verhalten NT-Service Komponente
 
@kuba
Du hattest doch schon mal eine funktionierende Version gepostet

http://www.delphipraxis.net/109191-p...ich-mal-4.html
28. Nov 2011, 22:16

oder was habe ich übersehen?

kuba 25. Mär 2012 22:32

AW: Seltsames Verhalten NT-Service Komponente
 
Zitat:

Zitat von Bummi (Beitrag 1158515)
@kuba
Du hattest doch schon mal eine funktionierende Version gepostet

http://www.delphipraxis.net/109191-p...ich-mal-4.html
28. Nov 2011, 22:16

oder was habe ich übersehen?

nee, schon richtig. Funktioniert aber erst "nach" der Benutzeranmeldung.

Habe mal experementiert ob es nicht möglich ist vorher schon ein Programm zu starten (bevor sich der Benutzer am Desktop angemeldet hat). Dabei fiel mir halt auf dass RunAs bei der Installation des Service funktioniert (notepad.exe wird getstartet), aber wenn der Service mit "net start Service2" gestartet wird dann wird notepad.exe eben nicht gestartet.

KUBA

jaenicke 26. Mär 2012 09:08

AW: Seltsames Verhalten NT-Service Komponente
 
Im Startmenü stehen doch sicher ohnehin keine relevanten Einträge mehr, denn das ist ja schließlich normalerweise das erste, das in einem Kiosk Modus per Policy rausfliegt. Machen kann der Benutzer damit also ohnehin nix.

Es geht also ausschließlich um die Optik, damit der Benutzer bei der Anmeldung nicht einmal kurz den Startbutton sieht, oder? Lohnt sich dafür der Aufwand? :gruebel:
Und wenn dein Dienst in RunOnce des Benutzers eine kleine Anwendung ohne visuelle Oberfläche einträgt, sollte deren Ausführung ohnehin so schnell gehen, dass man nicht viel sieht bis der gestartet ist und "alles kaputt macht" :mrgreen:.

himitsu 26. Mär 2012 09:19

AW: Seltsames Verhalten NT-Service Komponente
 
Autostart / Run / RunOnce ... einfach nur Shift drücken (ich glaub das war so), während des Starts und diese werden nicht ausgeführt.

Sir Rufo 26. Mär 2012 11:31

AW: Seltsames Verhalten NT-Service Komponente
 
Es gibt doch auch noch die Möglichkeit den Verursacher (Explorer.exe) für das Startmenü auszutauschen.
Dann braucht man auch nichts zu entfernen :stupid:

himitsu 26. Mär 2012 12:16

AW: Seltsames Verhalten NT-Service Komponente
 
Ab mindestens Windows 7 steht die Explorer.exe unter einem besonderen Schutz und kann nicht so einfach getauscht werden.
Da hast'e nichtmal als Admin das Recht dazu.

CCRDude 26. Mär 2012 12:17

AW: Seltsames Verhalten NT-Service Komponente
 
Mal eine "dumme" Frage... hast Du Dir die Events, die ein TService Dir bietet, überhaupt angeschaut?

Warum es schon/auch beim Installieren passiert, wird dabei klar - dafür wird nämlich auch eine Instanz initialisiert (und Events ausgelöst, etwa OnBeforeInstall und OnAfterInstall).

Wenn Du unbedingt mit einem TTimer arbeiten möchtest, habe ihn zur Designtime als Enabled = false, und setzte das erst im OnExecute auf true.

Eine minimale Fehlerverwaltung, sei es ins Event Log oder ne Textdatei zu schreiben, löst auch so viele Fehler...

Zum eigentlichen Fehler gab's ja schon genug Rückmeldungen, da enthalte ich mich mal :)

Sir Rufo 26. Mär 2012 13:01

AW: Seltsames Verhalten NT-Service Komponente
 
Zitat:

Zitat von himitsu (Beitrag 1158598)
Ab mindestens Windows 7 steht die Explorer.exe unter einem besonderen Schutz und kann nicht so einfach getauscht werden.
Da hast'e nichtmal als Admin das Recht dazu.

Aha, dann muss ich mit meinem Windows 7 aber mal schimpfen, denn ich habe eben für einen User in der Registry den Shell Wert eingetragen mit einem Mini-Programm und siehe da nur noch das Programm und nichts mehr vom Explorer.

Komisches Dingen halt.

jaenicke 26. Mär 2012 13:08

AW: Seltsames Verhalten NT-Service Komponente
 
Das funktioniert auch problemlos. Man kann nur die Exe selbst nicht so einfach manipulieren. ;-)

himitsu 26. Mär 2012 13:30

AW: Seltsames Verhalten NT-Service Komponente
 
Zitat:

Zitat von Sir Rufo (Beitrag 1158619)
Aha, dann muss ich mit meinem Windows 7 aber mal schimpfen, denn ich habe eben für einen User in der Registry den Shell Wert eingetragen mit einem Mini-Programm und siehe da nur noch das Programm und nichts mehr vom Explorer.

OK, die Registry ändern geht klar.

Klang so, als wollte man die Explorer.exe direkt ändern, also die Datei löschen oder umbenennen und da hat Windows den Schutz erhöht.

Im Gegensatz dazu sind in der Registry sind viele Stellen leider noch garnicht geschützt, und können sogar von einem "billigen" Benutzer verändert werden.
Ändere einfach mal die Behandlung des Dateierweiterung .exe und leite die ausführung als Parameter an ein Programm weiter.
Dann wird dieses Programm immer gestartet, wenn man im Explorer, über ein Icon oder über irgendeine andere Verlinkung, eine *.exe startet.

kuba 26. Mär 2012 21:19

AW: Seltsames Verhalten NT-Service Komponente
 
Zitat:

Zitat von CCRDude (Beitrag 1158599)
Mal eine "dumme" Frage... hast Du Dir die Events, die ein TService Dir bietet, überhaupt angeschaut?

Warum es schon/auch beim Installieren passiert, wird dabei klar - dafür wird nämlich auch eine Instanz initialisiert (und Events ausgelöst, etwa OnBeforeInstall und OnAfterInstall).

Wenn Du unbedingt mit einem TTimer arbeiten möchtest, habe ihn zur Designtime als Enabled = false, und setzte das erst im OnExecute auf true.

Eine minimale Fehlerverwaltung, sei es ins Event Log oder ne Textdatei zu schreiben, löst auch so viele Fehler...

Zum eigentlichen Fehler gab's ja schon genug Rückmeldungen, da enthalte ich mich mal :)

Ich wusste daß ich einfach wieder zu dumm war, OK habe den Fehler erkannt ...

Also mit RunAs is nicht im NT-Service, ich denke daß ich per winlogon ans Ziel komme...

Da müsste sich doch was machen lassen um das dumme Startmenü endlich abzuschalten.

KUBA

CCRDude 27. Mär 2012 08:27

AW: Seltsames Verhalten NT-Service Komponente
 
Wenn Du schon Services nicht hinbekommst, würde ich von Winlogon die Hände lassen. Das erfordert noch deutlich mehr Einblicke in's System!

Und nur so nebenbei - der Logon-Bildschirm ist ein eigener Desktop (auf Desktops wurdest Du schon hingewiesen) und ein anderer Desktop als der des Users, in dem der Startschirm erscheint. Welche Konsequenzen das für Dein Vorhaben hat? Informier Dich über Desktops :)

kuba 27. Mär 2012 22:14

AW: Seltsames Verhalten NT-Service Komponente
 
Zitat:

Zitat von CCRDude (Beitrag 1158811)
Wenn Du schon Services nicht hinbekommst, würde ich von Winlogon die Hände lassen. Das erfordert noch deutlich mehr Einblicke in's System!

Ja danke auch, daß ich es mit dem NT-Service nicht hinbekomme ...

Ich denke, daß es schon ganz gut funktioniert, Problem ist jedoch immer noch das Startmenue in der Anmeldephase. Da gibts doch noch "winsta0/winlogon", das ist doch der Desktop, der mir Probleme macht.

Ich komme schon noch darauf ...

KUBA

Sir Rufo 27. Mär 2012 22:33

AW: Seltsames Verhalten NT-Service Komponente
 
Warum änderst du für den betroffenen User nicht die Shell vom Explorer auf ein eigenes Progrämmle?

Dann gibt es kein Startmenü mehr, sondern nur noch das, was du vorgibst.
In der Registry kannst du auch noch das Verhalten von Strg-Alt-Entf beeinflussen.

Vor allem, weil es fast komplett mit Bordmitteln zu erreichen ist, warum da etwas kompliziertes drumherum fummeln?

Bummi 27. Mär 2012 23:36

AW: Seltsames Verhalten NT-Service Komponente
 
@Sir Rufo
:thumb: KISS

himitsu 27. Mär 2012 23:49

AW: Seltsames Verhalten NT-Service Komponente
 
Und die nativen Möglichkeiten sind oftmals auch noch sicherer,
vorallem wenn man die Benutzerrechte voll ausnutzt.

kuba 30. Mär 2012 11:35

AW: Seltsames Verhalten NT-Service Komponente
 
@Sir Rufo
:thumb: KISS

so hab ich es jetzt gemacht !!

Funktioniert super :-D

Problem ist nur, daß mein Programm jetzt wieder von einem Virenscanner bei Virustotal als Virus eingestuft wird. Das liegt wohl daran, daß ich mit meinem Programm die Shell in der Registry ändere. Ich schicke nochmal die Probs an den Virenscanner Hersteller.

KUBA

kuba 31. Mär 2012 11:04

AW: Seltsames Verhalten NT-Service Komponente
 
Zitat:

Zitat von Sir Rufo (Beitrag 1159002)
In der Registry kannst du auch noch das Verhalten von Strg-Alt-Entf beeinflussen.

Berarbeitet:

Ach so, jetzt weiß ich was du meinst DisableTaskManager usw.
Ich dachte CTRL+ALT+DEL komplett abschalten.

CTRL+ALT+DEL komplett abschalten soll ja angeblich nicht gehen. Zumindest weiß offiziell keiner wies geht. Ich hab aber schon mal einen PC gesehen bei dem nichts passiert ist wenn man CTRL+ALT+DEL gedrückt hat.

Also irgendwie geht es, das steht fest !!

Vielleicht hatten die in dem Internetcafe auch einfach die Tastatur "hardwareseitig" manipuliert. Wer weiß ...

KUBA

Luckie 31. Mär 2012 13:21

AW: Seltsames Verhalten NT-Service Komponente
 
Eigener Tastaturtreiber.

himitsu 31. Mär 2012 14:37

AW: Seltsames Verhalten NT-Service Komponente
 
Strg+Alt+Entf ist halt eine Sicherheitsmaßnahme.
Und diese läßt sich absichtlich nicht so einfach aushebeln.
Genauso wie man diese Tastenkombination nicht virtuell (über ein Programm) erzeugen kann.

OK, abgesehn von einem Tastaturtreiber, aber damit kann man es nur erzeugen, aber nicht unterdrücken.
(da müßte man dann ja den eigentlichen Tastaturtreiber aushebeln, dort den Tastencode rausfiltern oder alles Andere über einen eigenen virtuellen treiber ans System weiterleiten)

Sir Rufo 31. Mär 2012 18:17

AW: Seltsames Verhalten NT-Service Komponente
 
Da man über die Registry alles abschalten kann, was beim drücken von Strg-Alt-Entf möglich ist, würde mich das schon gar nicht mehr interessieren diese Kombination abzufangen.

Ich habe es noch nicht ausprobiert, aber wenn alle Funktionen per Reg abgeschaltet sind, dann wäre eigentlich nur noch der Menüpunkt Abbrechen übrig. Ist Windows dann so intelligent und zeigt dann auch dieses Menü nicht an?

Und wenn wäre es auch egal ... der User kann nichts machen, nur diesen einen Menüpunkt anstarren ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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-2025 by Thomas Breitkreuz