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/)
-   -   Autostart RUN und RUNONCE (https://www.delphipraxis.net/187979-autostart-run-und-runonce.html)

surfer007 20. Jan 2016 20:08

Autostart RUN und RUNONCE
 
Hallo,

ich starte meine Anwendung via Registry RUNONCE und zur Sicherheit nochmal in der RUN Sektion, klappt auch soweit gut. RUNONCE damit meine Anwendung die aller erste Anwendung beim Windows Start ist. Nun habe ich einen Kunden mit Windows10 der meint nach einem Power Off startet die Anwendung (Kiosk) meist nicht. Also irgendwas löscht den RUN und RUNONCE Eintrag. Ja, der RUNONCE wird von meiner Anwendung nach dem Start wieder angelegt, ist also da! User ist Administrator und UAC Anforderung ist als Manifest drin. Bei Tests in einer VM mit Win10 konnte ich nichts feststellen, bei mir funktioniert es immer. Das ist der Code der die Start Einträge anlegt:

Delphi-Quellcode:
   
   
    // HKEY_LOCAL_MACHINE
   
    if TPJOSInfo.IsWow64 then begin
      MyPrg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY);
    end else begin
      MyPrg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_32KEY);
    end;
      MyPrg.Rootkey := HKEY_LOCAL_MACHINE;
      MyPrg.LazyWrite := false;
      try
        try
          if MyPrg.Openkey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', true) then begin
            MyPrg.WriteInteger('DisableLocalUserRunOnce', 0);
          end;
        except
          MyLogAdd('Error writing registry: DisableLocalUserRunOnce', False);
        end;
      finally
        MyPrg.CloseKey;
      end;

      try
        try
          if MyPrg.Openkey('Software\Microsoft\Windows\CurrentVersion\RunOnce', true) then begin
            MyPrg.WriteString('!KioskStart', '"' + sPath + 'kioskstart.exe"');
          end;
        except
          MyLogAdd('Error writing registry: !KioskStart', False);
        end;
      finally
        MyPrg.CloseKey;
      end;

      try
        try
          if MyPrg.Openkey('Software\Microsoft\Windows\CurrentVersion\Run', true) then begin
            MyPrg.WriteString('Kiosk', '"' + sPath + 'kiosk.exe" /bootstart');
          end;
        except
          MyLogAdd('Error writing registry: Kiosk', False);
        end;
      finally
        MyPrg.CloseKey;
      end;
    MyPrg.Free;
Hat jemand einen Tipp warum das auf Win10 nach einem Power Off nicht mehr startet?

Luckie 20. Jan 2016 21:01

AW: Autostart RUN und RUNONCE
 
Wird dein Programm denn korrekt beendet? Hat es den noch die Möglichkeit den Wert in die Registry zu schreiben?

Sir Rufo 20. Jan 2016 21:51

AW: Autostart RUN und RUNONCE
 
RunOnce => Beim nächsten Systemstart einmal starten

und nicht "wird als erstes gestartet".

Für den Kiosk-Mode solltest du die Shell (die wird immer und als erstes gestartet) austauschen (default explorer.exe)

surfer007 20. Jan 2016 22:03

AW: Autostart RUN und RUNONCE
 
Die Registry Einträge werden kurz nach dem Start, und während des Betriebs und auch beim beenden nochmals geschrieben. Da das Programm als Kiosk läuft wird in der Praxis die Maschine aber knallhart via Sicherung raus beendet. Da die Einträge aber mehrmals an verschiedenen Stellen gemacht werden gehe ich davon aus das die Einträge gemacht wurden. Das Problem tritt scheinbar nur nach Power Off auf. Normaler Reboot klappt. Übrigens klappt das so schon seit Jahren auf Systemen < Win10. RUNONCE wird benutzt um der Erste beim Booten zu sein.

Bei dieser Anwendung wird der Desktop benötigt, deshalb Explorer als Shell. Das Programm ist auch bei anderen Installationen im Einsatz und selbst als Shell eingetragen, da dann ohne Windows Desktop.

RUNONCE wird als allererstes gestartet, so können Taskbar und andere Restriktionen sofort gemacht werden. Der RUN Eintrag ist eigentlich nur die Rückversicherung. Komisch das die Anwendung gar nicht gestartet wird, also auch nicht via RUN der eigentlich nur 1x angelegt werden muss.

