Autor Beitrag
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mo 18.10.04 15:46 
...ohne den (unzuverlässigen) Autostart benutzen zu müssen.

Das als Shell registrierte Programm, wird als erstes, noch vor den Autostarts ausgeführt! Auf normalen Windowssystemen ist das natürlich der Explorer, also die explorer.exe.
In manchen Situationen ist es aber wichtig, ein anderes Programm zuerst zu starten. Zum Beispiel könnte man so ein Anmeldeprogramm
im Stil des Windowslogon realisieren.

Der Shell steht in der Registry unter folgendem Key. Diesen Code benutzten wir um den Shell zu ändern:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
uses [...], Registry;   

[...]   

procedure TForm1.Button1Click(Sender: TObject);   
var Reg : TRegistry;   
begin   
 reg := TRegistry.Create;   
 with reg do   
   begin   
     try   
       RootKey := HKEY_LOCAL_MACHINE;   
       OpenKey('Software\Microsoft\Windows NT\CurrentVersion\Winlogon', true); 
       WriteString('Shell''meinprogramm.exe'); {Euer Programm muss im systemverzeichniss liegen, also z.B. c:\winnt\meinprog.exe}  
     finally   
       reg.Free;   
     end;   
   end;   
end;




Folgenden Code benutzten wir um den Shell dann wieder auf den Explorer zu setzten, woraufhin der PC wieder normal benutzt werden kann, die folgende Prozedur muss in eurem Programm vorkommen, sonst gibt es keine Möglichkeit mehr den Shell wieder auf den Explorer zu setzten, und nur mit diesem funktioniert Windows so wie man es gewohnt ist!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
uses [...], Registry, ShellApi; {In der Shellapi Unit befindet sich die ShellExecute Funktion!}

[...]


var Reg : TRegistry;
begin
reg := TRegistry.create;
 try
   with Reg do
    begin
      try
        reg.RootKey := HKEY_LOCAL_MACHINE;
        Reg.OpenKey('Software\Microsoft\Windows NT\CurrentVersion\Winlogon', true);
        Reg.WriteString('Shell''explorer.exe'); {explorer.exe = c:\winnt\explorer.exe}
      finally
        Reg.Free;
      end;
    end;
 finally
     try
       sleep(3000); {um sicher zu gehen das die Registry upgedatet wurde, gibt auf langsamen Rechnern sonst einen Fehler!}
       ShellExecute(0Nil, PChar('explorer.exe'), Pchar(''), Pchar(''), SW_NORMAL);
     finally
       close; {eigenes Programm schließen}
     end;
 end;
end;


Erst muss der Shell wieder auf Explorer.exe gelegt werden, danach erst wird der Explorer wieder gestartet.
Wenn ihr den Shell nicht umstellen, wenn ihr z.B. keine Administratorrechte habt, wird der Explorer nicht unnordnungsgemäß starten!

Auf jedenfall ist äußerste Vorsicht beim arbeiten geboten! Wenn ihr euch keine Hintertür einbaut, um den Shell wieder zurückzusetzten, müsst ihr Windows unter umständen neu installieren!

Vielen dank an Christian Seehase, der mir die ganze Geschichte erklärt hat!

In Absprache mit user profile iconKarlson folgende Ergänzungen:
Die oben genannten Hintertüren ergeben sich wie folgt (entsprechende Benutzerrechte vorausgesetzt):
user profile iconarj hat folgendes geschrieben:
Task-Manager aufrufen (STRG+ALT+ENTF)
Datei -> Ausführen -> regedit

und Shell wieder von Hand eintragen.
Ausloggen. Und wieder neu einloggen.

user profile icondigi_c hat folgendes geschrieben:
Oder einfach im taskmanager->ausführen->explorer aber das ist natürlich nicht so "nachhaltig"

Vielen Dank an user profile iconarj und user profile icondigi_c für die Tipps.

Moderiert von user profile iconjasocul: Ergänzungen aus Diskussion hinzugefügt.


Zuletzt bearbeitet von Karlson am Sa 13.11.04 21:29, insgesamt 7-mal bearbeitet