Iniciador de Shell

Usando o Iniciador de Shell, você pode configurar um dispositivo de quiosque para usar quase qualquer aplicativo ou executável como seu shell personalizado. O aplicativo que você especificar substitui o shell padrão (explorer.exe) que geralmente é executado quando um usuário faz login.

Você também pode configurar o Iniciador de Shell para iniciar diferentes aplicativos de shell para diferentes usuários ou grupos de usuários.

Há algumas exceções para os aplicativos e executáveis que você pode usar como um shell personalizado:

  • Você não pode usar o seguinte executável como um shell personalizado: C:\\Windows\\System32\\Eshell.exe. Usar Eshell.exe como o shell padrão resultará em uma tela em branco depois que o usuário entrar.
  • Você não pode usar um aplicativo Universal do Windows como um shell personalizado.
  • Você não pode usar um shell personalizado para iniciar aplicativos Universais do Windows, por exemplo, o aplicativo Configurações.
  • Você não pode usar um aplicativo que inicia um processo diferente e sai como um shell personalizado. Por exemplo, você não pode especificar write.exe no Iniciador de Shell. O Iniciador de Shell inicia um shell personalizado e monitora o processo para identificar quando o shell personalizado é encerrado. Write.exe cria um processo de 32 bits do wordpad.exe e é encerrado. Como o Iniciador de Shell não está ciente do processo de wordpad.exe recém-criado, o Iniciador de Shell executa uma ação com base no código de saída do Write.exee reinicia o shell personalizado.
  • Você não pode impedir que o sistema seja desligado. Para o Inicializador de Shell V1 e V2, não é possível bloquear o término da sessão retornando FALSE ao receber a mensagem WM_QUERYENDSESSION em um aplicativo gráfico ou retornando FALSE na rotina do manipulador que é adicionada por meio da função SetConsoleCtrlHandler em um aplicativo de console.

Observação

Não é possível configurar o Iniciador de Shell e o acesso atribuído no mesmo sistema.

Use o Iniciador de Shell V2, você pode especificar um aplicativo Universal do Windows como um shell personalizado. Marque Usar o Iniciador de Shell para criar um quiosque do Windows 10 para ver as diferenças entre o Iniciador de Shell v1 e o Iniciador de Shell V2.

O Iniciador de Shell processa as chaves do Registro Executar e ExecutarOnce antes de iniciar o shell personalizado, para que o shell personalizado não precise lidar com a inicialização automática de outros aplicativos e serviços.

O Iniciador de Shell também lida com o comportamento do sistema quando o shell personalizado é encerrado. Você poderá configurar o comportamento de saída do shell se o comportamento padrão não atender às suas necessidades.

Métodos de controle do acesso a outros aplicativos da área de trabalho e componentes do sistema podem ser usados além de usar o Iniciador de Shell, como, Política de Grupo, AppLocker e Mobile Gerenciamento de Dispositivos

Observação

No Iniciador de Shell v1, disponível no Windows 10, você só pode especificar um aplicativo da área de trabalho do Windows como o shell de substituição. No Iniciador de Shell v2, disponível em Windows 10, versão 1809 e superior, você também pode especificar um aplicativo UWP como o shell de substituição.

Para usar o Iniciador de Shell v2 na versão 1809, você precisa instalar a atualização KB4551853.

Diferenças entre o Iniciador de Shell v1 e o Iniciador de Shell v2

O Iniciador de Shell v1 substitui explorer.exe, o shell padrão, por eshell.exe, que pode iniciar um aplicativo da área de trabalho do Windows. O Iniciador de Shell v2 substitui por explorer.execustomshellhost.exe. Esse novo arquivo executável pode iniciar um aplicativo da área de trabalho do Windows ou um aplicativo UWP. Além de permitir que você use um aplicativo UWP para seu shell de substituição, o Shell Launcher v2 oferece mais aprimoramentos:

  • Você pode usar um aplicativo personalizado da área de trabalho do Windows que pode iniciar aplicativos UWP, como Configurações e Teclado Virtual.
  • Em um shell UWP personalizado, você pode iniciar exibições secundárias e executar em vários monitores.
  • O aplicativo shell personalizado é executado em tela inteira e pode executar outros aplicativos em tela inteira sob demanda do usuário. Para obter configurações XML de exemplo para as diferentes combinações de aplicativos, consulte Exemplos para o Iniciador de Shell v2.

Requisitos

Windows 10 Enterprise ou Windows 10 Education.

Terminologia

  • Ative e habilite: para disponibilizar a configuração para o dispositivo e, opcionalmente, aplicar as configurações ao dispositivo.
  • Configurar: Para personalizar a configuração ou as subconfigurações.
  • Iniciador de shell inserido: Esse recurso é chamado de Iniciador de Shell Inserido no Windows 10, versão 1511.
  • Inicializador de shell personalizado: Esse recurso é chamado de Iniciador de Shell no Windows 10, versão 1607 e posterior.

