殼層啟動程式

您可以使用殼層啟動器,將預設Windows 10殼層取代為自訂殼層。 您幾乎可以使用任何應用程式或可執行檔作為自訂殼層,例如命令視窗或自訂專用應用程式。

您也可以設定殼層啟動器,以針對不同的使用者或使用者群組啟動不同的殼層應用程式。

您可以使用作為自訂殼層的應用程式和可執行檔有一些例外狀況:

  • 您無法使用下列可執行檔作為自訂殼層: 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 啟動器也會在自訂殼層結束時處理系統的行為。 若預設行為無法滿足您的需求,您可以自行設定殼層結束行為。

規格需求

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

詞彙

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

開啟殼層啟動器

Shell 啟動器是選擇性元件,預設不會在 Windows 10 中開啟。 必須先開啟它,才能進行設定。 如果尚未安裝 Microsoft Windows,您可以在自訂的 Windows 10 映射 (.wi) m 中開啟並設定殼層啟動器。 如果已安裝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 組態設計工具啟用殼層啟動器

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

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

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

設定殼層啟動程式

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

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

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

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

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

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

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

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

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

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

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

當殼層結束時執行動作

當自訂殼層結束時,Shell 啟動器可以執行四個動作的其中一個:

動作 描述
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,殼層啟動器才能啟動殼層應用程式。

無廠牌開機

自訂登入