Shell-Startprogramm

Sie können das Shell-Startfeld verwenden, um die Standardmäßige Windows 10-Shell durch eine benutzerdefinierte Shell zu ersetzen. Sie können fast jede Anwendung oder ausführbare Datei als benutzerdefinierte Shell verwenden, z. B. ein Befehlsfenster oder eine benutzerdefinierte dedizierte Anwendung.

Sie können das Shell-Startfeld auch so konfigurieren, dass unterschiedliche Shellanwendungen für verschiedene Benutzer oder Benutzergruppen gestartet werden.

Es gibt einige Ausnahmen für die Anwendungen und ausführbaren Dateien, die Sie als benutzerdefinierte Shell verwenden können:

  • Sie können die folgende ausführbare Datei nicht als benutzerdefinierte Shell verwenden: C:\\Windows\\System32\\Eshell.exe Die Verwendung von Eshell.exe als Standardshell führt zu einem leeren Bildschirm, nachdem sich der Benutzer angemeldet hat.
  • Sie können keine universelle Windows-App als benutzerdefinierte Shell verwenden.
  • Sie können keine benutzerdefinierte Shell verwenden, um universelle Windows-Apps zu starten, z. B. die Einstellungen-App.
  • Sie können keine Anwendung verwenden, die einen anderen Prozess startet und als benutzerdefinierte Shell beendet wird. Sie können beispielsweise write.exe im Shell-Startfeld nicht angeben. Das Shell-Startfeld startet eine benutzerdefinierte Shell und überwacht den Prozess, um zu identifizieren, wann die benutzerdefinierte Shell beendet wird. Write.exe erstellt einen 32-Bit-wordpad.exe prozess und beendet. Da das Shell-Startfeld nicht über den neu erstellten wordpad.exe Prozess informiert ist, wird das Shell-Startfeld basierend auf dem Exitcode von Write.exeaktionen und die benutzerdefinierte Shell neu starten.
  • Sie können das System nicht verhindern, dass das System heruntergefahren wird. Bei Shell Launcher V1 und V2 können Sie die Sitzung nicht blockieren, indem Sie FALSE zurückgeben, nachdem Sie die WM_QUERYENDSESSION Nachricht in einer grafischen Anwendung empfangen oder FALSE in der Handlerroutine zurückgeben, die über die Funktion "SetConsoleCtrlHandler " in einer Konsolenanwendung hinzugefügt wird.

Hinweis

Sie können sowohl das Shell-Startfeld als auch den zugewiesenen Zugriff auf das gleiche System nicht konfigurieren.

Verwenden Sie shell Launcher V2, sie können eine universelle Windows-App als benutzerdefinierte Shell angeben. Überprüfen Sie das Shell-Startfeld, um einen Windows 10-Kiosk für die Unterschiede zwischen Shell Launcher v1 und Shell Launcher V2 zu erstellen.

Shell-Startfeld verarbeitet die Run- und RunOnce-Registrierungsschlüssel vor dem Starten der benutzerdefinierten Shell, sodass Ihre benutzerdefinierte Shell nicht den automatischen Start anderer Anwendungen und Dienste behandeln muss.

Shell-Startfeld behandelt auch das Verhalten des Systems, wenn Ihre benutzerdefinierte Shell beendet wird. Sie können das Shell-Exitverhalten konfigurieren, wenn das Standardverhalten ihre Anforderungen nicht erfüllt.

Anforderungen

Windows 10 Enterprise oder Windows 10 Education.

Begriff

  • Aktivieren Sie Folgendes: Um die Einstellung auf das Gerät verfügbar zu machen und optional die Einstellungen auf das Gerät anzuwenden.
  • Konfigurieren: So passen Sie die Einstellung oder Untereinstellungen an.
  • Eingebettetes Shell-Startfeld: Dieses Feature wird als Embedded Shell Launcher in Windows 10, Version 1511 bezeichnet.
  • Benutzerdefinierte Shell-Startfeld: Dieses Feature wird als Shell-Startprogramm in Windows 10, Version 1607 und höher bezeichnet.

Aktivieren des Shell-Startfelds

