Utiliser le lanceur d'interpréteur de commandes pour créer un kiosque client Windows

S'applique à

  • Windows 10 Ent, Edu
  • Windows 11

À l’aide du lanceur d’interpréteur de commandes, vous pouvez configurer un appareil qui exécute une application en tant qu’interface utilisateur, en remplaçant l’interpréteur de commandes par défaut (explorer.exe). Dans Le lanceur d’interpréteur de commandes v1, disponible dans le client Windows, vous pouvez uniquement spécifier une application de bureau Windows comme interpréteur de commandes de remplacement. Dans Shell Launcher v2, disponible dans Windows 10 version 1809+ / Windows 11, vous pouvez également spécifier une application UWP comme interpréteur de commandes de remplacement. Pour utiliser Shell Launcher v2 dans Windows 10 version 1809, vous devez installer la mise à jour KB4551853.

Remarque

Le lanceur d’interpréteur de commandes contrôle l’application que l’utilisateur voit comme l’interpréteur de commandes après la connexion. Cela n’empêche pas l’utilisateur d’accéder à d’autres applications de bureau et composants système.

Des méthodes de contrôle de l’accès à d’autres applications de bureau et composants système peuvent être utilisées en plus de l’utilisation du lanceur d’interpréteur de commandes. Ces méthodes incluent, sans s’y limiter , les suivantes :

Vous pouvez appliquer un interpréteur de commandes personnalisé via le lanceur d’interpréteur de commandes à l’aide de PowerShell. À compter de Windows 10 version 1803+, vous pouvez également utiliser la gestion des appareils mobiles (GPM) pour appliquer un interpréteur de commandes personnalisé via le lanceur d’interpréteur de commandes.

Différences entre le lanceur d’interpréteur de commandes v1 et le lanceur d’interpréteur de commandes v2

Shell Launcher v1 remplace , l’interpréteur de commandes explorer.exepar défaut, avec eshell.exe lequel peut lancer une application de bureau Windows.

Le lanceur d’interpréteur de commandes v2 remplace explorer.execustomshellhost.exepar . Ce nouveau fichier exécutable peut lancer une application de bureau Windows ou une application UWP.

En plus de vous permettre d’utiliser une application UWP pour votre interpréteur de commandes de remplacement, shell Launcher v2 offre des améliorations supplémentaires :

  • Vous pouvez utiliser une application de bureau Windows personnalisée qui peut ensuite lancer des applications UWP, telles que Paramètres et Clavier tactile.
  • À partir d’un interpréteur de commandes UWP personnalisé, vous pouvez lancer des vues secondaires et exécuter sur plusieurs moniteurs.
  • L’application shell personnalisée s’exécute en plein écran et peut exécuter d’autres applications en plein écran à la demande de l’utilisateur.

Pour obtenir des exemples de configurations XML pour les différentes combinaisons d’applications, consultez Exemples pour shell Launcher v2.

Conditions préalables

Warning

  • Windows 10 ne prend pas en charge la définition d’un interpréteur de commandes personnalisé avant la phase OOBE. Si vous le faites, vous ne serez pas en mesure de déployer l’image obtenue.

  • Le Lanceur Shell ne prend pas en charge une shell personnalisée avec une application qui se lance avec un processus différent et se ferme. Par exemple, vous ne pouvez pas spécifier write.exe dans le Lanceur Shell. Le Lanceur Shell lance une shell personnalisée et supervise le processus d'identification lorsque la shell personnalisée se ferme. Write.exe crée un processus 32 bits wordpad.exe et se ferme. Puisque le Lanceur Shell n'est pas informé du nouveau processus wordpad.exe créé, il agira selon le code de fermeture de Write.exe, par exemple le redémarrage de la shell personnalisée.

  • Un domaine, Azure Active Directory ou un compte d’utilisateur local.

  • Application Windows installée pour ce compte. Il peut s’agir de l’application de votre entreprise ou d’une application courante comme Internet Explorer.

Consultez les informations techniques de référence correspondant au composant Lanceur d’interpréteur de commandes.

Activer la fonctionnalité lanceur d’interpréteur de commandes

Pour définir un interpréteur de commandes personnalisé, vous devez d’abord activer la fonctionnalité Lanceur d’interpréteur de commandes, puis définir votre interpréteur de commandes personnalisé comme interpréteur de commandes personnalisé par défaut à l’aide de PowerShell ou mdm.

Pour activer le lanceur d’interpréteur de commandes dans les fonctionnalités Windows

  1. Accédez à Panneau de configuration >Programmes et fonctionnalités>Activer ou désactiver les fonctionnalités Windows.

  2. Développez Verrouillage de l’appareil.

  3. Sélectionnez Lanceur d’interpréteur de commande et OK.

Vous pouvez également activer le lanceur d’interpréteur de commandes à l’aide du Concepteur de configuration Windows dans un package d’approvisionnement, à l’aide SMISettings > ShellLauncherde , ou vous pouvez utiliser l’outil maintenance et gestion des images de déploiement (DISM.exe).

Pour activer le lanceur d’interpréteur de commandes à l’aide de l’outil DISM

  1. Ouvrez une invite de commandes en tant qu’administrateur.

  2. Entrez la commande suivante.

    Dism /online /Enable-Feature /all /FeatureName:Client-EmbeddedShellLauncher
    

Configurer un interpréteur de commandes personnalisé dans GPM

Vous pouvez utiliser XML et un paramètre OMA-URI personnalisé pour configurer le lanceur d’interpréteur de commandes dans GPM.

Xml pour la configuration du lanceur d’interpréteur de commandes

L’exemple XML suivant fonctionne pour le lanceur d’interpréteur de commandes v1 :

