シェル ランチャー

シェル起動ツールを使用すると、ほぼすべてのアプリケーションまたは実行可能ファイルをカスタム シェルとして使用するようにキオスク デバイスを構成できます。 通常、ユーザーがログオンするときに実行される既定のシェル (explorer.exe) が指定するアプリケーションで置き換えられます。

また、ユーザーまたはユーザー グループごとに異なるシェル アプリケーションを起動するようにシェル ランチャーを構成することもできます。

カスタム シェルとして使用できるアプリケーションと実行可能ファイルには、いくつかの例外があります。

  • カスタム シェルとして次の実行可能ファイルを使用することはできません。 C:\\Windows\\System32\\Eshell.exe Eshell.exe を既定のシェルとして使用すると、ユーザーのサインイン後に空白画面が表示されます。
  • ユニバーサル Windows アプリをカスタム シェルとして使用することはできません。
  • カスタム シェルを使用してユニバーサル Windows アプリ (設定アプリなど) を起動することはできません。
  • 別のプロセスを起動し、カスタム シェルとして終了するアプリケーションを使用することはできません。 たとえば、シェルランチャーで write.exe を指定することはできません。 シェル ランチャーは、カスタム シェルを起動し、プロセスを監視してカスタム シェルがいつ終了するかを特定します。 Write.exe は、32 ビット wordpad.exe プロセスを作成して終了します。 シェルランチャーは新しく作成されたwordpad.exeプロセスを認識していないため、シェルランチャーは Write.exeの終了コードに基づいてアクションを実行し、カスタム シェルを再起動します。
  • システムがシャットダウンされないようにすることはできません。 シェルランチャー V1 と V2 の場合、グラフィカル アプリケーションでWM_QUERYENDSESSION メッセージを受信したときに FALSE を返すか、コンソール アプリケーションの SetConsoleCtrlHandler 関数を介して追加されたハンドラー ルーチンで FALSE を返すことで、セッションの終了をブロックすることはできません。

Note

同じシステム上で、シェル ランチャーと割り当てられたアクセスの両方を構成することはできません。

シェル ランチャー V2 を使用すると、ユニバーサル Windows アプリをカスタム シェルとして指定できます。 シェル ランチャー V1 とシェル ランチャー V2 の違いについては、シェル ランチャーを使用した Windows 10 キオスクの作成に関するページを参照してください。

シェル ランチャーでは、カスタム シェルを開始する前に RunRunOnce のレジストリ キーが処理されます。そのため、カスタム シェルで他のアプリケーションやサービスの自動スタートアップを制御する必要はありません。

シェル ランチャーでは、カスタム シェルが終了するときのシステムの動作も制御されます。 既定の動作がニーズを満たさない場合は、シェル終了動作を構成できます。

シェル起動ツールの他にも、グループ ポリシーAppLockerモバイル デバイス管理など、他のデスクトップ アプリケーションやシステム コンポーネントへのアクセスを制御する方法があります。

注意

Windows 10 で使用できる Shell 起動ツール v1 では、置換シェルとして Windows デスクトップアプリケーションのみを指定できます。 Windows 10 バージョン 1809 以降で使用できるシェル起動ツール v2 では、UWP アプリを置換シェルとして指定することもできます。

バージョン 1809 でシェル起動ツール v2 を使用するには、 KB4551853 更新プログラムをインストールする必要があります。

シェル起動ツール v1 とシェル起動ツール v2 の違い

シェル起動ツール v1 は、既定のシェルである explorer.exeeshell.exe に置き換えます。これにより、Windows デスクトップ アプリケーションを起動できます。 シェル起動ツール v2 は explorer.execustomshellhost.exe に置き換えます。 この新しい実行可能ファイルは、Windows デスクトップ アプリケーションまたは UWP アプリを起動できます。 UWP アプリを置換シェルに使用できるだけでなく、シェル起動ツール v2 には、次のような機能が追加されています。

  • カスタムの Windows デスクトップ アプリケーションを使用して、設定やタッチ キーボードなどの UWP アプリを起動できます。
  • カスタム UWP シェルから、セカンダリ ビューを起動し、複数のモニターで実行できます。
  • カスタム シェル アプリは全画面表示で実行され、ユーザーの要求に応じて、他のアプリを全画面表示で実行できます。 さまざまなアプリの組み合わせるサンプルの XML 構成については、シェル起動ツール v2 の例を参照してください。

要件

Windows 10 Enterprise または Windows 10 Education。

用語

  • オンにする、有効にする: デバイスで設定を使用できるようにし、必要に応じてその設定を対象デバイスに適用すること。
  • 構成: 設定またはサブセットをカスタマイズする。
  • エンベッド シェル ランチャー: この機能は Windows 10 バージョン 1511 ではエンベッド シェル ランチャーと呼ばれます。
  • カスタム シェル ランチャー: この機能は Windows 10 バージョン 1607 以降ではシェル ランチャーと呼ばれます。