Ativar o Iniciador de Shell

O Iniciador de Shell é um componente opcional e não está ativado por padrão no Windows 10. Ele deve ser ativado antes da configuração. Você pode ativar e configurar o Iniciador de Shell em uma imagem personalizada do Windows 10 (.wim) se o Microsoft Windows não tiver sido instalado. Se o Windows já tiver sido instalado, você deverá ativar o Iniciador de Shell antes de aplicar um pacote de provisionamento para configurar o Iniciador de Shell.

Habilitar o Iniciador de Shell usando Painel de Controle

  1. No campo Pesquisar na Web e no Windows , digite Programas e Recursos e pressione Enter ou toque ou selecione Programas e Recursos para abri-lo.
  2. Na janela Programas e Recursos , selecione Ativar ou desativar recursos do Windows.
  3. Na janela Recursos do Windows , expanda o nó Bloqueio de Dispositivo , marque ou desmarque a caixa de seleção Inicializador de Shell e selecione OK.
  4. A janela Recursos do Windows indica que o Windows está procurando arquivos necessários e exibe uma barra de progresso. Depois de encontrada, a janela indica que o Windows está aplicando as alterações. Quando concluída, a janela indica que as alterações solicitadas foram concluídas.
  5. Selecione Fechar para fechar a janela Recursos do Windows .

Observação

Ativar o Iniciador de Shell não requer uma reinicialização do dispositivo.

Habilitar Inicializador de Shell chamando WESL_UserSetting

  1. Habilite ou desabilite o Iniciador de Shell chamando a função WESL_UserSetting.SetEnabled na classe WMI (Instrumentação de Gerenciamento do Windows) WESL_UserSetting.
  2. Se você habilitar ou desabilitar o Iniciador de Shell usando WESL_UserSetting, as alterações não afetarão nenhuma sessão que esteja atualmente conectado; você deve sair e entrar novamente.

