Win 7 embedded - beim Bootvorgang alle Desktopsymbole und Taskleiste verstecken

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Nitro-X.

    Win 7 embedded - beim Bootvorgang alle Desktopsymbole und Taskleiste verstecken

    Hallo zusammen,

    ich bastel gerade an einer HMI und habe folgendes Problem:

    Die HMI läuft immer im Fullscreenmodus und kann nur mit speziellen Rechten minimiert oder beendet werden. Ich möchte nicht, dass der Standard-User irgendwelche Einstellungen im Windows verändert - er darf nur die HMI bedienen, sonst nichts. Soweit funktioniert auch alles, die HMI wird automatisiert beim Hochfahren des Rechners gestartet.

    Problem dabei ist, dass während des Bootvorgangs der Desktop mitsamt aller Icons und die Taskleiste angezeigt werden. Ein böswilliger Benutzer kann die Zeit nutzen, um z.B. die Systemsteuerung zu öffnen.
    Wenn du Anwendung durch einen autorisierten Benutzer minimiert oder beendet wird, müssen der Desktop und die Taskleiste natürlich wieder eingeblendet werden, sonst hat er ja nur "nen schworzen Bildschirm" (und 200 Puls)

    Kennt jemand eine Lösung mit Windows-Boardmitteln oder mit irgendeiner Freeware?

    Danke vorab!
    Nitro-X hat recht. Dennoch wenn du auf den Schlüssen zugreifst, könnte es sein das dein Antiviren Programm Arlam schlägt.

    Hier schon mal der erste Pfad zum Schlüssel "Shell"

    Quellcode

    1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    Virenscanner ist kein Problem - es ist keiner vorhanden, da der PC in einer abgeschotteten Umgebung läuft.

    Die Sache scheint zu klappen, jedoch hab ich das Problem, dass wenn ich aus meiner Anwendung beim Beenden oder Minimieren mit

    VB.NET-Quellcode

    1. Process.Start("explorer.exe")


    ausführe, nur ein Explorer-Fenster geöffnet wird, alle Desktopsymbole und die Taskleiste sind weiterhin nicht sichtbar
    Was hast du denn jetzt vorgenommen, bzw. wie versteckst du den Desktop?

    So funktionierts bei mir:

    VB.NET-Quellcode

    1. Process.Start(Environment.SystemDirectory & "\..\explorer.exe")

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OMA“ ()

    Danke OMA, aber hat nicht geholfen.

    Hab wie oben von Nitro-X vorgeschlagen, in der Registry den Schlüssel zur Shell (Post #4) auf meine Exe geändert - das hat zur Folge, dass beim Booten zuerst meine Anwendung gestartet wird, ohne die explorer.exe zu starten.
    Alles toll, wie gewünscht, aber beim Verlassen der Anwendung wird nur ein Explorerfenster gestartet, ohne den Desktop und die Taskleiste zu aktivieren.

    Mit deinem Code passiert genau das gleiche.
    Das sind doch alles nur dahingepfuschte Lösungen.
    Sieh dir mal CreateDesktop und SwitchDesktop an. Das ist alles, was du jemals brauchen wirst. Deine Anwendung schreibst du dann noch als AutoStart rein und du hast gewonnen. Damit kannst du auch ganz einfach wieder zum normalen Desktop wechseln, sollte der Admin ein Passwort o.Ä. eingegeben haben.

    Eine Beispielimplementierung gibt es hier.
    Die Lösung greift aber doch erst, NACHDEM die Anwendung gestartet wurde und in der Zwischenzeit sind nett alle Desktopsysmbole zu sehen und natürlich auch zu bedienen - wie gesagt, ein bösartiger Benutzer kann die kurze Zeit nutzen, um rumzupfuschen. Wenn ich meine exe als shell eintrage, geht es ja soweit, ich versteh nur nicht ganz recht, wieso beim späteren Start der explorer.exe dann nicht auch der normale Desktop und die Taskleiste aktiviert werden... Das ist das einzige Problem.

    speario schrieb:

    NACHDEM die Anwendung gestartet wurde und in der Zwischenzeit

    Ja und? Wo ist das Problem? Die Zeit, die der Nutzer hat, ist verschwindend gering. Allein um in die Systemsteuerung zu kommen, brauchts n halbes Jahrhundert (im Vergleich zum Programmstart).
    Wenn du deine Anwendung so starten lässt, dass sie sofort einen virtuellen Desktop erzeugt, dann hat niemand die Chance überhaupt etwas zu machen - ich würde sogar wetten, dass es nichtmal für ein "shutdown -s -t 0 -f" reicht.
    Und selbst wenn der Nutzer "Win+E" drückt und den Explorer öffnen kann - spätestens mit dem virtuellen Desktop ist damit ebenfalls nichts mehr möglich, da das Explorer-Fenster auf dem "originalen" Desktop rumliegt und so niemanden stört. Du glaubst doch nicht ernsthaft, dass ein Nutzer innerhalb der Startzeit der Anwendung was machen kann. Zudem: kompilier die Datei mit "NGen" und du hast eine Datei, die praktisch sofort gestartet werden kann, da wichtige Elemente des JIT-Compilers bereits abgespeichert wurden.
    Mach dir also darum mal keine Sorgen.
    Meine erste Idee war ja auch einfach, meine Exe im Autostart zu starten und fertig.

    Die Zeit zum Start der Anwendung war definitiv zu lange - das dauert schon ein paar Sekunden (geschätzt irgendwas zwischen 5 und 10 sek) - Windows zeigt ja den Desktop schon an, während es noch selbst am Booten ist...
    Und wenn die Taskleiste einmal im Vordergrund ist, bleibt sie auch dann noch im Vordergrund, wenn meine Anwendung läuft. Dann kann der "böse" Anwender unten rechts auf "Desktop anzeigen" klicken und voila - voller Zugriff...

    Der Anwender hat zum Glück keine Tastatur, sonst könnte er ja auch problemlos jederzeit mit dem "Affengriff" den Taskmanager starten und/oder Win+E drücken, mit nem Touch wird das schwierig...
    Natürlich könnte er an den PC jederzeit eine USB-Tastatur stecken - soooo sicher muss es auch nicht sein, ist kein Bankautomat, sondern "nur" eine Maschinensteuerung.

    Gibts evtl. die Möglichkeit, die Reihenfolge zu beeinflussen, in der die Anwendungen gestartet werden oder einen Delay einzustellen, so dass ich die explorer.exe als shell erst dann starte, wenn meine Anwendung schon im Vordergrund läuft?
    Wenn der Desktop im Hintergrund aufgebaut wird, ist das kein Problem, nur ein autorisierter Benutzer hat das Recht, die Anwendung zu beenden bzw. zu minimieren.
    Falls mal jemand drüber stolpert...

    Habs hingewurschtelt - funktioniert hervorrangend.

    Defaulmäßig ist "meine.exe" als Shell in der Registry, also

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - Schlüssel "Shell" value "meine.exe"

    Das hat zur Folge, dass beim Booten des OS keine Desktopsymbole und keine Taskleiste sichtbar sind, da die "explorer.exe" erst gar nicht gestartet wird. Stattdessen wird "meine.exe" gestartet.
    Loggt sich ein autorisierter Benutzer ein, kann er "meine.exe" minimieren oder beenden. Er braucht Zugriff auf den Desktop, um Systemeinstellungen ändern zu können. Einfach die "explorer.exe" zu starten reicht nicht aus, es wird dann nur ein Explorer-Fenster gestartet, Desktop und Taskleiste bleiben verschwunden. Lösung : Schlüssel in der Registry ändern und die "userinit.exe" ausführen - siehe da, alles sichtbar. Loggt sich dieser autorisierte User wieder aus, muss natürlich der Wert in der Registry zurückgeändert werden.

    Bein Einloggen :

    VB.NET-Quellcode

    1. Dim RegBase As RegistryKey
    2. Dim myKey As RegistryKey
    3. RegBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    4. myKey = RegBase.CreateSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon")
    5. myKey.SetValue("Shell", "explorer.exe")
    6. Process.Start("userinit.exe")


    Zurückschreiben beim Ausloggen

    VB.NET-Quellcode

    1. Dim RegBase As RegistryKey
    2. Dim myKey As RegistryKey
    3. RegBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    4. myKey = RegBase.CreateSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon")
    5. myKey.SetValue("Shell", "meine.exe")


    Und jetzt schlagt mich für diese Lösung.

    Einen kleinen Haken hat die Sache noch. Wenn der autorisierte Benutzer meine.exe beendet und den PC herunterfährt, ändert ja nichts und niemand mehr den Value zurück auf "meine.exe" - beim nächsten Neustart wär das Problem also 1x vorhanden.

    Gibts ne Möglichkeit, beim Herunterfahren irgendeine Batch oder Exe auszuführen - so ne Art Abmelde- bzw. Shutdownskript?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „speario“ ()

    @ThePlexian hat Recht. Setz doch den Key einfach nachdem die Form geschlossen wurde. Da ist die explorer.exe doch schon aktiv, somit macht der Key nichts aus und ist wieder "normal", schon bevor der Rechner heruntergefahren wurde oder der autorisierte Nutzer sich ausloggt.

    Ansonsten konnte man auch irgendwie feststellen ob der Computer heruntergefahren wird.
    msdn.microsoft.com/en-us/libra…op/aa376890(v=vs.85).aspx
    msdn.microsoft.com/en-us/libra…lang=1&cs-lang=vb#code-sn
    Vor Herunterfahren des Computers Dinge erledigen
    M.f.G. Nitro-X
    Gute Spieler cheaten schlecht! 8-)

    Button1.Visible = False
    If Button1.Click then Shell ("C:\brain.exe")
    end if

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nitro-X“ ()