シェル起動ツールを有効にする

シェルランチャーはオプションのコンポーネントであり、Windows 10では既定ではオンになっていません。 構成する前にオンにする必要があります。 Microsoft Windows がインストールされていない場合は、カスタマイズしたWindows 10 イメージ (.wim) でシェルランチャーをオンにして構成できます。 Windows が既にインストールされている場合は、プロビジョニング パッケージを適用してシェルランチャーを構成する前に、シェルランチャーを有効にする必要があります。

コントロール パネルを使用してシェル ランチャーを有効にする

  1. [ Web と Windows の検索 ] フィールドに「 プログラムと機能」と 入力し、 Enter キーを押すか、または [ プログラムと機能 ] をタップまたは選択して開きます。
  2. [ プログラムと機能] ウィンドウで、[ Windows の機能を有効または無効にする] を選択します。
  3. [Windows 機能] ウィンドウで、[デバイス ロックダウン] ノードを展開し、[シェル ランチャー] のチェック ボックスをオンまたはオフにして、[OK] を選択します。
  4. [Windows の機能] ウィンドウには、Windows によって必要なファイルが検索されていることが示され、進行状況バーが表示されます。 見つかった場合、Windows によって変更が適用されていることがウィンドウに示されます。 完了すると、要求された変更が完了したとウィンドウに示されます。
  5. [ 閉じる ] を選択して [Windows の機能] ウィンドウを閉じます。

Note

シェル ランチャーをオンにしても、デバイスを再起動する必要はありません。

WESL_UserSetting を呼び出してシェル ランチャーを有効にする

  1. Windows Management Instrumentation (WMI) クラスの WESL_UserSetting で WESL_UserSetting.SetEnabled 関数を呼び出して、シェル ランチャーを有効または無効にします。
  2. WESL_UserSettingを使用してシェルランチャーを有効または無効にした場合、変更は現在サインインしているセッションには影響しません。サインアウトしてサインインし直す必要があります。

この例では、install.wim という Windows イメージを使用しますが、同じ手順を使用してプロビジョニング パッケージを適用できます (DISM の詳細については、展開イメージのサービスと管理」に関するページを参照してください)。

DISM を使用してシェル ランチャーを有効にする

  1. 管理者特権でコマンド プロンプトを開きます。

  2. install.wim をハード ドライブ上の一時フォルダーにコピーします (次の手順では、C:\wim と呼ばれるものとします)。

  3. 新しいディレクトリを作成します。

    md c:\wim
    
  4. イメージをマウントします。

    dism /mount-wim /wimfile:c:\bootmedia\sources\install.wim /index:1 /MountDir:c:\wim
    
  5. 機能を有効にします。

    dism /image:c:\wim /enable-feature /all /featureName:Client-EmbeddedShellLauncher
    
  6. 変更をコミットします。

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

Windows 構成デザイナーを使用してシェル ランチャーを有効にする

シェル ランチャーの設定は Windows プロビジョニング設定としても使用できるため、イメージの実行時に適用されるように設定を構成できます。 Windows 構成デザイナーを使用してプロビジョニング パッケージを作成し、イメージの展開時または実行時にプロビジョニング パッケージを適用することで、1 つまたはすべてのシェル ランチャー設定を行うことができます。 Windows がインストールされておらず、Windows 構成Designerを使用して、イメージに含まれるシェル ランチャーの設定を含むインストール メディアを作成する場合、またはセットアップ中にプロビジョニング パッケージを適用する場合は、プロビジョニング パッケージを正常に適用するために、DISM を使用してインストール メディアでシェルランチャーを有効にする必要があります。

ShellLauncher 設定を含むプロビジョニング パッケージを作成するには、次の手順に従います。

  1. Windows 10 のプロビジョニング パッケージの作成に関するページの手順に従って、Windows 構成デザイナーでプロビジョニング パッケージを作成します。
  2. [利用可能なカスタマイズ] ページで、[実行時の設定]>[SMISettings]>[ShellLauncher] を選択します。
  3. [有効化] の値を [有効化] に設定します。 シェル ランチャーを構成するためのその他のオプションが表示され、必要に応じて値を設定できます。
  4. 設定の構成とプロビジョニング パッケージの作成が完了したら、イメージの展開時または実行時にパッケージを適用できます。 詳細については、「プロビジョニング パッケージの適用」を参照してください。 パッケージをWindows 10 Enterpriseイメージに適用するプロセスは同じです。

シェル ランチャーの構成

次の 2 つの方法でシェル ランチャーを構成できます。

  1. Windows 10 バージョン 1803 では、AssignedAccess 構成サービス プロバイダー (CSP) の ShellLauncher ノードを使用して、シェル ランチャーを構成できます。 詳細については、「AssignedAccess CSP」を参照してください。 また、この方法を使用してシェル ランチャーを構成すると、デバイス上のシェル ランチャーも自動的に有効になります (デバイスでサポートされている場合)。
  2. PowerShell スクリプトまたはアプリケーションで、シェル ランチャーの WMI プロバイダーを直接使用します。

