2 回答

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

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