AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Winlogon, Welcome Screen

Ein Thema von stOrM · begonnen am 28. Apr 2008 · letzter Beitrag vom 14. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#1

Winlogon, Welcome Screen

  Alt 28. Apr 2008, 12:35
Hi,
ich bin mir nicht mehr so ganz sicher, wo ich die sources gefunden habe, aber dabei kam mir folgende Idee...

Wenn man z.B. Kaspersky Antivirus installiert, dann zeichnen die im Windows XP Welcome Screen, den Text: "Kaspersky Antivirus" das würde ich auch gerne erreichen, nur halt mit meinen Text...

Jetzt hab ich mal ein wenig gelesen und bin dabei über die Möglichkeit: Winlogon Notification Packages gestossen, demnach sollte das ja möglich sein, wenn man seine DLL im System registriert (entsprechender Registry Pfad)...

Problem: Irgendwie zeichend er mir den Text jetzt leider nur hinter den Welcome Screen (denke mal ist der User Desktop), wie bekomme ich das denn hin, dass er mir den meinen Text auf den Welcome Screen z.B. ganz oben links zeichnet?????? vermutlich ist dass Problem das ich nicht weiss, wie ich den Welcome Desktop Screen ermitteln soll und somit auf den Canvas meinen Text zeichnen kann...

Mal der Source (wie gesagt kann mich nicht mehr erinnern wo der her ist...)

Delphi-Quellcode:
library sLogon;

uses
  Windows,
  Graphics,
  Sysutils,
  types;