Luckie 20. Jan 2016 22:13

AW: Autostart RUN und RUNONCE
 
Wie schon bemerkt wurde. RUNONCE bedeute: Führe das Programm einmal automatisch aus. Und nicht: Führe es als erstes aus. Wenn jetzt ein Update dort auch einen Eintrag macht, dann ist nicht mehr sichergestellt, dass dein Programm als erstes Startet. Lösung, wie schon gesagt wurde: Trag dein Programm als Shell ein und ersetze damit so den Explorer als Shell. Dann sparst du dir auch das Rumgefrickel mit den Autorun-Schlüsseln in der Registry.

surfer007 20. Jan 2016 22:28

AW: Autostart RUN und RUNONCE
 
Ok, wenn ein anderes Programm auch RUNONCE benutzt, sollte trotzdem die eigene Anwendung drin stehen und gestartet werden.

Der "Kiosk" braucht aber den Windows Desktop. Oder ich müsste selber einen Desktop integrieren, also die Möglichkeit Icons mit Link zu Programmen anzulegen die der User dann benutzen kann. Viel Arbeit um etwas zu ersetzen das immer funktionierte. Zum Verständnis, mein Kiosk blendet unter anderem die Taskleiste aus, und deaktiviert die rechte Maustaste, macht einige Key Mappings um CTRL+ALT+DEL , Windows Taste usw. umzubiegen. Der User soll keinen Zugriff auf HD und System haben, eben ein Kiosk.

Bleibt immer noch die Frage warum läuft es < Win10 und warum wird im "worst case" Fall der Standard RUN Eintrag nicht ausgeführt.

Ich weiß was RUNONCE bedeutet, in der Praxis ist RUNONCE aber vor RUN und Autostart Ordner dran, also ich kenne keine Möglichkeit (außer Shell replacement) ganz vorne beim Bootvorgang zu sein.

Vielleicht muss ich doch auf Task Scheduler umsteigen, muss ich mal testen ob man da "früh genug" an der Reihe ist.

Luckie 20. Jan 2016 22:41

AW: Autostart RUN und RUNONCE
 
Zitat:

Viel Arbeit um etwas zu ersetzen das immer funktionierte.
Offensichtlich ja nicht immer. :?

Dejan Vu 21. Jan 2016 06:51

AW: Autostart RUN und RUNONCE
 
Wenn ich die Shell durch meine SW ersetze, kann ich dann noch eine TShellView o.ä. verwenden? Und wenn es um Icons geht, die beim Anklicken ein Programm ausführen, ginge das nicht auch mit einem Button oder -noch einfacher- mit einem TImage.OnClick, oder -warte- mit einer TListView im Icon-Modus? "Viel Arbeit" wäre das ja nicht.

Luckie 21. Jan 2016 06:54

AW: Autostart RUN und RUNONCE
 
Zitat:

TListView im Icon-Modus
Der original Desktop ist übrigens nichts anderes. :wink:

Dejan Vu 21. Jan 2016 09:03

AW: Autostart RUN und RUNONCE
 
Ach was. :mrgreen: Darauf wollte ich dezent hinweisen. :stupid:

surfer007 21. Jan 2016 15:31

AW: Autostart RUN und RUNONCE
 
Der Kunde soll seinen Desktop einrichten können wie er will. Wenn es statisch wäre könnte man schnell was zusammen klicken, aber um so etwas dynamisch zu haben sehe ich doch etwas mehr Arbeit. Ok, Eine EXE auswählen und in eine Liste aufnehmen ist keine Sache, das ganze in einer INI speichern auch nicht. Dann muss man aber noch das Programm Icon extrahieren, und es möglich machen die Icons zu verschieben. Wollte eigentlich nicht den Desktop neu erfinden, hat M$ schon gemacht. Ich wollte nur das mein RUNONCE Eintrag ausgeführt wird.

Die Anwendung als Shell zu fahren scheint mir dann auch der richtige Weg zu sein, da kann man sich beruhigt zurück lehnen und weiß das Teil startet garantiert.

