为了账号安全,请及时绑定邮箱和手机立即绑定

启动时如何为Windows服务获得临时管理员权限窗口

启动时如何为Windows服务获得临时管理员权限窗口

C#
桃花长相依 2022-11-21 16:01:11
这个问题已经关闭 [ Dropping process rights under windows ] 但它已经很老了,而且解决方案并不完全匹配。我希望找到一个现代的答案,一个可以直接与 C# 和 .Net Framework 的 BCL 一起工作的答案。我有作为 Windows 服务运行的软件,它在启动时需要管理员权限,但在服务的剩余生命周期内不需要这些权限。在不断追求良好安全性的过程中,我只是觉得这是操作系统应该提供给用户级软件的一个特性。应支持降级安全性,以便软件可以以最低权限运行并减少安全问题的可能性。当然,作为控制台应用程序,可以在没有管理员权限的情况下生成第二个进程,但对于服务,我可能需要有两个服务。我希望在一个单一的操作过程中有一种方法,如果不是现在,也许在未来
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

虽然在当今的 Windows 中不可能在单个进程中完成,但两种服务方法可能是完成所需任务的最佳备用选项。

选项

  1. 降级单个 Windows 进程 - 今天不可能

  2. AppDomain 沙盒——并不完美,因为您仍然有一个以提升的权限运行的主应用程序域。提升的权利不会消失。

  3. 两项服务- 迄今为止最好的选择

  4. 其他沙箱——除了 AppDomain 沙箱之外,可能存在其他沙箱解决方案,但它们可能都具有相同的优缺点——它们仍然有一个主域在具有提升权限的单个进程中运行。


两项服务

以下是它作为两种服务的解决方法的工作方式。

两个服务的设置:

  • 服务 1 - 启动模式。在 Windows 启动时运行。拥有系统权限。做它需要做的事情,然后开始Service 2,然后自行停止。

  • 服务 2 - 持续模式。由 启动Service 1,并且具有非常有限的权限(可能是网络服务)。

这两种服务都可以使用 MSI 安装一次。

背景

有两种方法可以使整个解决方案具有两种操作模式 - 启动和持续:

  1. 一个程序可以使用不同的命令行参数以两种模式运行;或者

  2. 可能有两个独立的 EXE 程序。

此外,startup程序可能需要向ongoing其中发送状态信息,有多种方法可以做到这一点(可以通过内存 IPC 通道、本地主机 TCP 等)。https://capnproto.org/是一个很好的 IPC 通道通信选项。


应用程序域

您可以使用 AppDomains 创建信任度较低的沙箱。

AppDomains 是 .Net Framework 的基本组成部分。您可以将 .Net 程序的另一个副本加载到第二个 AppDomain 中。AppDomains 实际上提供了更多的安全控制。例如,您可以限制和启用网络连接。

唯一的缺点是该过程总体上仍将受管理员信任。因此,理想情况下,您将拥有两个完全独立的 .exe 程序。一个是具有执行受信任工作的代码的一个,另一个具有内置在清单中并由供应商签名的低信任设置。如果拥有一个可以由低信任用户运行的低信任程序,您将获得额外的好处。

注意:在 DotNetCore 中没有 AppDomain——它们有不同的方法可以加载和卸载“程序集”,但您需要注意不要引用引用程序集中的任何对象。


查看完整回答
反对 回复 2022-11-21
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

对于配置文件,您可以让安装程序创建一个 config 子目录并打开其权限,以便该服务对其具有写入权限。对于更新部分,最好不要让 MSI 安装一堆文件,然后让应用程序在带外自行更新。从安装程序的角度来看,这是违反关注点分离的行为。如果你必须这样做,我建议在它自己的文件夹中安装更新的位(也由安装程序授予权限)并使用运行时 IoC/DI 的某个时间来使用这些文件而不是安装程序安装的文件。

还有一些方法可以创建 MSI,这样它就可以在不需要管理员权限的情况下进行升级。

否则两种服务也是可能的。一个管理升级/配置故事,另一个进行业务处理。一些第三方框架可以应对这种情况。我知道如何编写这些,但出于安全/责任方面的考虑,我选择不在我的咨询中使用它们。

最近,一家中国公司因一项驱动程序/服务(我记得)而上了新闻,该驱动程序/服务可能会被利用来接管机器。我永远不想成为促进这种情况发生的人。


查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 257 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信