type
  PWSTR = PWideChar;
  HANDLE = Longword;
  PFNMSGECALLBACK = function(bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;

  _WLX_NOTIFICATION_INFO = record
    Size: ULONG;
    Flags: ULONG;
    UserName: PWSTR;
    Domain: PWSTR;
    WindowStation: PWSTR;
    hToken: HANDLE;
    hDesktop: HDESK;
    pStatusCallback: PFNMSGECALLBACK;
  end;
  WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
  PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;

procedure DrawPicture(const FileName: String; Width: Integer = 0;
  Height: Integer = 0; Top: Integer = 0; Left: Integer = 0);
var
  DC : HDC;
  Canvas : TCanvas;
  Bitmap : TBitmap;
begin
  // Falls die Datei existiert, dann fortfahren
  if FileExists(FileName) then
  begin
    Bitmap := TBitmap.Create();

    try
      Bitmap.LoadFromFile(FileName);
      // Falls eigene Parameter angeben sind, werden diese benutzt.
      if Height > 0 then
        Bitmap.Height := Height;
      if Width > 0 then
        Bitmap.Width := Width;
      // Wir holen uns den 'Device Context' vom Desktop
      DC := GetWindowDC(GetDesktopWindow());
      try
        Canvas := TCanvas.Create();
        try
          // Wir weisen den DC dem Canvas zu
          Canvas.Handle := DC;
          // Das Bild wird an Left / Top auf den Desktop gezeichnet
          Canvas.Draw(Left, Top, Bitmap);

        finally
          Canvas.Free;
        end;
      finally
        ReleaseDC(0, DC);
      end;
    finally
      Bitmap.Free;
    end;
  end;
end;

procedure WLEventLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin
  DrawPicture('MG.bmp', 0, 0, 0, 0);

end;

procedure WLEventLogoff(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin
  DrawPicture('MG.bmp', 0, 0, 0, 0);

end;

exports
  WLEventLogon,
  WLEventLogoff;

begin

end.
Vielen Dank
Marc
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

Re: Winlogon, Welcome Screen

  Alt 28. Apr 2008, 12:56
Wundert mich eigentlich :
Der Desktop ist auch nur ein Fenster. Wenn eine externe Anwendung dort was draufmalt, und dies nicht ständig wiederholt, dann wird der Text irgendwann überschrieben.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Winlogon, Welcome Screen

  Alt 28. Apr 2008, 16:57
Zitat von Dezipaitor:
Wundert mich eigentlich :
Der Desktop ist auch nur ein Fenster. Wenn eine externe Anwendung dort was draufmalt, und dies nicht ständig wiederholt, dann wird der Text irgendwann überschrieben.
Öhm der Desktop iss ja nicht das Problem ich versuchs nochmal anders zu erklären...
Ich würde gerne oben links in der Ecke von Welcome Screen unter XP etwas malen...

Obiger Code mal aber auf den User Desktop, daher Frage: wie bekomme ich den DC vom Welcome Screen?

Siehe DrawPicture:

// Wir holen uns den 'Device Context' vom Desktop
DC := GetWindowDC(GetDesktopWindow());

Dürfte hier wohl falsch sein, da GetDesktopWindow wohl nicht den Willkommen Bildschirm holt, anstelle dessen aber den Benutzerbildschirm (wie ich darauf komme? Weiss ich auch nicht so genau, aber wenn ich die dll in der Registry eintrage und einen Neustart mache dann sieht man ganz kurz, bevor der Willkommensbildschirm kommt meinen Text, welcher anscheinend hinter dem Willkommensbildschirm liegt (also Benutzerdesktop)?

Gruss
s!
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

Re: Winlogon, Welcome Screen

  Alt 28. Apr 2008, 19:40
Was ist der Willkommensbildschirm für dich?

Der Desktop mit dem LoginDialog ist ein anderer als der normale Desktop für die Anwendungen.

Ich nehme an, du willst den Anmeldebildschirm-Desktop oder? Dieser Desktop heißt "winlogon". Er ist von normalen Benutzerprogrammen nicht erreichbar. Man müsste ein Program durch einen Dienst in die Session des Benutzers starten (mit SYSTEM Rechten). Dieses programm könnte ein kleines Fenster mit dem Text in den Winlogonbildschirm einblenden. Ohne Fensterrand und mit Hintergrundfarbe (oder Transparenz) sieht das so aus, als ob da ein Text auf dem Desktop steht.

Wenn du auf den normalen Desktop einfach so - und nur einmal - einen Text zeichnest, dann wird dieser Text gelöscht, sobald der Desktop sich neumalt, z.B. weil ein Fenster darüber bewegt wird.

Wen dein Code als Systembenutzer ausgeführt wird, dann kannst du mit OpenDesktop('winlogon',...) und SetThreadDesktop sowie GetDesktopWindow den winlogon Desktop möglicherweise auch bekommen.

Die JWSCL kann das in OOP. Ich vermute mal, es sieht etwa so aus, wie im Quelltext. Aber ich kann nicht versprechen, dass es funkz:

Delphi-Quellcode:
uses Windows, JwsclDesktops;
var
     Desktop: TJwSecurityDesktop;

begin
      Desktop:=TJwSecurityDesktop.OpenDesktop('winlogon', [], false, GENERIC_ALL);
      Desktop.SetThreadDesktop;
      try
        DrawPicture('MG.bmp', 0, 0, 0, 0);
      finally
        Desktop.Free;
      end;
end;
Der Code muss als SYSTEM Benutzer ausgeführt werden. Zudem muss die SessionID des Prozesses, die Session des jeweiligen angemeldeten Benutzers sein.
Z.B.
Windows XP
- Ein Benutzer angemeldet. Session ID muss 0 sein. Das kann noch ein Dienst machen.
- Zwei Benutzer angemeldet. Session ID muss 0 und 1 sein. Also hier brauchen wir zwei Prozesse in Session 0 (erster Benutzer) und Session 1 (zweiter Benutzer). Session 0 kann noch ein Dienst machen. Session 1 nicht mehr. Hier muss der Dienst ein Programm in diese Session starten.
Windows Vista.
-Ein Benutzer angeldet. Session ID muss 1 sein. Ein Dienst kann hier nichts machen. Hier muss der Dienst ein Programm in diese Session starten.
-weitere Benutzer, wie in XP
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Winlogon, Welcome Screen

  Alt 29. Apr 2008, 02:10
Zitat von Dezipaitor:
Man müsste ein Program durch einen Dienst in die Session des Benutzers starten (mit SYSTEM Rechten). Dieses programm könnte ein kleines Fenster mit dem Text in den Winlogonbildschirm einblenden. Ohne Fensterrand und mit Hintergrundfarbe (oder Transparenz) sieht das so aus, als ob da ein Text auf dem Desktop steht.

???????????????? Bahnhof!
Mir ist deine Erklärung nicht ganz klar, weil ich nicht verstehe wofür ich einen Dienst brauche, wenn man so wie ich das verstanden habe dem System (OS) mittels Registryeintrag bekannt gibt, das man eine Notification DLL gebaut hat....?
Meine DLL wird ja von der Winlogon.exe geladen (merk ich daran, wenn ich meine DLL aus dem System32 Verzeichnis löschen will, meckert Windows, das Winlogon.exe Zugriff auf meine DLL hat (Unlocker sei dank!) abgesehen davon kann ich ja z.B. ne Messagebox im Winlogon ausgeben also bin ich doch in der richtigen Ebene oder meinst du, wenn ich den Winlogon Zeichnen will dann brauch ich nen Service????...

Besteht nicht die Möglichkeit, aus meiner DLL ein Fenster zu starten, welches sich in meiner DLL befindet?
Quasi in etwa so:

Delphi-Quellcode:
procedure WLEventLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin

  dllFormShow.ShowForm;

end;
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#6

Re: Winlogon, Welcome Screen

  Alt 29. Apr 2008, 09:16
Das WINDOWS-eigene Programm, das für den Logon-Bildschirm zuständig ist, heisst Gina.DLL(msgina.dll,shgina.dll). Google einfach danach. Es gibt massenhaft Programme, die Gina.DLL ersetzen.

http://www.google.com/codesearch?hl=...DLL&btnG=Suche
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#7

Re: Winlogon, Welcome Screen

  Alt 29. Apr 2008, 09:59
1. GINA gibt es nicht mehr in Vista
2. Ich bin mir nicht sicher, aber die Callbackfunktion könnte ohne eigenen Thread aufgerufen werden. Solange du also in der Callbackfunktion irgendwas machst, kwird der Winlogon Prozess nicht funktionieren.
3. Wenn dein Programmcode innerhalb von Winlogon crasht, wird der Prozess beendet und der PC startet automatisch neu.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Winlogon, Welcome Screen

  Alt 13. Mai 2008, 23:05
Yo da bin ich nochmal, ich verzweifel langsam!

Vielleicht drehen wir das ganze nochmal ein wenig zurück, sofern noch interesse besteht, ich hänge mal am Schluß meines Fragekataloges den Quelltext der DLL mit rein...

Folgendes hat sich geändert, ich versuche jetzt nicht mehr direkt, auf den Winlogon zu zeichnen, dass klappt irgendwie mal überhaupt nicht, keine Ahnung wie Kaspersky das gemacht hat, aber ich vermute mal das der KAV Dienst dabei behilflich ist...

Ich verfolge da einen anderen Ansatz, nämlich den, den du (Dezipaitor) erwähnt hattest, ein Fenster transparent zu machen und so einen, pseudo gezeichneten Text auf den Winlogon erscheinen zu lassen.

Dafür hatte ich die Idee in meiner Winlogon Notification Package (was für ein Name!) über CreateProcess bei Logon / Logoff eine executeable aufzurufen, diese könnte dann das unsichtbare Fenster mit text usw enthalten...

Problem 1:
Ich bin jetzt mittlerweile soweit, das die exe aufgerufen wird bei jedem Logon / Logoff nur da gibt es ein extremes Problem...
Sie wird ausgeführt nachdem der User sich mittels Password authentifiziert hat, soll heissen, nach Eingabe des Passwords im Winlogon erscheint mein Fenster auf dem "normalen" User Desktop, was natürlich extrem dumm ist, sie sollte eigentlich im Winlogon ausgeführt werden... Ich vermute mal wenn ich dich richtig verstanden habe "Dezipaitor" dann liegt das daran, das meine exe keine Systemrechte hat????

Dann wäre da folgende Frage, gibt es die Möglichkeit in meiner DLL mittels CreateProcess einer exe diese Rechte zu geben, wenn ja währe ich extrem fröhlich, wenn man dafür ein Beispiel hätte...

Das Problen an der ganzen Sache ist, ich möchte keinen Dienst schreiben dafür, wobei dort ebenfalls das gleiche Problem wäre, CreateProcess mit Systemrecht...

Vielleicht schaust Du bitte nochmals über meine DLL eventuell weisst Du ja was falsch ist?
Ich glaube der CreateProcess Teil war sogar von dir??

Delphi-Quellcode:
library swxLogonNotify;

uses
  SysUtils,
  Classes,
  Windows,
  JwaWindows,
  JwsclStrings;

type
  TFnMsgeCallback = function (bVerbose: Boolean; lpMessage: PWideChar): Cardinal; stdcall;

TWlxNotificationInfo = record
    Size: Cardinal;
    Flags: Cardinal;
    UserName: PWideChar;
    Domain: PWideChar;
    WindowStation: PWideChar;
    Token: Cardinal;
    Desktop: Cardinal;
    StatusCallback: TFnMsgeCallback;
  end;
  PWlxNotificationInfo = ^TWlxNotificationInfo;

{$R *.res}

procedure StartApp(const App, Parameters, CurDir : TJwString);
var
  StartupInfo: {$IFDEF UNICODE}TStartupInfoW{$ELSE}TStartupInfoA{$ENDIF};
  ProcInfo : TProcessInformation;
  pEnv : Pointer;
  pCurDir,
  pCmdLine : TJwPChar;
begin

  ZeroMemory(@StartupInfo, sizeof(StartupInfo));
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.lpDesktop := 'winsta0\default';
  CreateEnvironmentBlock(@pEnv, 0, true);
  try
    if Length(Parameters) > 0 then
      pCmdLine := TJwPChar('"'+App+'" ' + Parameters)
    else
      pCmdLine := TJwPChar('"'+App+'" ');
    pCurDir := Nil;
    if Length(CurDir) > 0 then
      pCurDir := TJwPChar(CurDir);
   if not

{$IFDEF UNICODE}CreateProcessW{$ELSE}CreateProcessA{$ENDIF}(

    TJwPChar(App),//__in_opt LPCTSTR lpApplicationName,
    pCmdLine, //__inout_opt LPTSTR lpCommandLine,
    nil,//__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
    nil,//__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
    true,//__in BOOL bInheritHandles,
    CREATE_NEW_CONSOLE or CREATE_UNICODE_ENVIRONMENT,//__in DWORD dwCreationFlags,
    pEnv,//__in_opt LPVOID lpEnvironment,
   pCurDir,//__in_opt LPCTSTR lpCurrentDirectory,
    StartupInfo,//__in LPSTARTUPINFO lpStartupInfo,
    ProcInfo,//__out LPPROCESS_INFORMATION lpProcessInformation
  ) then
   raiseLastOsError;

  finally
    DestroyEnvironmentBlock(pEnv);
  end;
  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);
end;

procedure StartupHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure LogonHandler(Info: PWlxNotificationInfo); stdcall;
begin
  StartApp('c:\windows\system32\storm.exe', '', '');
end;

procedure StartShellHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure LockHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure UnLockHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure StartScreenSaverHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure StopScreenSaverHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure LogoffHandler(Info: PWlxNotificationInfo); stdcall;
begin
  StartApp('c:\windows\system32\storm.exe', '', '');
end;

procedure ShutdownHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure DisconnectHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure ReconnectHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;

procedure PostShellHandler(Info: PWlxNotificationInfo); stdcall;
begin

end;



//Nachfolgender Bereich verdunkelt mit das Hirn, brauch ich den unbedingt???

procedure EntryPointProc(reason: integer);
begin
  case reason of
    DLL_PROCESS_ATTACH: //1
      begin
        DisableThreadLibraryCalls(hInstance);
      end;
    DLL_THREAD_ATTACH: //2
      begin

      end;
    DLL_PROCESS_DETACH: //3
      begin

      end;
    DLL_THREAD_DETACH: //0
      begin

      end;
  end;

end;

exports
  StartupHandler,
  LogonHandler,
  StartShellHandler,
  LockHandler,
  UnLockHandler,
  StartScreenSaverHandler,
  StopScreenSaverHandler,
  LogoffHandler,
  ShutdownHandler,
  DisconnectHandler,
  ReconnectHandler,
  PostShellHandler;

begin
  DllProc := @EntryPointProc;
  DllProc(DLL_PROCESS_ATTACH);
end.
Vielen Dank!
Marc
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#9

Re: Winlogon, Welcome Screen

  Alt 14. Mai 2008, 00:06
da steht
StartupInfo.lpDesktop := 'winsta0\default'; sollte net so sein, oder?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Winlogon, Welcome Screen

  Alt 14. Mai 2008, 00:28
öhm nicht?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 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