Wenn ich die Shell auf z.B. c:\kiosk\kiosk.exe ändere kommt der kiosk, soweit ok. Bei laufendem Kiosk möchte ich nun den Windows Desktop starten, bei starten von c:\windows\explorer.exe kommt aber leider der Windows Explorer mit Arbeitsplatz Ansicht. Nur wenn der Shell Eintrag in der Registry auf explorer.exe steht kommt bei starten (ShellExecute vom Kiosk) von c:\windows\explorer.exe der Desktop. Wie kann ich den Desktop per Kommandozeile starten wenn als Shell was anderes als explorer.exe drin steht (unter HKLM Software\Microsoft\Windows NT\CurrentVersion\Winlogon)? So könnte der Kiosk als Shell starten und später wenn benötigt der normale Windows Desktop gestartet werden.

Man könnte vor Aufruf kurzzeitig den Shell Eintrag auf explorer.exe setzen, dann ShellExecute explorer.exe, und dann wieder den Kiosk als Shell reinschreiben. Eleganter wäre aber ein direkter Aufruf ohne den Shell Eintrag dabei umbiegen zu müssen.

HolgerX 22. Jan 2016 04:22

AW: Autostart RUN und RUNONCE
 
Hmm..

Ich hatte mal ein bischen mit einem Dienst rumgespielt, welcher bei Login eines Users eine Exe startet.
So wie es z.B. Virenscanner machen um eine GUI in die Taskleiste zu parken.

So verbleibt der Explorer als Shell, jedoch wird nach dem Login direkt (durch den Dienst) deine Kiosk-App gestartet.

Getestet hatte ich das bis Win7.

Weiß bloß nicht, wo das abgeblieben ist und es noch wirklich funktioniert....

Dejan Vu 22. Jan 2016 06:35

AW: Autostart RUN und RUNONCE
 
Zitat:

Zitat von surfer007 (Beitrag 1327730)
Dann muss man aber noch das Programm Icon extrahieren, und es möglich machen die Icons zu verschieben. Wollte eigentlich nicht den Desktop neu erfinden, hat M$ schon gemacht.

EBEN. Und deshalb nimmst Du die TListView/TShellListView-Komponente. Icons extrahieren ist auch simpel. Übrigens ist deine Tastatur kaputt. Da kommt statt eines 'S' ein '$', komischerweise auch nicht immer. :roll:

Sir Rufo 22. Jan 2016 07:47

AW: Autostart RUN und RUNONCE
 
Also das erste was gestartet wird sind die Programme, die unter dem Schlüssel
Code:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\Userinit
eingetragen sind. Per Default ist das
Code:
C:\Windows\system32\userinit.exe,
Diese userinit.exe macht so ein paar Dinge (logonscripts, ...) und schaut in der Registry was bei dem Eintrag
Code:
HKCU\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Shell
steht bzw. wenn da nichts eingetragen ist was bei dem Eintrag
Code:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\Shell
steht und startet diese Anwendung.

Was wohl passieren würde, wenn man in der Registry eine eigene Anwendung als Userinit einträgt?
Code:
<WoAuchImmer>\kiosk_userinit.exe,
Und die wiederum prüft, was für ein Anwender da gerade am Werke ist.
  • Ist es ein reiner Kiosk-Mode-Anwender, dann bearbeitet man den Shell-Eintrag für diesen Anwender (Kiosk-Anwendung dort rein) und startet die originale userinit.exe
  • Ist es ein Kiosk-Mode-Anwender, der den Desktop benötigt, dann lösche ich den Shell-Eintrag für diesen Anwender, starte die Kiosk-Anwendung und dann die originale userinit.exe
  • Ist es kein Kiosk-Mode-Anwender (Administratoren, etc.) dann startet man einfach nur die originale userinit.exe

p80286 22. Jan 2016 11:00

AW: Autostart RUN und RUNONCE
 
Manchmal bin ich einfach nur baff wenn ich mitbekomme was ich so alles nicht weiß:stupid:

Gruß
K-H

surfer007 22. Jan 2016 16:12

AW: Autostart RUN und RUNONCE
 
Ich starte nun den Kiosk als Shell. Wenn später dann doch der Desktop benötigt wird möchte ich diesen einfach starten, also explorer.exe ausführen. Jedoch kommt manchmal die Arbeitsplatz Ansicht "Dieser PC", und manchmal wie gewünscht der Desktop. Der Trick mit Shell Eintrag muss auf explorer.exe stehen damit der Desktop kommt klappt leider nicht immer. Weiß jemand mit welchen Parametern man die explorer.exe starten muss (bei Verwendung einer eigenen Shell), damit ganz sicher der Desktop startet?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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