<?xml version="1.0" encoding="utf-8"?> 
<ShellLauncherConfiguration xmlns="http://schemas.microsoft.com/ShellLauncher/2018/Configuration"> 
  <Profiles> 
    <Profile ID="{24A7309204F3F-44CC-8375-53F13FE213F7}"> 
      <Shell Shell="%ProgramFiles%\Internet Explorer\iexplore.exe -k www.bing.com" /> 
    </Profile> 
  </Profiles> 
  <Configs>
    <!--local account-->
    <Account Name="ShellLauncherUser"/>
    <Profile ID="{24A7309204F3F-44CC-8375-53F13FE213F7}"/>
  </Configs>
</ShellLauncherConfiguration>

Pour le lanceur d’interpréteur de commandes v2, vous pouvez utiliser le type d’application UWP pour Shell en spécifiant l’espace de noms v2 et utiliser v2:AppType pour spécifier le type, comme illustré dans l’exemple suivant. Si v2:AppType n’est pas spécifié, cela signifie que l’interpréteur de commandes est une application Win32.

<?xml version="1.0" encoding="utf-8"?> 
<ShellLauncherConfiguration xmlns="http://schemas.microsoft.com/ShellLauncher/2018/Configuration" 
xmlns:v2="http://schemas.microsoft.com/ShellLauncher/2019/Configuration"> 
  <Profiles> 
    <DefaultProfile> 
      <Shell Shell="ShellLauncherV2DemoUwp_5d7tap497jwe8!App" v2:AppType="UWP" v2:AllAppsFullScreen="true"> 
        <DefaultAction Action="RestartShell"/> 
      </Shell> 
    </DefaultProfile> 
  </Profiles> 
  <Configs/> 
</ShellLauncherConfiguration>

Astuce

Dans le code XML du lanceur d’interpréteur de commandes v2, notez l’attribut AllAppsFullScreen . Lorsqu’il est défini sur True, le lanceur d’interpréteur de commandes exécute chaque application en plein écran ou agrandit pour les applications de bureau. Lorsque cet attribut a la valeur False ou n’est pas défini, seule l’application shell personnalisée s’exécute en plein écran ; les autres applications lancées par l’utilisateur s’exécutent en mode fenêtré.

Obtenez des exemples XML pour différentes configurations du lanceur d’interpréteur de commandes v2.

Paramètre OMA-URI personnalisé

Dans votre service MDM, vous pouvez créer un paramètre OMA-URI personnalisé pour configurer Shell Launcher v1 ou v2. (Le code XML que vous utilisez pour votre paramètre détermine si vous appliquez Le lanceur d’interpréteur de commandes v1 ou v2.)

Le chemin OMA-URI est ./Device/Vendor/MSFT/AssignedAccess/ShellLauncher.

Pour la valeur, vous pouvez sélectionner le type String de données et coller le contenu du fichier de configuration souhaité dans la zone de valeur. Si vous souhaitez charger le xml au lieu de coller le contenu, choisissez le type String (XML file)de données .

Capture d’écran des paramètres OMA-URI personnalisés.

Après avoir configuré le profil contenant le paramètre lanceur d’interpréteur de commandes personnalisé, sélectionnez Tous les appareils ou groupes d’appareils sélectionnés auxquels appliquer le profil. N’affectez pas le profil à des utilisateurs ou des groupes d’utilisateurs.

Configurer un interpréteur de commandes personnalisé à l’aide de PowerShell

Pour les scripts du lanceur d’interpréteur de commandes v2, consultez Exemples de scripts WMI de lanceur d’interpréteur de commandes v2.

Pour Le lanceur d’interpréteur de commandes v1, modifiez le script PowerShell suivant, selon les besoins. Les commentaires dans l’exemple de script expliquent l’objectif de chaque section et vous indiquent où modifier le script pour l’adapter à vos besoins. Enregistrez votre script avec l’extension .ps1, ouvrez Windows PowerShell en tant qu’administrateur, puis exécutez le script sur l’appareil plein écran.

# 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

# 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

action par défaut, action personnalisée, code de sortie

Le lanceur d’interpréteur de commandes définit 4 actions pour gérer les sorties d’application. Vous pouvez personnaliser le lanceur d’interpréteur de commandes et utiliser ces actions en fonction d’un code de sortie différent.

Valeur Description
0 Redémarrer l’interpréteur de commandes
1 Redémarrer l’appareil
2 Arrêter l’appareil
3 Ne rien faire

Ces actions peuvent être utilisées comme action par défaut ou mappées à un code de sortie spécifique. Reportez-vous à Lanceur d’interpréteur de commandes pour voir comment ces codes sont associés à L’interface WMI du lanceur d’interpréteur de commandes.

Pour configurer ces actions avec shell Launcher CSP, utilisez la syntaxe ci-dessous dans le xml de configuration du lanceur d’interpréteur de commandes. Vous pouvez spécifier au maximum 4 actions personnalisées mappant à 4 codes de sortie, et une action par défaut pour tous les autres codes de sortie. Lorsque l’application se termine et si le code de sortie est introuvable dans le mappage d’action personnalisée, ou qu’aucune action par défaut n’est définie, elle n’est pas opérationnelle, c’est-à-dire que rien ne se produit. Il est donc recommandé de définir au moins DefaultAction. Obtenez des exemples XML pour différentes configurations du lanceur d’interpréteur de commandes v2.

<ReturnCodeActions>
    <ReturnCodeAction ReturnCode="0" Action="RestartShell"/>
    <ReturnCodeAction ReturnCode="-1" Action="RestartDevice"/>
    <ReturnCodeAction ReturnCode="255" Action="ShutdownDevice"/>
    <ReturnCodeAction ReturnCode="1" Action="DoNothing"/>
</ReturnCodeActions>
<DefaultAction Action="RestartDevice"/>