殼層啟動程式

使用殼層啟動器,您可以設定 kiosk 裝置,以使用幾乎任何應用程式或可執行檔作為自訂殼層。 您指定的應用程式會取代通常在使用者登入時執行的預設殼層 (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 kiosk

Shell 啟動器會在啟動自訂殼層之前處理Run 和 RunOnce登錄機碼,因此您的自訂殼層不需要處理自動啟動其他應用程式和服務。

Shell 啟動器也會在自訂殼層結束時處理系統的行為。 如果預設行為不符合您的需求,您可以設定殼層結束行為。

除了使用殼層啟動器,例如群組原則AppLockerMobile 裝置管理之外,還可以使用控制其他傳統型應用程式和系統元件存取的方法

注意

在殼層啟動器 v1 中,可在 Windows 10 中使用,您只能將 Windows 傳統型應用程式指定為取代殼層。 在殼層啟動器 v2 中,可在 Windows 10 版本 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 組態,請參閱 Shell 啟動器 v2 的範例

規格需求

Windows 10 企業版或Windows 10 教育版。

詞彙

  • 開啟,啟用: 若要讓設定可供裝置使用,並選擇性地將設定套用至裝置。
  • 配置: 若要自訂設定或子設定。
  • 內嵌殼層啟動器:此功能在 Windows 10 1511 版中稱為內嵌殼層啟動器。
  • 自訂殼層啟動器:此功能在 Windows 10 1607 版和更新版本中稱為殼層啟動器。

開啟殼層啟動器

殼層啟動器是選擇性元件,預設不會在 Windows 10 中開啟。 在設定之前,必須先開啟它。 如果尚未安裝 Microsoft Windows,您可以在自訂的 Windows 10 映射 (.wim) 中開啟和設定殼層啟動器。 如果已安裝 Windows,您必須先開啟殼層啟動器,才能套用布建套件來設定殼層啟動器。

使用 主控台 啟用殼層啟動器

  1. 在 [ 搜尋 Web 和 Windows ] 欄位中,輸入 [程式和功能 ],然後按 Enter 或點選或選取 [ 程式和功能 ] 加以開啟。
  2. 在 [ 程式和功能 ] 視窗中,選取 [開啟或關閉 Windows 功能]。
  3. [Windows 功能 ] 視窗中,展開 [ 裝置鎖定] 節點,選取或清除殼層 啟動器的核取方塊,然後選取 [ 確定]。
  4. [Windows 功能] 視窗指出 Windows 正在搜尋必要的檔案,並顯示進度列。 找到之後,視窗會指出 Windows 正在套用變更。 完成時,視窗會指出要求的變更已完成。
  5. 選取 [關閉 ] 以關閉 [Windows 功能] 視窗。

注意

開啟殼層啟動器不需要重新開機裝置。

呼叫 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 組態Designer啟用殼層啟動器

Shell 啟動器設定也可做為 Windows 布建設定,因此您可以設定要在映射執行時間期間套用這些設定。 您可以使用 Windows 組態Designer建立布建套件,然後在映射部署期間或執行時間套用布建套件,來設定一或所有殼層啟動器設定。 如果尚未安裝 Windows,而且您使用 Windows 組態Designer建立安裝媒體,其中包含映射中殼層啟動器的設定,或在安裝期間套用布建套件,您必須在安裝媒體上使用 DISM 啟用殼層啟動器,才能成功套用布建套件。

使用下列步驟來建立包含 ShellLauncher 設定的布建套件。

  1. 遵循建立適用于Windows 10的布建套件中的指示,在 Windows 組態Designer中建置布建套件。
  2. 在 [可用的自訂專案] 頁面中,選取 [執行時間設定>] [SMISettings>ShellLauncher]。
  3. [啟用 ] 的值設定為 ENABLE。 [設定殼層啟動器] 的更多選項隨即出現,您可以視需要設定值。
  4. 完成設定並建立布建套件之後,您可以將套件套用至映射部署時間或執行時間。 如需詳細資訊,請參閱 套用布建套件 。 將封裝套用至Windows 10 企業版映射的程式相同。

設定殼層啟動程式

有兩種方式可以設定殼層啟動器:

  1. 在 Windows 10 1803 版中,您可以使用 [指派的存取設定服務提供者] (CSP) 的ShellLauncher節點來設定殼層啟動器。 如需詳細資訊 ,請參閱 AssignedAccess CSP 。 如果使用此方法設定殼層啟動器,如果裝置支援,也會自動在裝置上啟用殼層啟動器。
  2. 直接在 PowerShell 腳本或應用程式中使用殼層啟動器 WMI 提供者。

您可以為殼層啟動器設定下列選項:

  • 啟用或停用殼層啟動器。
  • 指定特定使用者或群組的殼層組態。
  • 移除特定使用者或群組的殼層組態。
  • 變更預設殼層組態。
  • 取得特定使用者或群組之殼層設定的相關資訊。

在使用者登入之前,任何變更都不會生效。

針對不同的使用者帳戶啟動不同的殼層

根據預設,Shell 啟動器會執行預設殼層,這是在設計階段建立 OS 映射時所指定的。 預設殼層會設定為 Cmd.exe,但您可以將任何可執行檔指定為預設殼層。

如果您不想執行預設殼層,您可以設定殼層啟動器,以針對特定使用者或群組啟動不同的殼層。 例如,您可以將裝置設定為針對來賓帳戶執行自訂應用程式殼層,但針對系統管理員帳戶執行標準 Windows 檔案總管殼層以服務裝置。

如果您使用 WMI 提供者在執行時間為使用者或群組設定殼層啟動器,您必須針對該使用者或群組使用安全識別碼 (SID) ;您無法使用使用者名稱或組名。

如需常見安全性識別碼的詳細資訊,請參閱 已知的 SID

當目前的登入帳戶屬於針對每個群組定義不同組態的兩個或多個群組時,Shell Launcher 會使用它找到的第一個組態。 未定義搜尋順序,因此建議您避免將使用者指派給具有不同殼層啟動器設定的多個群組。

當殼層結束時執行動作

自訂殼層結束時,殼層啟動器可以執行四個動作之一:

動作 描述
0 重新開機殼層。
1 重新啟動裝置。
2 關閉裝置。
3 不執行任何動作。

重要

請確定殼層應用程式不會自動結束,而且不會由對話方塊篩選等任何功能自動關閉,因為這可能會造成無限迴圈的結束和重新開機,除非傳回碼動作設定為不執行任何動作。

預設傳回碼動作

您可以使用 DefaultReturnCodeAction 設定來定義殼層啟動器的預設傳回碼動作。 如果您未變更初始值,預設傳回碼動作會設定為 0 (零) ,這表示殼層啟動器會在殼層結束時重新開機殼層。

將結束代碼對應至殼層啟動器動作

殼層啟動器可以根據殼層傳回的結束代碼採取特定動作。 對於殼層所傳回的任何指定結束代碼,您可以藉由將結束代碼對應至其中一個殼層結束動作,來設定 Shell 啟動器所採取的動作。

如果結束代碼不符合定義的值,Shell 啟動器會執行預設傳回碼動作。

例如,您的殼層可能會根據殼層結束的方式傳回 -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

注意

先前的腳本包含多個組態選項的範例,包括移除自訂殼層和停用殼層啟動器。 它並非依原樣執行。

Shell 啟動器使用者權限

自訂殼層會以登入帳戶的相同等級權限啟動。 這表示具有系統管理員許可權的使用者可以執行任何需要系統管理員許可權的系統動作,包括啟動具有系統管理員許可權的其他應用程式,而沒有系統管理員許可權的使用者則無法執行。

警告

如果您的殼層應用程式需要系統管理員許可權且需要提高許可權,而且您的裝置上存在使用者帳戶控制 (UAC) ,您必須停用 UAC,殼層啟動器才能啟動殼層應用程式。