シェル ランチャーには、次のオプションを構成できます。

  • シェル ランチャーを有効または無効にする。
  • 特定のユーザーまたはグループのシェル構成を指定する。
  • 特定のユーザーまたはグループのシェル構成を削除する。
  • 既定のシェル構成を変更する。
  • 特定のユーザーまたはグループのシェル構成に関する情報を取得する。

変更は、ユーザーがサインインするまで有効になりません。

さまざまなユーザー アカウントに対して異なるシェルを起動する

既定では、デザイン時、OS イメージを作成するときに指定された既定のシェルがシェル ランチャーで実行されます。 既定のシェルは Cmd.exe に設定されていますが、任意の実行可能ファイルを既定のシェルとして指定できます。

既定のシェルを実行しない場合は、特定のユーザーまたはグループに対して別のシェルを起動するようにシェルランチャーを構成できます。 たとえば、ゲスト アカウントではカスタム アプリケーション シェルを実行し、管理者アカウントではデバイスにサービスを提供するために標準エクスプローラー シェルを実行するようにデバイスを構成できます。

実行時に WMI プロバイダーを使用してユーザーまたはグループのシェル ランチャーを構成する場合は、そのユーザーまたはグループのセキュリティ識別子 (SID) を使用する必要があります。ユーザー名またはグループ名を使用することはできません。

一般的なセキュリティ識別子の詳細については、「既知の SID」を参照してください。

現在のサインイン アカウントが、それぞれに異なる構成が定義されている 2 つ以上のグループに属している場合、シェル ランチャーでは最初に検出された構成が使用されます。 検索順序は定義されていないため、シェル起動ツールの構成が異なる複数のグループにユーザーを割り当てないようにすることをお勧めします。

シェルが終了したときにアクションを実行する

カスタム シェルが終了したら、シェル ランチャーでは次の 4 つのアクションのいずれかを実行できます。

アクション 説明
0 シェルを再起動します。
1 デバイスを再起動します。
2 デバイスをシャットダウンします。
3 何もしない。

重要

シェル アプリケーションが自動的に終了せず、ダイアログ フィルターなどの機能によって自動的に閉じられないことを確認してください。これは、何も実行しないようにリターン コード アクションが設定されていない限り、終了と再起動の無限のサイクルが発生する可能性があるためです。

既定のリターン コード アクション

DefaultReturnCodeAction 設定を使用して、シェル ランチャーの既定のリターン コード アクションを定義できます。 初期値を変更しない場合、既定のリターン コード アクションは 0 (ゼロ) に設定されます。これは、シェル起動ツールがシェルの終了時にシェルを再起動することを示します。

終了コードをシェル ランチャー アクションにマップする

シェル ランチャーでは、シェルから返される終了コードに基づいて特定のアクションを実行できます。 シェルから返される所定の終了コードについて、シェル ランチャーで実行するアクションを構成するには、その終了コードをシェル終了アクションの 1 つにマップします。

終了コードが定義された値と一致しない場合、シェル ランチャーは既定のリターン コード アクションを実行します。

たとえば、シェルの終了方法によっては、シェルから -1、0、1、または 255 の終了コード値が返される場合があります。 次を行うように、シェル ランチャーを構成できます。

  • シェルから終了コード値 -1 が返された場合は、デバイスを再起動する (1)
  • シェルから終了コード値 0 が返された場合は、シェルを再起動する (0)
  • シェルから終了コード値 1 が返された場合は、何も実行しない (3)
  • シェルから終了コード値 255 が返された場合は、デバイスをシャットダウンする (2)

カスタム リターン コード アクションのマッピングは次のようになります。

終了コード アクション
-1 1 (デバイスを再起動する)
0 0 (シェルを再起動する)
1 3 (何も実行しない)
255 2 (デバイスをシャットダウンする)

カスタム シェルを設定する

必要に応じて次の PowerShell スクリプトを変更し、デバイスでスクリプトを実行します。

# 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

Note

前のスクリプトには、カスタム シェルの削除やシェル起動ツールの無効化など、複数の構成オプションの例が含まれています。 これは、このまま実行することを意図したものではありません。

シェル起動ツールのユーザー権限

カスタム シェルはサインインしているアカウントと同じユーザー権限レベルで起動されます。 つまり、管理者権限を持つユーザーは、管理者権限を持つ他のアプリケーションの起動など、管理者権限を必要とするシステム アクションを実行できますが、管理者権限のないユーザーは実行できません。

警告

シェル アプリケーションが管理者権限と昇格を必要としており、デバイスにユーザー アカウント制御 (UAC) がある場合、シェル ランチャーでシェル アプリケーションを起動するために UAC を無効にする必要があります。