Este exemplo usa uma imagem do Windows chamada install.wim, mas você pode usar o mesmo procedimento para aplicar um pacote de provisionamento (para obter mais informações sobre DISM, consulte O que é gerenciamento e manutenção de imagens de implantação.

Habilitar o Iniciador de Shell usando DISM

  1. Abra uma prompt de comando com privilégios de administrador.

  2. Copie install.wim para uma pasta temporária no disco rígido (nas etapas a seguir, presumimos que ele seja chamado de C:\wim).

  3. Criará um novo diretório.

    md c:\wim
    
  4. Monte a imagem.

    dism /mount-wim /wimfile:c:\bootmedia\sources\install.wim /index:1 /MountDir:c:\wim
    
  5. Habilitar o recurso.

    dism /image:c:\wim /enable-feature /all /featureName:Client-EmbeddedShellLauncher
    
  6. Confirme a alteração.

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

Habilitar o Iniciador de Shell usando o Designer de Configuração do Windows

As configurações do Iniciador de Shell também estão disponíveis como configurações de provisionamento do Windows para que você possa definir essas configurações a serem aplicadas durante o runtime de imagem. Você pode definir uma ou todas as configurações do Iniciador de Shell criando um pacote de provisionamento usando a Configuração do Windows Designer e, em seguida, aplicando o pacote de provisionamento durante o tempo de implantação da imagem ou o runtime. Se o Windows não tiver sido instalado e você estiver usando a Configuração do Windows Designer para criar mídia de instalação com configurações para o Iniciador de Shell incluído na imagem ou se você estiver aplicando um pacote de provisionamento durante a instalação, deverá habilitar o Iniciador de Shell na mídia de instalação com DISM para que um pacote de provisionamento seja aplicado com êxito.

Use as etapas a seguir para criar um pacote de provisionamento que contém as configurações de ShellLauncher.

  1. Crie um pacote de provisionamento no Windows Configuration Designer seguindo as instruções em Criar um pacote de provisionamento para Windows 10.
  2. Na página Personalizações disponíveis, selecione Configurações> de runtimeSMISettings>ShellLauncher.
  3. Defina o valor de Habilitar como HABILITAR. Mais opções para configurar o Iniciador de Shell são exibidas e você pode definir os valores conforme desejado.
  4. Depois de terminar de definir as configurações e criar o pacote de provisionamento, você poderá aplicar o pacote ao tempo de implantação da imagem ou ao runtime. Confira Aplicar um pacote de provisionamento para obter mais informações. O processo para aplicar o pacote a uma imagem de Windows 10 Enterprise é o mesmo.

Configurar o Iniciador de Shell

Há duas maneiras de configurar o Iniciador de Shell:

  1. No Windows 10, versão 1803, você pode configurar o Iniciador de Shell usando o nó ShellLauncher do CSP (Provedor de Serviços de Configuração de Acesso Atribuído). Confira CSP AssignedAccess para obter detalhes. Configurar o Iniciador de Shell usando esse método também habilita automaticamente o Iniciador de Shell no dispositivo, se o dispositivo der suporte a ele.
  2. Use os provedores WMI do Iniciador de Shell diretamente em um script ou aplicativo do PowerShell.

Você pode configurar as seguintes opções para o Iniciador de Shell:

  • Habilitar ou desabilitar o Iniciador de Shell.
  • Especifique uma configuração de shell para um usuário ou grupo específico.
  • Remova uma configuração de shell para um usuário ou grupo específico.
  • Altere a configuração padrão do shell.
  • Obtenha informações sobre uma configuração de shell para um usuário ou grupo específico.

As alterações não entrarão em vigor até que um usuário entre.

Iniciar shells diferentes para contas de usuário diferentes

Por padrão, o Iniciador de Shell executa o shell padrão, que é especificado quando você cria a imagem do sistema operacional em tempo de design. O shell padrão é definido como Cmd.exe, mas você pode especificar qualquer arquivo executável para ser o shell padrão.

Você pode configurar o Iniciador de Shell para iniciar um shell diferente para usuários ou grupos específicos se não quiser executar o shell padrão. Por exemplo, você pode configurar um dispositivo para executar um shell de aplicativo personalizado para contas de convidado, mas executar o shell padrão do Windows Explorer para contas de administrador para atender ao dispositivo.

Se você usar os provedores WMI para configurar o Iniciador de Shell para um usuário ou grupo em tempo de execução, deverá usar o SID (identificador de segurança) para esse usuário ou grupo; você não pode usar o nome de usuário ou o nome de grupo.

Para obter mais informações sobre identificadores de segurança comuns, consulte SIDs conhecidos.

Quando a conta de entrada atual pertence a dois ou mais grupos que têm configurações diferentes definidas para cada grupo, o Iniciador de Shell usa a primeira configuração encontrada. A ordem de pesquisa não está definida, portanto, recomendamos que você evite atribuir um usuário a vários grupos com configurações diferentes do Iniciador de Shell.

Executar uma ação quando o shell for encerrado

Quando um shell personalizado é encerrado, o Iniciador de Shell pode executar uma das quatro ações:

Ação Descrição
0 Reinicie o shell.
1 Reinicie o dispositivo.
2 Desligar o dispositivo.
3 Não fazer nada.

Importante

Verifique se o aplicativo shell não é encerrado automaticamente e não é fechado automaticamente por nenhum recurso, como Filtro de Caixa de Diálogo, pois isso pode levar a um ciclo infinito de saída e reinicialização, a menos que a ação de código de retorno esteja definida para não fazer nada.

Ação de código de retorno padrão

Você pode definir uma ação de código de retorno padrão para o Iniciador de Shell com a configuração DefaultReturnCodeAction. Se você não alterar o valor inicial, a ação de código de retorno padrão será definida como 0 (zero), o que indica que o Iniciador de Shell reinicia o shell quando o shell é encerrado.

Mapear o código de saída para uma ação do Iniciador de Shell

O Iniciador de Shell pode executar uma ação específica com base no código de saída retornado pelo shell. Para qualquer código de saída retornado pelo shell, você pode configurar a ação que o Iniciador de Shell executa mapeando esse código de saída para uma das ações de saída do shell.

Se o código de saída não corresponder a um valor definido, o Iniciador de Shell executará a ação de código de retorno padrão.

Por exemplo, seu shell pode retornar valores de código de saída de -1, 0, 1 ou 255, dependendo de como o shell sai. Você pode configurar o Iniciador de Shell para:

  • reinicie o dispositivo (1) quando o shell retornar um código de saída do valor -1
  • reiniciar o shell (0) quando o shell retornar um código de saída do valor 0
  • não fazer nada (3) quando o shell retornar um código de saída do valor 1
  • desligar o dispositivo (2) quando o shell retornar um código de saída do valor 255

O mapeamento de ação de código de retorno personalizado teria esta aparência:

Código de saída Ação
-1 1 (reinicie o dispositivo)
0 0 (reinicie o shell)
1 3 (não fazer nada)
255 2 (desligar o dispositivo)

Definir seu shell personalizado

Modifique o script do PowerShell a seguir conforme apropriado e execute o script no dispositivo.

# 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

Observação

O script anterior inclui exemplos de várias opções de configuração, incluindo a remoção de um shell personalizado e a desabilitação do Iniciador de Shell. Ele não se destina a ser executado no modo em que se encontra.

Direitos de usuário do Iniciador de Shell

Um shell personalizado é iniciado com o mesmo nível de direitos de usuário da conta conectada. Isso significa que um usuário com direitos de administrador pode executar qualquer ação do sistema que exija direitos de administrador, incluindo a inicialização de outros aplicativos com direitos de administrador, enquanto um usuário sem direitos de administrador não pode.

Aviso

Se o aplicativo shell exigir direitos de administrador e precisar ser elevado e o UAC (Controle de Conta de Usuário) estiver presente em seu dispositivo, você deverá desabilitar o UAC para que o Iniciador de Shell inicie o aplicativo shell.