在 Windows 8 中,我們?nèi)乱肓?WinRT 平臺(tái),帶給用戶包含動(dòng)態(tài)磁貼和沉浸式用戶體驗(yàn)的 Modern Apps。
![](/d/20211018/7b78a11227b8ec0d960f1788133d2a4a.gif)
如果您是企業(yè)用戶,有公司的代理服務(wù)器環(huán)境,或者您是開發(fā)人員,相信您已經(jīng)發(fā)現(xiàn)了在本地連接更換代理后,所有 Modern Apps 都不再能訪問網(wǎng)絡(luò)。這是由于新的 WinRT 運(yùn)行時(shí)的網(wǎng)絡(luò)隔離設(shè)計(jì)造成的。
為了實(shí)施新的安全性策略,讓 WinRT 平臺(tái)上的應(yīng)用更加安全,Modern Apps 在使用某項(xiàng)功能時(shí),必須事先由開發(fā)者聲明。例如要使用網(wǎng)絡(luò)連接,就需要聲明,不僅要聲明需要網(wǎng)絡(luò)連接,還得聲明清楚需要哪一種類型的連接方式。由于實(shí)施了網(wǎng)絡(luò)隔離,所有的 Modern Apps 默認(rèn)就不能使用IP環(huán)回地址進(jìn)行進(jìn)程間通信。當(dāng)我們?cè)?Internet 設(shè)置的連接設(shè)置里,為 LAN 指定了代理服務(wù)器之后,Modern Apps 也就不能上網(wǎng)了,此時(shí)只有桌面版的應(yīng)用程序才能通過代理服務(wù)器上網(wǎng)。(WinRT 有一定的能力能夠檢測(cè)到本地網(wǎng)絡(luò)的默認(rèn)代理服務(wù)器從而使 Modern Apps 訪問 Internet,但像手動(dòng)指定了 LAN 代理后,它就不能自動(dòng)檢測(cè)到了。)
有時(shí)候,當(dāng)公司里面的默認(rèn)網(wǎng)絡(luò)代理服務(wù)器不工作時(shí),IT 管理員可能會(huì)要求用戶手動(dòng)指定另外的 LAN 代理服務(wù)器,此時(shí), Modern Apps 都不能上網(wǎng)了,著實(shí)郁悶,其實(shí),我們有兩種辦法解除網(wǎng)絡(luò)隔離的限制,讓 Modern Apps 在特殊時(shí)期也能上網(wǎng):
法一:使用組策略為網(wǎng)絡(luò)隔離環(huán)境指定 Internet 代理
打開本地組策略編輯器,展開"計(jì)算機(jī)配置"-"管理模版"-"網(wǎng)絡(luò)"-"網(wǎng)絡(luò)隔離",我們可以看見如下幾個(gè)設(shè)置項(xiàng):
![](/d/20211018/c8c56c41f51c50006a62eae03b831340.gif)
我們可以編輯"應(yīng)用的 Internet 代理服務(wù)器",來指定一個(gè) Internet 代理。注意,這里指定的代理得與你在桌面IE選項(xiàng)的連接設(shè)置里指定的LAN代理一致,這樣 Modern Apps 才能具備訪問互聯(lián)網(wǎng)的基礎(chǔ)。沒錯(cuò),這只是個(gè)基礎(chǔ),因?yàn)?,僅指定這一項(xiàng)的話,你添加的代理與系統(tǒng)檢測(cè)到的代理是一個(gè)并集,由于自動(dòng)檢測(cè)的優(yōu)先,而在桌面指定了 LAN 代理后,自動(dòng)檢測(cè)的代理與手動(dòng)指定的 LAN 代理不一致,結(jié)果還是不能上網(wǎng)。所以為了 Modern Apps 能上網(wǎng),我們還需啟用"代理定義權(quán)威"這一項(xiàng),讓 Modern Apps 只使用這里指定的代理。
法二:使用 Win8 內(nèi)置的調(diào)試命令集為具體 App 添加網(wǎng)絡(luò)隔離排除
Windows 8 內(nèi)置了一個(gè)命令行工具,是為了方便 Modern Apps 開發(fā)者診斷網(wǎng)絡(luò)問題的。我們可以利用它來把某些 Modern Apps 添加到網(wǎng)絡(luò)隔離排除列表:
![](/d/20211018/ec0a9c585e9203c34f881cb349a18e99.gif)
這里我們使用其中的 LoopbackExempt 參數(shù)即可實(shí)現(xiàn)我們的需求。對(duì)于這個(gè)參數(shù),它的使用還有具體的二級(jí)參數(shù)需要指定。
![](/d/20211018/6534901a1b23f03253dd4c843e349a88.gif)
程序幫助說的很明確了,因此這里不再列表贅述。這里,我想提醒大家的是,由于 AppContainer 或者程序包的 SID 較難尋找(需要借助注冊(cè)表),我個(gè)人建議大家使用 –n=[Name] 的方式來通過 AppContainer 或者程序包名來操作網(wǎng)絡(luò)隔離豁免。因?yàn)楂@取名稱的方式很簡(jiǎn)單,只要你打開 %LocalAppData%\Packages 路徑,下面的各個(gè)文件夾的名稱就是各個(gè) Modern Apps 的名稱,可供使用, 方便復(fù)制粘貼。
![](/d/20211018/bfcd99d76ca0bb68af77db76529bfe5a.gif)
從圖中可以看出,識(shí)別這些 App 究竟對(duì)應(yīng)開始屏幕里面哪個(gè) Modern App 其實(shí)并不難,因?yàn)槲募A的部分就是該程序的名稱。例如我們可以看見最后一個(gè),"WinStore_cw5n1h2txyewy",它無疑就是"應(yīng)用商店"這個(gè)應(yīng)用的內(nèi)部名稱。
這里,我們假設(shè)現(xiàn)在默認(rèn)的代理服務(wù)器壞了,我在桌面環(huán)境設(shè)置了 LAN 代理,這時(shí),我需要使用應(yīng)用商店更新我的幾個(gè)應(yīng)用程序,那么,我就要為它添加網(wǎng)絡(luò)隔離豁免了:執(zhí)行"CheckNetIsolation.exe LoopbackExempt -a -n=WinStore_cw5n1h2txyewy",便將應(yīng)用商店添加到豁免列表了。
要驗(yàn)證豁免列表,我們使用"CheckNetIsolation.exe LoopbackExempt -a -s"命令即可:
![](/d/20211018/28b1d8763034ff11e0aede4222a6fbb8.gif)
要?jiǎng)h除某個(gè)豁免,將添加豁免的命令中的 -a 參數(shù)換為 -d 即可,要快速全部清除列表內(nèi)容,執(zhí)行"CheckNetIsolation.exe LoopbackExempt -c"。
比較以上兩種辦法,我個(gè)人還是建議大家使用第二種辦法。原因有兩個(gè):
其一,組策略法中,無法為隔離網(wǎng)絡(luò)指定代理服務(wù)器的代理端口,所以,使用非80口的應(yīng)用可能還是不能正常工作。例如,應(yīng)用商店在這樣設(shè)置時(shí),只能瀏覽應(yīng)用,無法更新軟件和下載軟件。
其二,使用 CheckNetIsolation 可以方便地控制和查閱豁免情況,而且,沒有什么端口的限制,程序功能完全正常。而且,對(duì)于 IT 專業(yè)人士而言,這個(gè)可以集成到代碼中去,并且代碼可復(fù)用,可自動(dòng)化控制。
而在第二種方式里面,建議大家使用 -n=[AppName] 的形式添加刪除豁免比使用 -p=[AppSID] 不僅要好在上面提到過的便捷性,而且,像 Store 這樣的特殊 Modern App,它在注冊(cè)表的 HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings 下面根本就沒有對(duì)應(yīng)的 SID 顯示出來。在上面通過名稱添加 Store 豁免,并且查閱豁免列表后,我們發(fā)現(xiàn) Store 的 SID=S-1-15-2-2608634532-1453884237-1118350049-1925931850-670756941-1603938316-3764965493.