Das Shell-Startfeld ist eine optionale Komponente und ist in Windows 10 standardmäßig nicht aktiviert. Es muss vor der Konfiguration aktiviert werden. Sie können das Shell-Startfeld in einem angepassten Windows 10-Image (WIM) aktivieren und konfigurieren, wenn Microsoft Windows nicht installiert wurde. Wenn Windows bereits installiert wurde und Sie ein Bereitstellungspaket zum Konfigurieren des Shell-Startfelds anwenden, müssen Sie zuerst das Shell-Startfeld aktivieren, damit ein Bereitstellungspaket erfolgreich angewendet werden kann.

Aktivieren des Shell-Startfelds mithilfe der Systemsteuerung

  1. Geben Sie im Web- und Windows-Feld"Programme und Features " die EINGABETASTE ein, oder tippen Sie auf "Programme und Features ", um sie zu öffnen.
  2. Klicken Sie im Fenster "Programme und Features " auf "Windows-Features aktivieren" oder deaktivieren.
  3. Erweitern Sie im Fenster "Windows-Features " den Knoten " Gerätesperre ", wählen oder deaktivieren Sie das Kontrollkästchen für das Shell-Startfeld, und klicken Sie dann auf "OK".
  4. Das Fenster "Windows-Features " gibt an, dass Windows nach erforderlichen Dateien sucht und eine Statusleiste anzeigt. Nachdem das Fenster gefunden wurde, gibt das Fenster an, dass Windows die Änderungen anwendet. Beim Abschluss gibt das Fenster an, dass die angeforderten Änderungen abgeschlossen sind.
  5. Klicken Sie auf " Schließen ", um das Fenster "Windows-Features " zu schließen.

Hinweis

Das Aktivieren des Shell-Startfelds erfordert keinen Gerätestart.

Aktivieren des Shell-Startfelds durch Aufrufen von WESL_UserSetting

  1. Aktivieren oder Deaktivieren des Shell-Startfelds durch Aufrufen der WESL_UserSetting.SetEnabled-Funktion in der Windows Management Instrumentation (WMI)-Klasse WESL_UserSetting.
  2. Wenn Sie das Shell-Startfeld mithilfe von WESL_UserSetting aktivieren oder deaktivieren, wirken sich die Änderungen nicht auf Sitzungen aus, die derzeit angemeldet sind; Sie müssen sich abmelden und sich wieder anmelden.

