关于 window 的 uwp 应用本地回环限制以及限制解除方案
1. uwp 应用默认禁止本地回环
uwp 应用在默认的情况下,禁止访问本地的 localhost(这被称做本地回环 loopback)。
然而我们在开发、调试、正向代理等场景下,又不得不让 uwp 突破这一个限制。
2. 官方限制解除工具 checknetisolation.exe
这个工具位于 c:/windows/system32/checknetisolation.exe
,它的功能为解除 uwp 的本地 loopback 限制或者调试应用(本文仅介绍解除 loopback 限制)。
./checknetisolation.exe loopbackexempt [operation] [-n=] [-p=]
常见用法:
-s
: 查看已经取得 loopback 豁免的应用列表-a -p=[app container sid] or -a -n=[app container name]
: 添加应用豁免-d -p=[app container sid] or -d -n=[app container name]
: 移除应用豁免-c
: 移除所有安装的应用的豁免
3. 如何获取所有安装应用的 sid
在注册表目录 hkcu\software\classes\local settings\software\microsoft\windows\currentversion\appcontainer\mappings
即可取得所有 app 的 sid 列表。
通过结合 cmd 或者 pwsh 的循环命令,即可自动化为所有已安装应用添加豁免:
cmd 命令:
for /f "tokens=11 delims=\" %p in ('reg query "hkcu\software\classes\local settings\software\microsoft\windows\currentversion\appcontainer\mappings"') do checknetisolation.exe loopbackexempt -a -p=%p
powershell 命令:
get-childitem -path registry::"hkcu\software\classes\local settings\software\microsoft\windows\currentversion\appcontainer\mappings\" -name | foreach-object {checknetisolation.exe loopbackexempt -a -p="$_"}
new powershell core:
(get-appxpackage -allusers).packagefamilyname | foreach-object {checknetisolation.exe loopbackexempt -a -n="$_"}
4. 其他便捷工具以及深层次分析
来自 fiddler 的 enable loopback utility 或开源项目 loopback exemption manager 的这两个工具提供了很方便的图形化方式来对安装的 uwp 应用进行 loopback 豁免。
深入研究后者工具以及类似工具的源代码,并参考作者提到的:
我们可以知道,开源工具的作者从 fiddler 那里借鉴了 p/invokes 的方式获取 api,而所 invoke 的 api 主要来自于 firewallapi.dll
,这个 dll 提供了很多与 uwp loopback 豁免相关的实用方法。
我们继续使用 vs2022 的 dev shell 对官方的 checknetisolation.exe
进行 dll 依赖分析(需要安装 vs 2022):
到这里我们便可以得知,无论是官方工具还是第三方工具的实现,都是调用 firewallapi.dll
提供的 api 来进行 loopback 豁免的。
发表评论