殼層啟動程式
使用 Shell Launcher,您可以將 kiosk 裝置設定為使用幾乎任何應用程式或可執行檔作為自定義殼層。 您指定的應用程式會取代通常在使用者登入時執行的預設殼層 (explorer.exe)。
您也可以設定Shell Launcher,為不同的使用者或使用者群組啟動不同的殼層應用程式。
您可以用來作為自訂殼層的應用程式和可執行檔案有一些例外狀況:
- 您無法使用下列可執行檔作為自訂殼層:
C:\\Windows\\System32\\Eshell.exe
。 使用 Eshell.exe 作為預設殼層會導致使用者登入后出現空白畫面。 - 您無法使用通用 Windows 應用程式作為自訂殼層。
- 您無法使用自定義殼層來啟動通用 Windows 應用程式,例如設定應用程式。
- 您無法使用啟動不同進程並結束為自訂殼層的應用程式。 例如,您無法在Shell Launcher 中指定 write.exe 。 殼層啟動程式會啟動自訂殼層,並且監視處理程序,以識別自訂殼層何時結束。 Write.exe 建立 32 位元 wordpad.exe 處理程序並結束。 由於Shell Launcher不知道新建立的 wordpad.exe 程式,因此Shell Launcher會根據 Write.exe的結束代碼採取動作,然後重新啟動自定義殼層。
- 您無法防止系統關閉。 針對 Shell Launcher V1 和 V2,您無法在圖形化應用程式中接收WM_QUERYENDSESSION訊息時傳回 FALSE,或在控制台應用程式中透過 SetConsoleCtrlHandler 函式新增的處理程式例程中傳回 FALSE,以封鎖會話結束。
注意
您無法在同一個系統上設定殼層啟動器和指派的存取權。
使用 Shell Launcher V2,您可以將通用 Windows 應用程式指定為自定義殼層。 如需Shell Launcher v1 與Shell Launcher V2之間的差異,請參閱使用殼層啟動器建立 Windows 10 kiosk。
殼層啟動器會在啟動自定義殼層之前處理 Run 和 RunOnce 登錄機碼,因此您的自定義殼層不需要處理自動啟動其他應用程式和服務。
殼層啟動器也會在自定義殼層結束時處理系統的行為。 如果預設行為不符合您的需求,您可以設定殼層結束行為。
除了使用 Shell Launcher,例如、群組原則、AppLocker和 Mobile 裝置管理,還可以使用控制其他傳統型應用程式和系統元件存取的方法
注意
在殼層啟動器 v1 中,Windows 10 提供,您只能指定 Windows 傳統型應用程式作為取代殼層。 在殼層啟動器 v2 中,Windows 10 版本 1809 和更新版本中提供,您也可以指定 UWP 應用程式作為取代殼層。
若要在 1809 版中使用 Shell Launcher v2,您必須安裝 KB4551853更新。
Shell Launcher v1 與 Shell Launcher v2 之間的差異
Shell Launcher v1 會將 默認殼層 取代 explorer.exe
為 eshell.exe
,這可以啟動 Windows 傳統型應用程式。
Shell Launcher v2 會explorer.exe
customshellhost.exe
以 取代 。 這個新的可執行檔可以啟動 Windows 傳統型應用程式或 UWP 應用程式。
除了可讓您針對取代殼層使用UWP應用程式之外,Shell Launcher v2 還提供更多增強功能:
- 您可以使用自定義的 Windows 傳統型應用程式,然後啟動 UWP 應用程式,例如設定和觸控式鍵盤。
- 您可以從自定義 UWP 殼層啟動次要檢視,並在多個監視器上執行。
- 自訂殼層應用程式會以全螢幕執行,並可依使用者需求以全螢幕執行其他應用程式。 如需不同應用程式組合的 XML 組態範例,請參閱 Shell Launcher v2 的範例。
需求
Windows 10 企業版 或 Windows 10 教育版。
詞彙
- 開啟,啟用: 讓設定可供裝置使用,並選擇性地將設定套用至裝置。
- 配置: 自訂設定或子設定。
- 內嵌殼層啟動器:此功能在 Windows 10 1511 版中稱為內嵌殼層啟動器。
- 自訂殼層啟動器:此功能在 Windows 10 1607 版和更新版本中稱為 Shell Launcher。
開啟殼層啟動器
Shell Launcher 是選擇性元件,預設不會在 Windows 10 中開啟。 它必須在設定之前開啟。 Microsoft 如果尚未安裝 windows,您可以在自定義 Windows 10 映射 (.wim) 中開啟和設定 Shell Launcher。 如果已安裝 Windows,您必須先開啟 Shell Launcher,再套用布建套件來設定 Shell Launcher。
使用 控制台 啟用殼層啟動器
- 在 [ 搜尋 Web 和 Windows ] 字段中,輸入 [程式和功能] ,然後按 Enter 鍵或點選或選取 [程式和功能 ] 加以開啟。
- 在 [ 程式和功能] 視窗中,選取 [ 開啟或關閉 Windows 功能]。
- 在 [ Windows 功能] 視窗中,展開 [ 裝置鎖定 ] 節點,選取或清除 Shell Launcher 的複選框,然後選取 [ 確定]。
- [Windows 功能] 視窗指出 Windows 正在搜尋必要的檔案,並顯示進度列。 找到之後,視窗會指出 Windows 正在套用變更。 完成時,視窗會指出要求的變更已完成。
- 選取 [關閉 ] 以關閉 [Windows 功能] 視窗。
注意
開啟殼層啟動器不需要重新啟動裝置。
藉由呼叫 WESL_UserSetting 啟用殼層啟動器
- 在 Windows Management Instrumentation (WMI) 類別WESL_UserSetting中呼叫 WESL_UserSetting.SetEnabled 函式,以啟用或停用 Shell Launcher。
- 如果您使用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 布建設定使用,因此您可以設定要在映像運行時間期間套用的這些設定。 您可以使用 Windows 組態 Designer 建立布建套件,然後在映像部署時間或運行時間套用布建套件,來設定一或所有 Shell 啟動器設定。 如果尚未安裝 Windows,而且您使用 Windows 組態 Designer 建立具有映射中所含 Shell Launcher 設定的安裝媒體,或是在安裝期間套用布建套件,您必須在安裝媒體上使用 DISM 啟用 Shell Launcher,才能成功套用布建套件。
使用下列步驟來建立包含ShellLauncher設定的布建套件。
- 遵循建立 Windows 10 布建套件中的指示,在 Windows 組態 Designer 中建置布建套件。
- 在 [ 可用的自定義 ] 頁面中,選取 [ 運行時間設定>SMISettings>ShellLauncher]。
- 將 [ 啟用] 的值設定為 ENABLE。 更多設定 Shell Launcher 的選項隨即出現,您可以視需要設定值。
- 完成設定並建立布建套件之後,您可以將套件套用至映射部署時間或運行時間。 如需詳細資訊,請參閱 套用布建套件 。 將套件套用至 Windows 10 企業版 映像的程式相同。
設定殼層啟動程式
有兩種方式可以設定Shell Launcher:
- 在 Windows 10 1803 版中,您可以使用指派存取權設定服務提供者 (CSP) 的 ShellLauncher 節點來設定 Shell Launcher。 如需詳細資訊,請參閱 AssignedAccess CSP 。 如果裝置支援,使用此方法設定Shell Launcher也會自動在裝置上啟用Shell Launcher。
- 直接在 PowerShell 腳本或應用程式中使用 Shell Launcher WMI 提供者。
您可以為 Shell Launcher 設定下列選項:
- 啟用或停用殼層啟動器。
- 指定特定使用者或群組的殼層組態。
- 拿掉特定使用者或群組的殼層組態。
- 變更預設殼層設定。
- 取得特定使用者或群組的殼層設定相關信息。
在使用者登入之前,任何變更不會生效。
針對不同的用戶帳戶啟動不同的殼層
根據預設,Shell Launcher 會執行預設殼層,這是當您在設計時間建立 OS 映射時所指定。 默認殼層會設定為 Cmd.exe,但您可以將任何可執行檔指定為預設殼層。
如果您不想執行預設殼層,您可以設定 Shell Launcher 為特定使用者或群組啟動不同的殼層。 例如,您可以將裝置設定為執行客體帳戶的自定義應用程式殼層,但針對系統管理員帳戶執行標準 Windows 檔案總管殼層,以服務裝置。
如果您在運行時間使用 WMI 提供者為使用者或群組設定 Shell Launcher,則必須使用該使用者或群組的安全標識碼 (SID) ;您無法使用使用者名稱或群組名稱。
如需常見安全標識碼的詳細資訊,請參閱 已知的 SID。
當目前登入的帳戶屬於針對每個群組定義了不同組態的兩個或多個群組時,Shell Launcher 會使用它找到的第一個組態。 搜尋順序未定義,因此建議您避免將使用者指派給具有不同 Shell Launcher 設定的多個群組。
在殼層結束時執行動作
當自定義殼層結束時,Shell Launcher 可以執行四個動作的其中一個:
動作 | 說明 |
---|---|
0 | 重新啟動殼層。 |
1 | 重新開機裝置。 |
2 | 關閉裝置。 |
3 | 什麼也不做。 |
重要
請確定您的殼層應用程式不會自動結束,也不會由對話框篩選器等任何功能自動關閉,因為除非傳回碼動作設定為不執行任何動作,否則這可能會導致結束和重新啟動的無限迴圈。
默認傳回碼動作
您可以使用 DefaultReturnCodeAction 設定來定義 Shell Launcher 的預設傳回碼動作。 如果您未變更初始值,預設傳回碼動作會設定為0 (零) ,這表示殼層啟動器會在殼層結束時重新啟動殼層。
將結束代碼對應至 Shell 啟動器動作
殼層啟動器可以根據殼層傳回的結束代碼來採取特定動作。 對於殼層所傳回的任何指定結束代碼,您可以藉由將該結束代碼對應至其中一個殼層結束動作,來設定Shell Launcher所採取的動作。
如果結束代碼不符合定義的值,Shell Launcher 會執行預設傳回碼動作。
例如,您的殼層可能會傳回 -1、0、1 或 255 的結束代碼值,視殼層的結束方式而定。 您可以將 Shell Launcher 設定為:
- 當殼層傳回值為 -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
注意
先前的腳本包含多個組態選項的範例,包括移除自定義殼層和停用殼層啟動器。 它不適合以原樣執行。
殼層啟動器用戶權力
自訂殼層會以登入帳戶的相同等級權限啟動。 這表示具有系統管理員許可權的使用者可以執行任何需要系統管理員許可權的系統動作,包括以系統管理員許可權啟動其他應用程式,而沒有系統管理員許可權的使用者則無法執行。
警告
如果您的殼層應用程式需要系統管理員許可權且需要提高許可權,且裝置上有用戶帳戶控制 (UAC) ,您必須停用 UAC,Shell Launcher 才能啟動殼層應用程式。