In diesem Beispiel wird ein Windows-Image namens install.wim verwendet, sie können jedoch das gleiche Verfahren verwenden, um ein Bereitstellungspaket anzuwenden (weitere Informationen zu DISM finden Sie unter "Was ist Bereitstellungsimagewartung und -verwaltung".

Aktivieren des Shell-Startfelds mithilfe von DISM

  1. Öffnen Sie eine Eingabeaufforderung mit Administratorrechten.

  2. Kopieren Sie install.wim in einen temporären Ordner auf festplatte (in den folgenden Schritten wird davon ausgegangen, dass es C:\wim ist).

  3. Erstellen Sie ein neues Verzeichnis.

    md c:\wim
    
  4. Stellen Sie das Bild fest.

    dism /mount-wim /wimfile:c:\bootmedia\sources\install.wim /index:1 /MountDir:c:\wim
    
  5. Aktivieren Sie das Feature.

    dism /image:c:\wim /enable-feature /all /featureName:Client-EmbeddedShellLauncher
    
  6. Führen Sie für die Änderung einen Commit aus.

    dism /unmount-wim /MountDir:c:\wim /Commit
    

Aktivieren des Shell-Startfelds mithilfe des Windows-Konfigurations-Designers

Die Shell-Starteinstellungen sind auch als Windows-Bereitstellungseinstellungen verfügbar, sodass Sie diese Einstellungen konfigurieren können, die während der Bildlaufzeit angewendet werden sollen. Sie können eine oder alle Shell-Starteinstellungen festlegen, indem Sie ein Bereitstellungspaket mithilfe des Windows-Konfigurations-Designers erstellen und dann das Bereitstellungspaket während der Bildbereitstellungszeit oder -laufzeit anwenden. Wenn Windows nicht installiert wurde und Sie Windows Configuration Designer verwenden, um Installationsmedien mit Einstellungen für das Shell-Startfeld zu erstellen, das im Image enthalten ist oder Sie ein Bereitstellungspaket während des Setups anwenden, müssen Sie das Shell-Startprogramm auf dem Installationsmedium mit DISM aktivieren, damit ein Bereitstellungspaket erfolgreich angewendet werden kann.

Verwenden Sie die folgenden Schritte, um ein Bereitstellungspaket zu erstellen, das die ShellLauncher-Einstellungen enthält.

  1. Erstellen Sie ein Bereitstellungspaket im Windows-Konfigurations-Designer, indem Sie die Anweisungen in " Erstellen eines Bereitstellungspakets für Windows 10" ausführen.
  2. Wählen Sie auf der Seite "Verfügbare Anpassungen " die Laufzeiteinstellungen>SMISettings>ShellLauncher aus.
  3. Legen Sie den Wert " Enable to ENABLE" fest. Zusätzliche Optionen zum Konfigurieren des Shell-Startfelds werden angezeigt, und Sie können die Werte wie gewünscht festlegen.
  4. Nachdem Sie die Einstellungen und das Erstellen des Bereitstellungspakets abgeschlossen haben, können Sie das Paket auf die Bildbereitstellungszeit oder -laufzeit anwenden. Weitere Informationen finden Sie unter "Anwenden eines Bereitstellungspakets ". Beachten Sie, dass der Prozess zum Anwenden des Pakets auf ein Windows 10 Enterprise-Image identisch ist.

Konfigurieren des Shell-Startprogramms

Es gibt zwei Möglichkeiten zum Konfigurieren des Shell-Startfelds:

  1. In Windows 10, Version 1803, können Sie das Shell-Startfeld mithilfe des ShellLauncher-Knotens des Dienstanbieters für zugewiesenen Zugriff (CSP) konfigurieren. Weitere Informationen finden Sie unter "AssignedAccess CSP ". Beim Konfigurieren des Shell-Startfelds mithilfe dieser Methode wird das Shell-Startfeld auf dem Gerät automatisch aktiviert, wenn das Gerät es unterstützt.
  2. Verwenden Sie die Shell-Startprogramm-WMI-Anbieter direkt in einem PowerShell-Skript oder einer Anwendung.

Sie können die folgenden Optionen für das Shell-Startfeld konfigurieren:

  • Aktivieren oder Deaktivieren des Shell-Startfelds.
  • Geben Sie eine Shellkonfiguration für einen bestimmten Benutzer oder eine bestimmte Gruppe an.
  • Entfernen Sie eine Shellkonfiguration für einen bestimmten Benutzer oder eine bestimmte Gruppe.
  • Ändern Sie die Standardshellkonfiguration.
  • Erhalten Sie Informationen zu einer Shellkonfiguration für einen bestimmten Benutzer oder eine bestimmte Gruppe.

Alle Änderungen werden erst wirksam, wenn sich ein Benutzer anmeldet.

Starten von verschiedenen Shells für verschiedene Benutzerkonten

Standardmäßig wird das Shell-Startfeld mit der Standardshell ausgeführt, die beim Erstellen des Betriebssystemimages zur Entwurfszeit angegeben wird. Die Standardshell ist auf Cmd.exe festgelegt, sie können jedoch jede ausführbare Datei angeben, die die Standardshell sein soll.

Sie können das Shell-Startfeld konfigurieren, um eine andere Shell für bestimmte Benutzer oder Gruppen zu starten, wenn Sie die Standardshell nicht ausführen möchten. Sie können beispielsweise ein Gerät so konfigurieren, dass eine benutzerdefinierte Anwendungsshell für Gastkonten ausgeführt wird, aber die Standard-Windows Explorer-Shell für Administratorkonten ausführen, um das Gerät zu verwenden.

Wenn Sie die WMI-Anbieter zum Konfigurieren des Shell-Startfelds für einen Benutzer oder eine Gruppe zur Laufzeit verwenden, müssen Sie den Sicherheitsbezeichner (SID) für diesen Benutzer oder diese Gruppe verwenden; Sie können den Benutzernamen oder den Gruppennamen nicht verwenden.

Weitere Informationen zu allgemeinen Sicherheitsbezeichnern finden Sie unter bekannte SIDs.

Wenn das aktuelle angemeldete Konto zu zwei oder mehreren Gruppen gehört, die verschiedene Konfigurationen für jede Gruppe definiert haben, verwendet Shell-Startfeld die erste Konfiguration, die sie findet. Die Suchreihenfolge ist nicht definiert, sodass Sie vermeiden, einem Benutzer mehrere Gruppen mit unterschiedlichen Shell-Startprogrammkonfigurationen zuzuweisen.

Ausführen einer Aktion, wenn die Shell beendet wird

Wenn eine benutzerdefinierte Shell beendet wird, kann das Shell-Startprogramm eine von vier Aktionen ausführen:

Aktion BESCHREIBUNG
0 Starten Sie die Shell neu.
1 Starten Sie das Gerät neu.
2 Fahren Sie das Gerät herunter.
3 Sie unternehmen nichts.

Wichtig

Stellen Sie sicher, dass Ihre Shellanwendung nicht automatisch beendet wird und nicht automatisch von allen Features wie Dialogfilter geschlossen wird, da dies zu einem unendlichen Zyklus des Beendens und Neustarts führen kann, es sei denn, die Rückgabecodeaktion ist auf nichts festgelegt.

Standard-Rückgabecodeaktion

Sie können eine Standard-Rückgabecodeaktion für das Shell-Startfeld mit der Einstellung "DefaultReturnCodeAction" definieren. Wenn Sie den Anfangswert nicht ändern, wird die Standard-Rückgabecodeaktion auf 0 (Null) festgelegt, was angibt, dass das Shell-Startfeld die Shell neu startet, wenn die Shell beendet wird.

Zuordnen des Exitcodes zu einer Shell-Startprogrammaktion

Shell-Startfeld kann eine bestimmte Aktion basierend auf dem von der Shell zurückgegebenen Exitcode ausführen. Für jeden vom Shell zurückgegebenen Exitcode können Sie die Aktion konfigurieren, die das Shell-Startfeld ausführt, indem Sie den Beendencode zu einer der Shell-Exitaktionen zuordnen.

Wenn der Exitcode nicht mit einem definierten Wert übereinstimmt, führt Shell-Startfeld die Standard-Rückgabecodeaktion aus.

Ihre Shell kann beispielsweise Die Endcodewerte von -1, 0, 1 oder 255 zurückgeben, je nachdem, wie die Shell beendet wird. Sie können das Shell-Startfeld so konfigurieren, dass:

  • Starten Sie das Gerät (1) neu, wenn die Shell einen Beendencode des Werts -1 zurückgibt.
  • Starten Sie die Shell (0) neu, wenn die Shell einen Exitcode von Wert 0 zurückgibt.
  • Nichts tun (3), wenn die Shell einen Beendencode von Wert 1 zurückgibt
  • herunterfahren des Geräts (2), wenn die Shell einen Exitcode von Wert 255 zurückgibt

Ihre benutzerdefinierte Rückgabecodeaktionszuordnung würde wie folgt aussehen:

Exitcode Aktion
-1 1 (Starten Sie das Gerät neu)
0 0 (starten Sie die Shell neu)
1 3 (nichts tun)
255 2 (Herunterfahren des Geräts)

Festlegen der benutzerdefinierten Shell

Ändern Sie das folgende PowerShell-Skript entsprechend, und führen Sie das Skript auf dem Gerät aus.

# Check if shell launcher license is enabled
function Check-ShellLauncherLicenseEnabled
{
    [string]$source = @"
using System;
using System.Runtime.InteropServices;

static class CheckShellLauncherLicense
{
    const int S_OK = 0;

    public static bool IsShellLauncherLicenseEnabled()
    {
        int enabled = 0;

        if (NativeMethods.SLGetWindowsInformationDWORD("EmbeddedFeature-ShellLauncher-Enabled", out enabled) != S_OK) {
            enabled = 0;
        }
        return (enabled != 0);
    }

    static class NativeMethods
    {
        [DllImport("Slc.dll")]
        internal static extern int SLGetWindowsInformationDWORD([MarshalAs(UnmanagedType.LPWStr)]string valueName, out int value);
    }

}
"@

    $type = Add-Type -TypeDefinition $source -PassThru

    return $type[0]::IsShellLauncherLicenseEnabled()
}

[bool]$result = $false

$result = Check-ShellLauncherLicenseEnabled
"`nShell Launcher license enabled is set to " + $result
if (-not($result))
{
    "`nThis device doesn't have required license to use Shell Launcher"
    exit
}

$COMPUTER = "localhost"
$NAMESPACE = "root\standardcimv2\embedded"

# Create a handle to the class instance so we can call the static methods.
try {
    $ShellLauncherClass = [wmiclass]"\\$COMPUTER\${NAMESPACE}:WESL_UserSetting"
    } catch [Exception] {
    write-host $_.Exception.Message; 
    write-host "Make sure Shell Launcher feature is enabled"
    exit
    }


# This well-known security identifier (SID) corresponds to the BUILTIN\Administrators group.

$Admins_SID = "S-1-5-32-544"

# Create a function to retrieve the SID for a user account on a machine.

function Get-UsernameSID($AccountName) {

    $NTUserObject = New-Object System.Security.Principal.NTAccount($AccountName)
    $NTUserSID = $NTUserObject.Translate([System.Security.Principal.SecurityIdentifier])

    return $NTUserSID.Value
}

# Get the SID for a user account named "Cashier". Rename "Cashier" to an existing account on your system to test this script.

$Cashier_SID = Get-UsernameSID("Cashier")

# Define actions to take when the shell program exits.

$restart_shell = 0
$restart_device = 1
$shutdown_device = 2
$do_nothing = 3

# Examples. You can change these examples to use the program that you want to use as the shell.

# This example sets the command prompt as the default shell, and restarts the device if the command prompt is closed. 

$ShellLauncherClass.SetDefaultShell("cmd.exe", $restart_device)

# Display the default shell to verify that it was added correctly.

$DefaultShellObject = $ShellLauncherClass.GetDefaultShell()

"`nDefault Shell is set to " + $DefaultShellObject.Shell + " and the default action is set to " + $DefaultShellObject.defaultaction

# Set Internet Explorer as the shell for "Cashier", and restart the machine if Internet Explorer is closed.

$ShellLauncherClass.SetCustomShell($Cashier_SID, "c:\program files\internet explorer\iexplore.exe www.microsoft.com", ($null), ($null), $restart_shell)

# Set Explorer as the shell for administrators.

$ShellLauncherClass.SetCustomShell($Admins_SID, "explorer.exe")

# View all the custom shells defined.

"`nCurrent settings for custom shells:"
Get-WmiObject -namespace $NAMESPACE -computer $COMPUTER -class WESL_UserSetting | Select Sid, Shell, DefaultAction

# Enable Shell Launcher

$ShellLauncherClass.SetEnabled($TRUE)

$IsShellLauncherEnabled = $ShellLauncherClass.IsEnabled()

"`nEnabled is set to " + $IsShellLauncherEnabled.Enabled

# Remove the new custom shells.

$ShellLauncherClass.RemoveCustomShell($Admins_SID)

$ShellLauncherClass.RemoveCustomShell($Cashier_SID)

# Disable Shell Launcher

$ShellLauncherClass.SetEnabled($FALSE)

$IsShellLauncherEnabled = $ShellLauncherClass.IsEnabled()

"`nEnabled is set to " + $IsShellLauncherEnabled.Enabled

Hinweis

Das obige Skript enthält Beispiele für mehrere Konfigurationsoptionen, einschließlich des Entfernens einer benutzerdefinierten Shell und dem Deaktivieren des Shell-Startfelds. Es soll nicht wie folgt ausgeführt werden.

Shell-Startfeldbenutzerrechte

Eine benutzerdefinierte Shell wird mit derselben Benutzerrechteebene wie das Konto gestartet, das angemeldet ist. Dies bedeutet, dass ein Benutzer mit Administratorrechten jede Systemaktion ausführen kann, die Administratorrechte erfordert, einschließlich des Startens anderer Anwendungen mit Administratorrechten, während ein Benutzer ohne Administratorrechte nicht möglich ist.

Warnung

Wenn Ihre Shellanwendung Administratorrechte erfordert und erhöht werden muss, und die Benutzerkontosteuerung (UAC) auf Ihrem Gerät vorhanden ist, müssen Sie UAC deaktivieren, um das Shell-Startfeld zu starten.

Nicht markierter Start

Benutzerdefinierte Anmeldung