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 关注
- 257 浏览
添加回答
举报