2 回答

TA貢獻1847條經(jīng)驗 獲得超7個贊
雖然在當今的 Windows 中不可能在單個進程中完成,但兩種服務(wù)方法可能是完成所需任務(wù)的最佳備用選項。
選項
降級單個 Windows 進程 - 今天不可能
AppDomain 沙盒——并不完美,因為您仍然有一個以提升的權(quán)限運行的主應(yīng)用程序域。提升的權(quán)利不會消失。
兩項服務(wù)- 迄今為止最好的選擇
其他沙箱——除了 AppDomain 沙箱之外,可能存在其他沙箱解決方案,但它們可能都具有相同的優(yōu)缺點——它們?nèi)匀挥幸粋€主域在具有提升權(quán)限的單個進程中運行。
兩項服務(wù)
以下是它作為兩種服務(wù)的解決方法的工作方式。
兩個服務(wù)的設(shè)置:
服務(wù) 1 - 啟動模式。在 Windows 啟動時運行。擁有系統(tǒng)權(quán)限。做它需要做的事情,然后開始
Service 2
,然后自行停止。服務(wù) 2 - 持續(xù)模式。由 啟動
Service 1
,并且具有非常有限的權(quán)限(可能是網(wǎng)絡(luò)服務(wù))。
這兩種服務(wù)都可以使用 MSI 安裝一次。
背景
有兩種方法可以使整個解決方案具有兩種操作模式 - 啟動和持續(xù):
一個程序可以使用不同的命令行參數(shù)以兩種模式運行;或者
可能有兩個獨立的 EXE 程序。
此外,startup
程序可能需要向ongoing
其中發(fā)送狀態(tài)信息,有多種方法可以做到這一點(可以通過內(nèi)存 IPC 通道、本地主機 TCP 等)。https://capnproto.org/是一個很好的 IPC 通道通信選項。
應(yīng)用程序域
您可以使用 AppDomains 創(chuàng)建信任度較低的沙箱。
AppDomains 是 .Net Framework 的基本組成部分。您可以將 .Net 程序的另一個副本加載到第二個 AppDomain 中。AppDomains 實際上提供了更多的安全控制。例如,您可以限制和啟用網(wǎng)絡(luò)連接。
唯一的缺點是該過程總體上仍將受管理員信任。因此,理想情況下,您將擁有兩個完全獨立的 .exe 程序。一個是具有執(zhí)行受信任工作的代碼的一個,另一個具有內(nèi)置在清單中并由供應(yīng)商簽名的低信任設(shè)置。如果擁有一個可以由低信任用戶運行的低信任程序,您將獲得額外的好處。
注意:在 DotNetCore 中沒有 AppDomain——它們有不同的方法可以加載和卸載“程序集”,但您需要注意不要引用引用程序集中的任何對象。

TA貢獻1859條經(jīng)驗 獲得超6個贊
對于配置文件,您可以讓安裝程序創(chuàng)建一個 config 子目錄并打開其權(quán)限,以便該服務(wù)對其具有寫入權(quán)限。對于更新部分,最好不要讓 MSI 安裝一堆文件,然后讓應(yīng)用程序在帶外自行更新。從安裝程序的角度來看,這是違反關(guān)注點分離的行為。如果你必須這樣做,我建議在它自己的文件夾中安裝更新的位(也由安裝程序授予權(quán)限)并使用運行時 IoC/DI 的某個時間來使用這些文件而不是安裝程序安裝的文件。
還有一些方法可以創(chuàng)建 MSI,這樣它就可以在不需要管理員權(quán)限的情況下進行升級。
否則兩種服務(wù)也是可能的。一個管理升級/配置故事,另一個進行業(yè)務(wù)處理。一些第三方框架可以應(yīng)對這種情況。我知道如何編寫這些,但出于安全/責任方面的考慮,我選擇不在我的咨詢中使用它們。
最近,一家中國公司因一項驅(qū)動程序/服務(wù)(我記得)而上了新聞,該驅(qū)動程序/服務(wù)可能會被利用來接管機器。我永遠不想成為促進這種情況發(fā)生的人。
- 2 回答
- 0 關(guān)注
- 294 瀏覽
添加回答
舉報