用信息亭模式固化业务终端 ── Assigned Access・Shell Launcher 的选择方法与运维设计
· Go Komura · 信息亭模式, Assigned Access, Shell Launcher, Windows 11, 业务终端, 设备联动, 信息系统部门, 运维设计
「明明应该是前台终端,客人却从任务栏打开了 Excel」「设备操作画面背后一直在播放 YouTube,触摸屏反应迟钝的投诉原因就出在这里」「展会的演示机,早上过去一看桌面完全暴露,还停在屏幕保护程序的设置界面」── 原本应该专用于特定应用的 Windows 终端,只要放任不管,就一定会被当成「普通的电脑」来用。
常见的对策是「设置自动登录,并把业务应用注册到启动项」,但这其实什么都没守住。Explorer 外壳整体依然活着,无论 Alt+Tab 还是 Win 键,都能一瞬间跳到桌面。话虽如此,Windows 为信息亭用途准备了 Assigned Access・Shell Launcher・多应用信息亭模式等多种机制,而具体能用哪一种,会因版本(Edition)和 Windows 版本号的不同而变化,因此「本来打算在 Pro 终端上搭建,却发现没有 Shell Launcher」这类返工也时常发生。
本文面向想要为前台终端、工厂操作终端、检测设备操作画面、展会终端等构建「只运行一个应用的电脑」的开发者与信息系统部门人员,基于官方文档的依据,梳理各方式的全貌与版本要求、PowerShell/XML 的配置示例,直至自动登录、从异常退出中恢复、Windows Update、维护途径等运维设计。
1. 先说结论
- 「自动登录 + 启动项启动」不是信息亭模式。只要 Explorer 外壳还活着,用户就什么都能做。想要真正防护,就要使用专用机制。
- Assigned Access 的单应用信息亭模式会在锁屏界面之上全屏运行 UWP 应用或 Microsoft Edge,应用被关闭后会自动重新启动。Pro 及以上版本均可使用。1
- 在 Windows 11 上,Assigned Access 也可以把 Win32(桌面)应用做成信息亭模式。在 Windows 11(21H2)及以后新增的架构中,可以在
v4:ClassicAppPath中指定 EXE 的路径。Windows 10 的信息亭模式仅限于 UWP/Edge。2 - Shell Launcher 是把 Explorer.exe 本身替换为业务应用(Win32/UWP)的机制,仅限 Enterprise / Education / IoT Enterprise 系列版本。Pro 无法使用。可以声明式地配置外壳退出时的动作(重启外壳、重启终端等)。34
- 多应用信息亭模式(受限用户体验)是通过允许应用列表与专用开始菜单,构建「只能使用几个指定应用的共享终端」的方式。AppLocker 规则会自动生成,未获许可的应用无法启动。2
- 配置方式正在走向统一。无论是单应用、多应用还是 Shell Launcher,如今的标准做法都是通过 AssignedAccess CSP(Intune 等 MDM),或者在本地通过 WMI 网桥 + PowerShell 调用同一个 CSP 来完成配置。56
- 信息亭体验的默认退出方式是 Ctrl+Alt+Del。在 Windows 11 上可以用
BreakoutSequence更改。请务必在设计中保留维护人员登录的途径。2 - 即使固化了终端,如果业务应用一侧的设计(全屏 UI、不显示退出按钮、异常时自我恢复)没有做到位,仍然会留下漏洞。操作系统的机制与应用的设计是一体的。
2. 全局概览 ── 四种方式的区别在于「能守住什么」
首先把各种方式并排列出来。重要的不是外观,而是Explorer 外壳处于什么状态,以及由谁来阻止未获许可的操作。
| 方式 | 可运行的应用 | 外壳状态 | 能守住的范围 | 版本 |
|---|---|---|---|---|
| 自动登录 + 启动项启动 | 任意 | Explorer 保持原样 | 几乎守不住任何东西(Alt+Tab、Win 键、任务管理器全部畅通无阻) | 全部版本 |
| Assigned Access 单应用信息亭模式 | UWP / Edge(Windows 11 也可用于 Win322) | 在锁屏界面之上仅全屏运行目标应用,关闭后自动重启1 | 无法触及桌面・开始菜单。默认退出方式仅有 Ctrl+Alt+Del | Pro 及以上1 |
| 多应用信息亭模式(受限用户体验) | 允许列表中的应用(可混合 UWP/Win32) | 专用开始菜单 + AppLocker 阻止未获许可的启动2 | 阻止未获许可应用的启动。但 Alt+F4 与 Ctrl+Alt+Del 默认仍然有效7 | Pro 及以上1 |
| Shell Launcher | 把任意 Win32 / UWP 应用作为外壳 | Explorer.exe 本身不存在(由 CustomShellHost.exe 启动并监视业务应用)3 | 没有任务栏也没有开始菜单。但并不阻止其他应用本身的启动,如有需要应并用 AppLocker 等3 | 仅限 Enterprise / Education / IoT Enterprise 系列3 |
各方式的适用场景大致如下。
- 供访客或不特定人员使用的终端(前台、展会、公共浏览)适合单应用信息亭模式,可接触的面最小。
- 使用固定几个应用的共享终端(现场产线终端、教育用途)适合多应用信息亭模式。
- 把单个 Win32 业务应用作为设备操作画面运行的工业用途适合 Shell Launcher。其优势在于 Explorer 相关的 UI(通知、任务栏、边缘滑动弹出的 UI)根本不存在,还可以按退出代码配置恢复动作,这对设备场景很合适。4
- 自动登录 + 启动项虽然可以作为上述方式的组成部分(登录自动化)使用,但其本身并不是信息亭模式。
另外,同一台终端不能同时配置 KioskModeApp(单应用信息亭模式)与 Shell Launcher。2 两者只能二选一。
3. 版本要求 ── Pro 能做到什么,Enterprise 需要什么
在选定方式之前,请先确认手头终端的版本。如果把这一步往后拖,会导致整个设计推倒重来。
- Assigned Access(单应用/多应用):Pro / Enterprise / Education / IoT Enterprise(含各自的 LTSC)。1
- Shell Launcher:Enterprise / Enterprise LTSC / Education / IoT Enterprise / IoT Enterprise LTSC。Pro 不可用。3
- Keyboard Filter(按键屏蔽):仅限 Enterprise / Education / IoT Enterprise 系列。Pro 不可用。8
也就是说,「想在 Pro 终端上只运行一个 Win32 应用」这一常见需求,
- 在 Windows 11 上,可以直接通过 Assigned Access 的
v4:ClassicAppPath实现。2 - 在 Windows 10 Pro 上则没有直接的选项,只能选择 UWP 化,或者用多应用信息亭模式 + 自动启动(
rs5:AutoLaunch)来接近这个效果,或者升级版本。2
如果是在设备内嵌或工业 PC 场景中可以新选定终端,那么 Shell Launcher、Keyboard Filter 一应俱全、又不会被强制推送功能更新的 IoT Enterprise LTSC 才是首选。版本选定的思路,在同日发布的「产业用PC的Windows选择 ── IoT Enterprise LTSC实践指南」中有详细介绍。
还有一个前提是:信息亭体验要求已启用 UAC,并且必须从控制台登录。通过远程桌面连接无法运行信息亭体验。1「想用 RDP 连进去确认一下动作」结果发现完全不工作而困惑,是常见的初次踩坑场景。控制台会话与 RDP 会话的关系,请参见「如何理解 Windows 的会话隔离 ── Session 0・RDP・多用户同时运行」。
4. 用 Assigned Access 构建单应用信息亭模式
配置途径有三种。按照由简到繁的顺序,在 4.1~4.3 中依次介绍;其中最核心的配置 XML,还会继续讲解实际应用到终端的步骤(4.4)以及验证是否生效的方法(4.5)。
4.1 用「设置」应用构建(仅限单台・Edge/UWP 场景下最快捷)
可以通过向导完成信息亭专用本地账户的创建与目标应用的选择。步骤如下。5
- 打开「设置」> 「账户」> 「其他用户」
- 点击「设置信息亭模式」(Set up a kiosk)中的「开始」(Get Started)
- 在「创建账户」对话框中输入账户名,点击「下一步」(如果已有本地标准用户,也可以选择「选择现有账户」)
- 选择在信息亭账户登录时要运行的应用。如果选择了 Microsoft Edge,接下来还需设置以下内容
- 使用全屏显示(数字标牌)模式,还是保留部分浏览器操作(公共浏览器)模式
- 登录时打开的 URL
- 如果选择了公共浏览器模式,设置在持续无操作多长时间后重启 Edge
- 点击「关闭」
完成设置后重启终端,创建好的本地账户会自动登录,并启动指定的应用。5 如果只是单台终端,且是 Edge 或简单的 UWP 应用,这样就足够了。
4.2 用 PowerShell cmdlet 构建(仅限 UWP)
Set-AssignedAccess 可以用一行命令创建「这个本地标准用户只能用这个 UWP 应用」这样的最小配置(仅限 UWP・仅限本地标准用户・不能是管理员账户)。9
# 让本地标准用户 KioskUser 专用于该 UWP 应用
Set-AssignedAccess -UserName 'KioskUser' -AppUserModelId 'Contoso.KenkiPanel_abc123!App'
# 解除配置
Clear-AssignedAccess
传入参数的AUMID(AppUserModelID)可以用 Get-StartApps 查询。这个 cmdlet 会列出已安装应用的名称和 AppID,返回Name 和 AppID 两列。10
# 从列表中肉眼查找
Get-StartApps
# 用名称的一部分筛选(可用通配符)。AppID 列的值就是 AUMID 本身
Get-StartApps -Name '*KenkiPanel*' | Format-Table Name, AppID -AutoSize
输出格式如下(具体值因环境而异)。10
Name AppID
---- -----
KenkiPanel Contoso.KenkiPanel_abc123!App
需要特别注意的是,Get-StartApps 返回的是「当前运行用户」已安装的应用。如果想查询为信息亭账户预置的应用,请用该账户登录后再执行。用管理员账户执行却查不到,是常见的踩坑之处。同时还要注意,UWP 应用更新后 AUMID 有可能发生变化(此时需要重新制作配置)。7
4.3 配置 XML + AssignedAccess CSP(核心方法)
这是涵盖指定 Win32 应用、自动登录、更改退出键在内的核心方法。在 Intune 等 MDM 中通过 ./Vendor/MSFT/AssignedAccess/Configuration 下发;在独立终端上,则通过 WMI 网桥,从 SYSTEM 权限的 PowerShell 中写入同一份 XML。5 XML 的要点如下。
<AssignedAccessConfiguration
xmlns="http://schemas.microsoft.com/AssignedAccess/2017/config"
xmlns:rs5="http://schemas.microsoft.com/AssignedAccess/201810/config"
xmlns:v4="http://schemas.microsoft.com/AssignedAccess/2021/config">
<Profiles>
<Profile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}">
<!-- Windows 11:把 Win32 应用做成信息亭模式(也可以传入参数) -->
<KioskModeApp v4:ClassicAppPath="%ProgramFiles%\Contoso\KenkiPanel.exe"
v4:ClassicAppArguments="--line 3" />
<!-- 把退出键从默认的 Ctrl+Alt+Del 改为其他组合 -->
<v4:BreakoutSequence Key="Ctrl+Alt+K" />
</Profile>
</Profiles>
<Configs>
<Config>
<!-- 由 Windows 创建并管理一个专用的本地标准用户,实现自动登录 -->
<AutoLogonAccount rs5:DisplayName="前台终端" />
<DefaultProfile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}" />
</Config>
</Configs>
</AssignedAccessConfiguration>
如果是 UWP 应用,则在 KioskModeApp 中指定 AppUserModelId(AUMID)。需要注意的是,UWP 应用更新后 AUMID 可能会发生变化,此时需要更新配置。7 另外,信息亭配置文件只能分配给用户,不能分配给组。2
4.4 通过 WMI 网桥实际应用配置
在没有 MDM 的终端上,可以通过MDM 网桥 WMI 提供程序来调用同一个 CSP。这是操作步骤中最容易卡住的环节,因此按顺序详细说明。5
步骤 1:以 SYSTEM 身份启动 PowerShell。设备配置的 WMI 网桥必须在 SYSTEM(LocalSystem)账户下运行。管理员权限的 PowerShell 是不够的。5 官方文档介绍的方法是使用 Sysinternals 的 PsExec。
:: 以管理员身份打开命令提示符,启动一个 SYSTEM 权限的交互式 PowerShell
psexec.exe -i -s powershell.exe
步骤 2:确认启动的 PowerShell 是否为 SYSTEM。不做这一步确认就往下走,结果「没报错却不生效」,是常见的情况。
# 显示为 NT AUTHORITY\SYSTEM 即为正确
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
步骤 3:把 XML 进行 HTML 编码后写入。在该 SYSTEM 权限的 PowerShell 会话中执行。
$assignedAccessConfiguration = @"
<?xml version="1.0" encoding="utf-8"?>
<AssignedAccessConfiguration xmlns="http://schemas.microsoft.com/AssignedAccess/2017/config" xmlns:rs5="http://schemas.microsoft.com/AssignedAccess/201810/config" xmlns:v4="http://schemas.microsoft.com/AssignedAccess/2021/config">
<Profiles>
<Profile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}">
<KioskModeApp v4:ClassicAppPath="%ProgramFiles%\Contoso\KenkiPanel.exe" v4:ClassicAppArguments="--line 3" />
<v4:BreakoutSequence Key="Ctrl+Alt+K" />
</Profile>
</Profiles>
<Configs>
<Config>
<AutoLogonAccount rs5:DisplayName="前台终端" />
<DefaultProfile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}" />
</Config>
</Configs>
</AssignedAccessConfiguration>
"@
$namespaceName = "root\cimv2\mdm\dmmap"
$className = "MDM_AssignedAccess"
$obj = Get-CimInstance -Namespace $namespaceName -ClassName $className
# 不能直接传入 XML,需要先进行 HTML 编码
$obj.Configuration = [System.Net.WebUtility]::HtmlEncode($assignedAccessConfiguration)
Set-CimInstance -CimInstance $obj
步骤 4:重启终端。配置从重启后的登录开始生效。重启后,由 AutoLogonAccount 创建的本地账户会自动登录,并启动指定的应用。5
如需解除配置,同样在 SYSTEM 权限的 PowerShell 中把 Configuration 设为 $null,然后重启。5
$obj = Get-CimInstance -Namespace "root\cimv2\mdm\dmmap" -ClassName "MDM_AssignedAccess"
$obj.Configuration = $null
Set-CimInstance -CimInstance $obj
4.5 如何确认配置是否已生效
为了排查「没报错却不生效」的情况,这里准备三种确认手段。
(a)启用事件日志查看。官方指引的确认位置就是这个通道。7 配置 XML 的校验错误与运行时失败都会显示在这里。
事件查看器
> 应用程序和服务日志
> Microsoft
> Windows
> AssignedAccess
> Operational
默认情况下这个通道可能是禁用的,请先选中该通道,点击右侧窗格的「启用日志」,然后再重现问题。
(b)在注册表中确认已写入的配置。Assigned Access 的配置会记录在以下键中。7
| 键 | 内容 |
|---|---|
HKLM\Software\Microsoft\Windows\AssignedAccessConfiguration |
应用于终端的配置 |
HKLM\Software\Microsoft\Windows\AssignedAccessCsp |
通过 CSP 设置的配置 |
HKCU\SOFTWARE\Microsoft\Windows\AssignedAccessConfiguration |
应用于该用户的配置 |
(c)从 CSP 中读回。写入之后,立刻在同一个 SYSTEM 权限的 PowerShell 中读回,就能当场确认值是否已经写入。
$obj = Get-CimInstance -Namespace "root\cimv2\mdm\dmmap" -ClassName "MDM_AssignedAccess"
$obj.Configuration
# 如果返回的仍是编码状态、不便阅读,可以解码后再肉眼查看
[System.Net.WebUtility]::HtmlDecode($obj.Configuration)
如果这里是空的,说明应用本身失败了;如果已经写入却不生效,就要怀疑 XML 的内容(应用路径、Profile 与 Config 的 GUID 不一致、版本要求)。如果步骤 3 出现错误,请先回到步骤 2 确认 SYSTEM 身份。
5. 用 Shell Launcher 把 Win32 应用做成外壳
如果能使用 Enterprise 系列版本,那么对于像设备操作画面这类「Explorer 的存在本身就是障碍」的终端,Shell Launcher 是最有力的选择。Shell Launcher v2(Windows 10 1809 及以后)用 CustomShellHost.exe 代替 Explorer.exe 来启动并监视业务应用,无论 Win32 还是 UWP 都可以做成外壳。3
配置使用专用的 XML,最大的特点是可以按退出代码分别声明应用退出时的恢复动作。4
<ShellLauncherConfiguration
xmlns="http://schemas.microsoft.com/ShellLauncher/2018/Configuration"
xmlns:V2="http://schemas.microsoft.com/ShellLauncher/2019/Configuration">
<Profiles>
<DefaultProfile>
<!-- 维护人员等未分配配置文件的用户,使用普通的 Explorer -->
<Shell Shell="%SystemRoot%\explorer.exe" />
</DefaultProfile>
<Profile Id="{自己生成的GUID}">
<Shell Shell="%ProgramFiles%\Contoso\KensaPanel.exe" V2:AppType="Desktop"
V2:AllAppsFullScreen="true">
<ReturnCodeActions>
<ReturnCodeAction ReturnCode="0" Action="RestartShell"/> <!-- 正常退出→重启 -->
<ReturnCodeAction ReturnCode="10" Action="RestartDevice"/> <!-- 要求重启终端 -->
</ReturnCodeActions>
<DefaultAction Action="RestartShell"/>
</Shell>
</Profile>
</Profiles>
<Configs>
<Config>
<AutoLogonAccount/> <!-- 自动创建并自动登录本地标准用户「Kiosk」 -->
<Profile Id="{自己生成的GUID}"/>
</Config>
</Configs>
</ShellLauncherConfiguration>
Profile Id 的 GUID 并不是要向某处申请发放的东西。它是你自己生成的、只需在 XML 内保持唯一即可的值,可以用 PowerShell 的 New-Guid 生成。4
# 生成一个带花括号的形式。把这个字符串粘贴到 XML 中
"{$((New-Guid).Guid.ToUpper())}"
请把生成的值以相同的形式(含花括号)同时写入 Profiles 一侧和 Configs 一侧。之所以直接复制上面的示例无法运行,就是因为需要做这个替换。第 4 章 Assigned Access 配置 XML 中出现的 Profile Id / DefaultProfile Id 也是同样性质的值。
动作共有 RestartShell / RestartDevice / ShutdownDevice / DoNothing 四种。如果退出代码没有对应的映射,DefaultAction 也未定义,就会「什么都不发生」,也就是停在黑屏状态。请务必定义 DefaultAction。4 应用方式:使用 MDM 时通过 ./Vendor/MSFT/AssignedAccess/ShellLauncher;本地场景则与 Assigned Access 一样,通过 WMI 网桥把 XML 设置到 MDM_AssignedAccess 的 ShellLauncher 属性中。6 根据环境不同,有时需要事先在「启用或关闭 Windows 功能」中,启用设备锁定功能下的 Shell Launcher 功能(Client-EmbeddedShellLauncher)。
下面列举 Shell Launcher 特有的三个陷阱。3
- 启动另一个进程后自身就退出的应用无法做成外壳。由于 Shell Launcher 监视的是指定进程的退出,如果指定了启动器(launcher)型的 EXE(官方文档中的例子是 write.exe),会立刻被判定为「已退出」。
- 外壳会以登录用户的权限运行。如果把外壳分配给管理员账户,就能以该权限做任何事;如果外壳应用本身要求管理员提权,则必须禁用 UAC 才能启动。应该在此之前就把应用设计成无需提权。
- Shell Launcher 并不阻止其他应用的启动。因为它只是替换外壳,通过业务应用内的文件对话框启动 EXE 之类的路径依然存在。对于不能信任操作者的终端,应并用 AppLocker 或 Keyboard Filter。
6. 运维设计 ── 自动登录・恢复・更新・维护途径
选定方式并完成配置并不是终点。让终端能够无人值守持续运转的设计,才是信息亭模式的核心。
自动登录的首选方案是配置 XML 中的 AutoLogonAccount。由于 Windows 会自行创建并管理专用的本地标准用户,因此不需要保管密码。24 传统的 Winlogon 注册表方式(AutoAdminLogon/DefaultUserName/DefaultPassword)也可以使用,但密码会以明文形式残留。另外,在应用了 EAS 密码限制的终端上,自动登录按规范将无法工作,请确认是否与 MDM 策略发生冲突。7
应用崩溃时的一线恢复交给操作系统处理。Assigned Access 信息亭模式在应用关闭后会自动重启。1 Shell Launcher 则通过 DefaultAction/ReturnCodeActions 配置恢复动作。4 在此基础上,为应对「重启后仍以相同异常持续崩溃」的情况,预先设置夜间定期重启任务可以提高恢复能力(任务的具体做法请参见「任务计划程序的任务不执行、以 0x1 结束 ── 原因排查与安全的运维设计」)。
Windows Update 不应被完全停用,而应控制其时间。官方推荐的配置是:将活动时间对齐营业时间,采用自动下载 + 夜间计划安装,并关闭包括重启警告在内的通知。7 请在真实设备上确认重启后能够自动衔接到「自动登录 → 恢复信息亭模式」这一整条链路。电源设置同理,应把睡眠与关闭显示器的超时都设为 0(禁用),并禁用电源按钮。7 由笔记本电脑改用的终端以及 Modern Standby 机型的行为尤其特殊,请一并确认「睡眠、休眠、Modern Standby 与长时间运行应用 ── 用设计防止「夜里意外停止」」。
键盘与触控方面的漏洞因方式而异。在多应用信息亭模式(受限用户体验)中,Alt+F4・Alt+Tab・Ctrl+Alt+Del 默认不会被屏蔽。7 用来堵住这些漏洞的是 Keyboard Filter,它可以同时抑制物理键盘与屏幕键盘的组合键(用 Dism /online /Enable-Feature /FeatureName:Client-KeyboardFilter 启用,仅限 Enterprise 系列)。8 对于平板类终端,应将 LockDown/AllowEdgeSwipe 策略设为禁用(0),防止从屏幕边缘滑动唤出系统 UI。
确保维护途径与「堵漏洞」同样重要。Assigned Access 信息亭模式的默认退出方式是 Ctrl+Alt+Del(Windows 11 上可以用 BreakoutSequence 更改),然后从那里以管理员账户登录。2 如果用 Keyboard Filter 把 Ctrl+Alt+Del 也屏蔽了,那么 Keyboard Filter 一侧的中断键(默认是连按 5 次左 Windows 键)就成为返回欢迎屏幕的最后一条途径。8 另外,Keyboard Filter 在安全模式下不生效,也可以将管理员账户设为例外。8 信息亭体验本身仅限控制台使用,但可以并用管理员的 RDP 维护,因此保留一条远程途径能减少现场出动的次数。出现问题时,事件日志中的「AssignedAccess > Operational」通道是排查配置错误的一手信息来源。7
7. 业务应用侧的设计与实务定式(判断表)
无论操作系统一侧固化到什么程度,只要应用还是「普通的桌面应用」,就会留下漏洞。下面列举承载在信息亭模式上的应用的设计要求。
- 自行维持全屏・无边框状态。虽然 Shell Launcher 有
V2:AllAppsFullScreen,但基本原则是应用自身要维持最大化・最前置・无标题栏的状态,并在失去焦点时把自己重新置于前台。 - 不显示退出按钮。不在画面上放置关闭手段,而是用只有维护人员知道的隐藏操作(例如按顺序点击屏幕四角 + 输入密码)来唤出维护菜单。只要把退出代码区分开,就可以用 Shell Launcher 的
ReturnCodeActions实现诸如「从维护菜单退出 → 用 DoNothing 恢复到 Explorer」「更新后退出 → 重启终端」这样的联动。4 - 异常时自我恢复。最糟糕的情况是吞掉未处理异常,画面停留在无法操作的状态。应该写入日志后立即终止自身进程,交给操作系统一侧的重启机制(信息亭模式的自动重启・Shell Launcher 的 RestartShell)来处理。
- 防止多重启动。自动重启机制与自身的重启处理叠加时,容易发生重复启动。应事先加入基于 Mutex 的多重启动防止机制(「防止 Windows 应用程序重复启动 ── 命名 Mutex 与重复执行时的窗口前置」)。
- 不要求提权。信息亭账户原则上应为标准用户,在 Shell Launcher 中,如果外壳需要提权,就会被迫禁用 UAC。3 应事先把需要管理员权限的处理分离出来(「在 Windows 应用中把「仅需管理员权限的处理」分离出来的具体写法」)。
最后是判断表。
| 论点 | 选项 | 判断依据 |
|---|---|---|
| 方式选定 | 仅自动登录 / Assigned Access / 多应用 / Shell Launcher | 供不特定人员使用的单应用终端选单应用信息亭模式。使用几个应用的共享终端选多应用。想彻底消除 Explorer 的设备终端选 Shell Launcher(仅限 Enterprise 系列)。仅靠自动登录不可行13 |
| Win32 应用的信息亭化 | Shell Launcher / Windows 11 的 ClassicAppPath / UWP 化 | Windows 11 上 Pro + Assigned Access 即可满足。Windows 10 Pro 需要 UWP 化或多应用 + AutoLaunch,实在不行就更换版本2 |
| 自动登录 | 直接写注册表 / XML 的 AutoLogonAccount | XML 方式可以把账户创建・管理交给 Windows,不会残留明文密码24 |
| 崩溃后的恢复 | 自建监控进程 / 操作系统重启机制 + 定期重启 | 信息亭模式内置自动重启。Shell Launcher 必须定义 DefaultAction。针对连续崩溃,并用夜间重启作为对策14 |
| 屏蔽快捷键 | 不做处理 / Keyboard Filter | 多应用模式下 Alt+F4 等组合键会被放行。Enterprise 系列可用 Keyboard Filter 屏蔽,并保留中断键作为维护途径78 |
| 维护途径 | 全部堵死 / 设计脱出键 + 管理员 RDP | 记录 BreakoutSequence 与中断键,同时确保远程维护途径。「谁都进不去的终端」是事故28 |
8. 总结
- 「自动登录 + 启动项启动」不是信息亭模式。只要 Explorer 还活着就守不住任何东西,因此应该使用 Assigned Access 或 Shell Launcher。
- Assigned Access 在 Pro 及以上版本可用,可以配置单应用信息亭模式(UWP/Edge,Windows 11 上也支持 Win32)以及多应用受限用户体验。
- Shell Launcher 是把 Explorer.exe 替换为业务应用的机制,仅限 Enterprise / Education / IoT Enterprise 系列,可以按退出代码分别声明恢复动作(RestartShell 等)。
- 配置已统一到 AssignedAccess CSP 中,即使没有 MDM,也可以通过 WMI 网桥 + PowerShell(SYSTEM 权限)应用同一份 XML。
- 运维设计的骨架是:通过 AutoLogonAccount 实现自动登录、依靠操作系统重启机制 + 定期重启实现恢复、控制 Windows Update 的时间,以及通过 BreakoutSequence、中断键、远程维护确保脱出途径。
- 最后一道防线是业务应用的设计。只有同时满足维持全屏・不显示退出按钮・异常时自我恢复・防止多重启动・无需提权,「只运行一个应用的电脑」才算真正完成。
相关文章
- 工业用PC应该安装哪种Windows ── Windows IoT Enterprise / LTSC 实践指南
- 防止 Windows 应用程序重复启动 ── 命名 Mutex 与重复执行时的窗口前置
- 如何理解 Windows 的会话隔离 ── Session 0・RDP・多用户同时运行
- 睡眠、休眠、Modern Standby 与长时间运行应用 ── 用设计防止「夜里意外停止」
- 任务计划程序的任务不执行、以 0x1 结束 ── 原因排查与安全的运维设计
- 在 Windows 应用中把「仅需管理员权限的处理」分离出来的具体写法
相关咨询领域
合同会社小村软件承接前台终端・工厂操作终端・检测设备操作画面等信息亭终端的方式选定与配置、能够承受信息亭模式考验的业务应用(全屏 UI・自我恢复・权限分离)设计与开发,以及既有终端的「重新固化」。
参考链接
-
Microsoft Learn,Assigned Access overview。关于 Assigned Access 在 Pro / Enterprise(含 LTSC)/ Education / IoT Enterprise(含 LTSC)上受支持,信息亭体验中 UWP 应用或 Microsoft Edge 会在锁屏界面之上全屏运行、关闭后自动重启,信息亭体验要求启用 UAC 并从控制台登录、不支持远程桌面连接,以及受限用户体验(多应用)的定位。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Learn,Create an Assigned Access configuration file。关于 KioskModeApp 的 AppUserModelId 与 v4:ClassicAppPath / v4:ClassicAppArguments(Windows 11 21H2 架构)、脱出键默认为 Ctrl+Alt+Del、可用 BreakoutSequence 元素更改、AllAppsList 配置会生成 AppLocker 规则、rs5:AutoLaunch、AutoLogonAccount 会创建并管理本地标准用户、KioskModeApp 与 ShellLauncher 不能在同一设备上同时配置,以及信息亭配置文件不能分配给组。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14
-
Microsoft Learn,Shell Launcher overview。关于 Shell Launcher 是把 Explorer.exe 替换为 Win32/UWP 应用的功能,支持的版本为 Enterprise / Enterprise LTSC / Education / IoT Enterprise / IoT Enterprise LTSC,v2 用 CustomShellHost.exe 同时支持 Win32/UWP,其本身不阻止对其他应用的访问、需要并用 AppLocker 等,启动其他进程后自身退出的应用无法做成外壳,以及外壳以登录用户的权限运行、需要提权时必须禁用 UAC。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Learn,Create a Shell Launcher configuration file。关于 ShellLauncherConfiguration XML 的结构(Profiles/Shell/Configs)、Profile Id 的 GUID 只需在 XML 内唯一即可、可用 PowerShell 的 New-Guid 生成,V2:AppType 与 V2:AllAppsFullScreen,退出时的动作共有 RestartShell / RestartDevice / ShutdownDevice / DoNothing 四种,退出代码没有映射且 DefaultAction 也未定义时将什么都不发生、因此应定义 DefaultAction,以及 AutoLogonAccount 会创建并管理本地标准用户「Kiosk」。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
Microsoft Learn,Quickstart: Configure a single-app kiosk with Assigned Access。关于在「设置」应用(账户 > 其他用户 > 设置信息亭模式 > 开始 > 创建账户 > 选择应用 > 关闭)中的配置步骤,通过 AssignedAccess CSP(./Vendor/MSFT/AssignedAccess/Configuration)应用配置,在 SYSTEM 权限的 PowerShell 中使用 WMI 网桥(命名空间 root\cimv2\mdm\dmmap,MDM_AssignedAccess 类的 Configuration 属性)的步骤,设备配置的 WMI 网桥要求以 SYSTEM(LocalSystem)账户运行,可以用 psexec.exe -i -s powershell.exe 进行测试,把 XML 进行 HtmlEncode 后用 Set-CimInstance 设置,配置完成后重启终端会自动登录并启动信息亭应用,以及把 Configuration 设为 $null 并重启的解除方法。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn,Quickstart: Configure a single-app kiosk with Shell Launcher。关于通过 AssignedAccess CSP 的节点(./Vendor/MSFT/AssignedAccess/ShellLauncher)或 WMI 网桥(MDM_AssignedAccess 类的 ShellLauncher 属性)应用 Shell Launcher 的 XML 的步骤及解除方法。 ↩ ↩2
-
Microsoft Learn,Assigned Access recommendations。关于建议把信息亭账户设为权限最小的本地标准用户,通过 Winlogon 注册表设置自动登录,以及在应用了 EAS 密码限制时自动登录将无法工作,Windows Update(活动时间・计划安装・关闭通知)与电源设置的推荐配置,受限用户体验下 Alt+F4・Alt+Tab・Ctrl+Alt+Del 不会被屏蔽,UWP 应用更新可能导致 AUMID 变化,可以在「应用程序和服务日志 > Microsoft > Windows > AssignedAccess > Operational」中启用故障排查用日志,以及配置记录所在的注册表键(HKLM\Software\Microsoft\Windows\AssignedAccessConfiguration、HKLM\Software\Microsoft\Windows\AssignedAccessCsp、HKCU\SOFTWARE\Microsoft\Windows\AssignedAccessConfiguration)。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11
-
Microsoft Learn,Keyboard Filter。关于 Keyboard Filter 可以在物理键盘与屏幕键盘上抑制包括 Ctrl+Alt+Del 在内的组合键,支持的版本为 Enterprise / Education / IoT Enterprise 系列,通过 DISM(Client-KeyboardFilter)启用,可以用中断键(默认为连按 5 次左 Windows 键)返回欢迎屏幕,可对管理员账户设置例外,在安全模式下不生效,以及不支持远程桌面会话。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn,Set-AssignedAccess。关于 Set-AssignedAccess cmdlet 会把指定用户配置为专用于单个应用商店应用(UWP),对象仅限本地标准用户、不能指定管理员或域账户,以及用 Clear-AssignedAccess 解除配置。 ↩
-
Microsoft Learn,Get-StartApps。关于 Get-StartApps 会获取当前用户已安装应用的名称与 AppID(AppUserModelID),可以用 -Name 通过含通配符的名称进行筛选,以及输出对象包含 Name 与 AppID 属性。 ↩ ↩2
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
工业用PC应该安装哪种Windows ── Windows IoT Enterprise / LTSC 实践指南
嵌入设备的PC以10年运行为前提,但普通的Windows 11每年都会推送功能更新,2~3年后支持就会结束。本文基于一手资料,整理Windows IoT Enterprise LTSC的10年支持、版本体系、许可证获取途径以及开发侧需要注意的事项。
Windows的TPM是什么 ── 图解「不外泄密钥的保险柜」与度量启动
用图解说明TPM。整理密钥不外流到芯片外的机制、PCR与度量启动、BitLocker和Windows Hello中的用法、dTPM・fTPM・Pluton的区别、用Get-Tpm确认状态的方法,以及被要求输入恢复密钥时的应对,全部立足于实务视角。
在 Windows 应用中处理 USB 设备的方法 ── 虚拟 COM、HID、WinUSB、专用 SDK 该如何选择
从 Windows 应用控制装置和 USB 设备的方法,按虚拟 COM 端口、HID、WinUSB、供应商 SDK 四种方式进行比较。从是否需要安装驱动程序、多台连接时的识别、拔插追踪,到性能上限,都以实务视角进行梳理。
Windows的时刻同步(w32time)与业务系统 ── 从原理出发解决「日志时间戳对不上」的问题
从 Windows 时间服务(w32time)的原理出发,讲解设备与 PC 之间日志时刻偏差的成因。整理域层级结构与工作组的默认行为、w32tm 命令诊断、高精度时刻与虚拟机的注意事项,直至 Stopwatch 与 UTC 并用的日志设计。
Windows 10 停止支持后的现实解决方案 ── ESU・LTSC・更换设备的判断表
距离2025年10月Windows 10停止支持已过去9个月。围绕企业内残留的Windows 10电脑该如何处理,本文基于附带费用与期限的判断表,梳理Windows 11迁移・ESU・IoT Enterprise LTSC・网络隔离这四个选项,并说明业务应用一侧所需的验证工作。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
常见问题
汇总了咨询这一主题时常见的问题。
- Assigned Access 在 Windows Pro 上也能使用吗?
- 可以使用。Assigned Access(单应用信息亭模式与多应用受限用户体验)在 Pro / Enterprise / Education / IoT Enterprise(分别包含各自的 LTSC)版本上均受支持。另一方面,将 Explorer.exe 本身替换为业务应用的 Shell Launcher 仅限于 Enterprise / Education / IoT Enterprise 系列,Pro 无法使用。此外,信息亭体验要求启用 UAC 并从控制台登录,通过远程桌面连接使用信息亭体验不受支持。
- 要把 Win32(桌面)应用做成信息亭模式,是否必须使用 Shell Launcher?
- 在 Windows 11 上已不再是必须的。Windows 11(21H2 及以后架构)的 Assigned Access 可以通过 KioskModeApp 元素的 v4:ClassicAppPath 属性指定桌面应用的可执行文件路径,即使在 Pro 终端上也能配置 Win32 应用的单应用信息亭模式。而 Windows 10 的 Assigned Access 信息亭模式仅限于 UWP 应用与 Microsoft Edge,因此如果只想运行一个 Win32 应用,现实的解决方案是使用 Shell Launcher(仅限 Enterprise 系列),或者在多应用配置中使用 AutoLaunch。请先确认版本与方式的对应关系,再进行设计。
- 信息亭应用异常退出后会自动恢复吗?
- 行为因方式而异。Assigned Access 的单应用信息亭模式规定:应用被关闭后会自动重新启动。在 Shell Launcher 中,可以通过 DefaultAction 与 ReturnCodeActions 以声明方式配置作为外壳的应用退出时的行为,可从 RestartShell(重启外壳)・RestartDevice(重启终端)・ShutdownDevice・DoNothing 中选择。如果某个退出代码没有对应的动作定义,且也没有 DefaultAction,则什么都不会发生,画面会停在黑屏状态,因此务必要定义 DefaultAction。应用一侧也需要设计成:在出现未处理异常时自行终止,从而衔接到恢复机制。
- 维护人员应该如何以管理员身份登录?
- Assigned Access 的信息亭体验默认可以通过 Ctrl+Alt+Del 退出到登录界面,在 Windows 11 上可以用 BreakoutSequence 元素更改这个组合键。在用 Keyboard Filter 把 Ctrl+Alt+Del 也一并屏蔽的配置中,可以保留 Keyboard Filter 一侧的中断键(默认是连按 5 次左 Windows 键)作为返回欢迎屏幕的途径。信息亭体验本身仅限控制台使用,但可以并用管理员账户的远程桌面维护作为另一个会话。重要的是不要把所有脱身途径都堵死,变成只能靠现场作业才能恢复的终端。
- 把自动登录密码写在注册表里安全吗?
- 不建议这样做。Winlogon 的 AutoAdminLogon 方式会让 DefaultPassword 以明文形式残留在注册表中。Assigned Access 与 Shell Launcher 的配置 XML 中都有 AutoLogonAccount 元素,使用它可以让 Windows 自行创建和管理一个专用的本地标准用户并自动登录,因此不需要自己保管密码。原则上,信息亭账户应设为权限最小的本地标准用户,避免挪用域账户。另外还需注意,在应用了 Exchange ActiveSync 密码限制策略的终端上,自动登录将无法工作。