シェル ランチャー
シェル起動ツールを使用すると、ほぼすべてのアプリケーションまたは実行可能ファイルをカスタム シェルとして使用するようにキオスク デバイスを構成できます。 通常、ユーザーがログオンするときに実行される既定のシェル (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 を返すことで、セッションの終了をブロックすることはできません。
注
シェル起動ツールと割り当てられたアクセスの両方を同じシステムで構成することはできません。
シェル起動ツール V2 を使用して、ユニバーサル Windows アプリをカスタム シェルとして指定できます。 シェルランチャー v1 とシェルランチャー V2 の違いについては、[シェルランチャーを使用してWindows 10キオスクを作成する] をオンにします。
シェル起動ツールは、カスタム シェルを起動する前に Run レジストリ キーと RunOnce レジストリ キーを処理するため、カスタム シェルは他のアプリケーションやサービスの自動起動を処理する必要はありません。
シェル起動ツールは、カスタム シェルが終了したときのシステムの動作も処理します。 既定の動作がニーズを満たしていない場合は、シェルの終了動作を構成できます。
他のデスクトップ アプリケーションとシステム コンポーネントへのアクセスを制御する方法は、シェル起動ツール (グループ ポリシー、AppLocker、Mobile デバイス管理 など) の使用に加えて使用できます。
注
Windows 10で使用できるシェル起動ツール v1 では、代替シェルとして Windows デスクトップ アプリケーションのみを指定できます。 シェル起動ツール v2 では、Windows 10 Version 1809以降で使用できる、UWP アプリを置換シェルとして指定することもできます。
バージョン 1809 でシェル起動ツール v2 を使用するには、 KB4551853更新プログラムをインストールする必要があります。
シェルランチャー v1 とシェルランチャー v2 の違い
シェル起動ツール v1 は、既定のシェルである explorer.exe
を eshell.exe
に置き換え、Windows デスクトップ アプリケーションを起動できます。
シェル起動ツール v2 は、 explorer.exe
を customshellhost.exe
に置き換えます。 この新しい実行可能ファイルは、Windows デスクトップ アプリケーションまたは UWP アプリを起動できます。
UWP アプリを置き換えシェルに使用できるだけでなく、Shell Launcher v2 には、次のような機能強化が用意されています。
- カスタム Windows デスクトップ アプリケーションを使用して、設定やタッチ キーボードなどの UWP アプリを起動できます。
- カスタム UWP シェルから、セカンダリ ビューを起動し、複数のモニターで実行できます。
- カスタム シェル アプリは全画面表示で実行され、ユーザーの要求に応じて他のアプリを全画面表示で実行できます。 さまざまなアプリの組み合わせのサンプル XML 構成については、「 シェル起動ツール v2 のサンプル」を参照してください。
要件
Windows 10 EnterpriseまたはWindows 10 Education。
用語
- オンにして、次の機能を有効にします。 設定をデバイスで使用できるようにし、必要に応じてデバイスに設定を適用します。
- 構成: 設定またはサブセットをカスタマイズするには。
- 埋め込みシェル起動ツール:この機能は、Windows 10 バージョン 1511 の Embedded Shell Launcher と呼ばれます。
- カスタム シェル起動ツール:この機能は、Windows 10 バージョン 1607 以降ではシェル起動ツールと呼ばれます。
シェル起動ツールを有効にする
シェル起動ツールは省略可能なコンポーネントであり、Windows 10では既定ではオンになっていません。 構成する前にオンにする必要があります。 Microsoft Windows がインストールされていない場合は、カスタマイズしたWindows 10 イメージ (.wim) でシェル起動ツールをオンにして構成できます。 Windows が既にインストールされている場合は、プロビジョニング パッケージを適用してシェル 起動ツールを構成する前に、シェル起動ツールをオンにする必要があります。
コントロール パネルを使用してシェル起動ツールを有効にする
- [ Web と Windows の検索 ] フィールドに「 プログラムと機能」と 入力し、 Enter キーを押すか、[ プログラムと機能 ] をタップまたは選択して開きます。
- [ プログラムと機能 ] ウィンドウで、[ Windows 機能のオンとオフを切り替える] を選択します。
- [Windows 機能] ウィンドウで、[デバイス ロックダウン] ノードを展開し、[シェル起動ツール] のチェック ボックスをオンまたはオフにして、[OK] を選択します。
- [Windows 機能] ウィンドウは、Windows が必要なファイルを検索していることを示し、進行状況バーを表示します。 見つかったら、ウィンドウは Windows が変更を適用していることを示します。 完了すると、要求された変更が完了したことを示すウィンドウが表示されます。
- [ 閉じる] を選択して 、[Windows 機能] ウィンドウを閉じます。
注
シェル起動ツールをオンにしても、デバイスを再起動する必要はありません。
WESL_UserSettingを呼び出してシェル起動ツールを有効にする
- Windows Management Instrumentation (WMI) クラス WESL_UserSettingで WESL_UserSetting.SetEnabled 関数を呼び出して、シェル 起動ツールを有効または無効にします。
- WESL_UserSettingを使用してシェル起動ツールを有効または無効にした場合、変更は現在サインインしているセッションには影響しません。サインアウトしてもう一度サインインする必要があります。
この例では、install.wim という Windows イメージを使用しますが、同じ手順を使用してプロビジョニング パッケージを適用できます (DISM の詳細については、「 展開イメージのサービスと管理とは」を参照してください。
DISM を使用してシェル 起動ツールを有効にする
管理者特権でコマンド プロンプトを開きます。
install.wim をハード ドライブ上の一時フォルダーにコピーします (次の手順では、C:\wim と呼ばれるものとします)。
新しいディレクトリを作成します。
md c:\wim
イメージをマウントします。
dism /mount-wim /wimfile:c:\bootmedia\sources\install.wim /index:1 /MountDir:c:\wim
この機能を有効にします。
dism /image:c:\wim /enable-feature /all /featureName:Client-EmbeddedShellLauncher
変更をコミットします。
dism /unmount-wim /MountDir:c:\wim /Commit
Windows 構成Designerを使用してシェル 起動ツールを有効にする
シェル 起動ツールの設定は Windows プロビジョニング設定としても使用できるため、イメージランタイム中に適用されるようにこれらの設定を構成できます。 1 つまたはすべてのシェル 起動ツールの設定を設定するには、Windows Configuration Designerを使用してプロビジョニング パッケージを作成し、イメージのデプロイ時または実行時にプロビジョニング パッケージを適用します。 Windows がインストールされておらず、Windows Configuration Designerを使用して、イメージに含まれるシェル 起動ツールの設定を含むインストール メディアを作成している場合、またはセットアップ中にプロビジョニング パッケージを適用する場合は、プロビジョニング パッケージが正常に適用されるように、DISM を使用してインストール メディアで Shell Launcher を有効にする必要があります。
次の手順を使用して、ShellLauncher 設定を含むプロビジョニング パッケージを作成します。
- 「Windows 10のプロビジョニング パッケージを作成する」の手順に従って、Windows Configuration Designerでプロビジョニング パッケージをビルドします。
- [ 使用可能なカスタマイズ ] ページで、[ ランタイム設定>SMISettings>ShellLauncher] を選択します。
- [有効にする] の値を ENABLE に設定します。 シェル起動ツールを構成するためのその他のオプションが表示され、必要に応じて値を設定できます。
- 設定の構成とプロビジョニング パッケージの作成が完了したら、イメージのデプロイ時間またはランタイムにパッケージを適用できます。 詳細については、「 プロビジョニング パッケージの適用 」を参照してください。 パッケージをWindows 10 Enterpriseイメージに適用するプロセスは同じです。
シェル ランチャーの構成
シェル起動ツールを構成するには、次の 2 つの方法があります。
- バージョン 1803 Windows 10では、割り当てられたアクセス構成サービス プロバイダー (CSP) の ShellLauncher ノードを使用してシェル起動ツールを構成できます。 詳細については、「 AssignedAccess CSP 」を参照してください。 この方法を使用してシェル起動ツールを構成すると、デバイスでシェル起動ツールがサポートされている場合は、自動的にデバイスでシェル起動ツールが有効になります。
- PowerShell スクリプトまたはアプリケーションでシェル起動ツール WMI プロバイダーを直接使用します。
シェル起動ツールには、次のオプションを構成できます。
- シェル起動ツールを有効または無効にします。
- 特定のユーザーまたはグループのシェル構成を指定します。
- 特定のユーザーまたはグループのシェル構成を削除します。
- 既定のシェル構成を変更します。
- 特定のユーザーまたはグループのシェル構成に関する情報を取得します。
変更は、ユーザーがサインインするまで有効になりません。
ユーザー アカウントごとに異なるシェルを起動する
既定では、シェル 起動ツールは既定のシェルを実行します。これは、設計時に OS イメージを作成するときに指定されます。 既定のシェルは Cmd.exe に設定されますが、任意の実行可能ファイルを既定のシェルとして指定できます。
既定のシェルを実行しない場合は、特定のユーザーまたはグループに対して別のシェルを起動するように Shell Launcher を構成できます。 たとえば、ゲスト アカウントに対してカスタム アプリケーション シェルを実行するようにデバイスを構成する一方で、デバイスをサービスするために管理者アカウントに対して標準の Windows エクスプローラー シェルを実行する場合があります。
実行時に WMI プロバイダーを使用してユーザーまたはグループのシェル 起動ツールを構成する場合は、そのユーザーまたはグループのセキュリティ識別子 (SID) を使用する必要があります。ユーザー名またはグループ名を使用することはできません。
一般的なセキュリティ識別子の詳細については、「 既知の SID」を参照してください。
現在サインインしているアカウントが、グループごとに異なる構成が定義されている 2 つ以上のグループに属している場合、シェル起動ツールは最初に見つかった構成を使用します。 検索順序は定義されていないため、シェル起動ツールの構成が異なる複数のグループにユーザーを割り当てないようにすることをお勧めします。
シェルが終了したときにアクションを実行する
カスタム シェルが終了すると、シェル起動ツールは次の 4 つのアクションのいずれかを実行できます。
操作 | 説明 |
---|---|
0 | シェルを再起動します。 |
1 | デバイスを再起動します。 |
2 | デバイスをシャットダウンします。 |
3 | 何もしない。 |
重要
シェル アプリケーションが自動的に終了せず、ダイアログ フィルターなどの機能によって自動的に閉じられないことを確認します。これは、リターン コード アクションが何も行わない限り、終了と再起動の無限のサイクルにつながる可能性があります。
既定の戻りコード アクション
DefaultReturnCodeAction 設定を使用して、シェル 起動ツールの既定のリターン コード アクションを定義できます。 初期値を変更しない場合、既定の戻りコード アクションは 0 (ゼロ) に設定されます。これは、シェル起動ツールがシェルの終了時にシェルを再起動することを示します。
終了コードをシェル起動ツール アクションにマップする
シェル起動ツールは、シェルによって返される終了コードに基づいて特定のアクションを実行できます。 シェルによって返される特定の終了コードに対して、シェル起動ツールが実行するアクションを構成するには、その終了コードをいずれかのシェル終了アクションにマッピングします。
終了コードが定義された値と一致しない場合、シェル起動ツールは既定の戻りコード アクションを実行します。
たとえば、シェルが終了する方法に応じて、シェルから -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
注
前のスクリプトには、カスタム シェルの削除やシェル起動ツールの無効化など、複数の構成オプションの例が含まれています。 そのまま実行するためのものではありません。
シェル起動ツールのユーザー権限
カスタム シェルはサインインしているアカウントと同じユーザー権限レベルで起動されます。 つまり、管理者権限を持つユーザーは、管理者権限を持つ他のアプリケーションを起動するなど、管理者権限を必要とするシステム アクションを実行できますが、管理者権限のないユーザーは実行できません。
Warning
シェル アプリケーションで管理者権限が必要で、管理者特権が必要で、ユーザー アカウント制御 (UAC) がデバイスに存在する場合は、シェル起動ツールがシェル アプリケーションを起動するために UAC を無効にする必要があります。