【问题标题】:How can I allow a windows forms app to restart a windows service regardless of permissions?无论权限如何,如何允许 Windows 窗体应用程序重新启动 Windows 服务?
【发布时间】:2012-03-20 20:04:25
【问题描述】:

我正在处理的当前应用程序的设计调用了 WCF 服务,该服务托管在 Windows 服务中,该服务提取数据并将其存储在硬盘驱动器上。它与将与 WCF 服务交互的 Windows 窗体应用程序配对。其中一项要求是最终用户能够通过 Forms 应用重新启动 Windows 服务。

所以,我猜这可以使用 ServiceController 类来完成……但是权限呢?我认为我们不能(或不应该)保证 Windows 应用程序以管理员身份运行,并且该服务作为网络服务运行。

我所看到的唯一合理地似乎涵盖了这种情况的是正在运行另一个 Windows 服务,然后可以将其安装在具有更高权限的帐户下,您可以调用该帐户来重新启动目标服务。

但我不想给项目增加那么多复杂性,尤其是因为它应该在上周处于测试阶段。

那么有没有一种方法可以让表单应用程序获得必要的权限来重新启动它的特定配套服务?

我们可能会提出后续问题,以便服务在服务器上运行,而不是与应用程序在同一台机器上运行。这是否会使允许表单应用程序重新启动服务变得不切实际?如果是这样,我可能会主张削减功能......

哦,注意目标平台是 WinXP 和 Win7 with .NET4。

【问题讨论】:

    标签: winforms .net-4.0 permissions windows-services uac


    【解决方案1】:

    您可以为要启动和停止的服务分配权限,而不是授予应用程序权限。

    每个 Windows 服务都有一个安全描述符,该描述符被分配了允许您在服务上执行的权限。默认情况下,经过身份验证的用户有权读取服务状态,管理员可以控制和删除服务。

    您可以使用命令sc sdset <serviceName> 设置服务安全描述符。例如,此命令将允许任何用户控制服务(但仅允许管理员和本地系统删除服务或更改服务的安全性):

    sd sdset <myservice> "D:(A;;CCLCSWRPWPDTLOCRSDRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)"

    如果您只想允许使用特定帐户来控制服务,您可能需要稍微调整安全描述符。只要远程帐户由机器验证,这也可以远程工作。

    【讨论】:

    【解决方案2】:

    让服务自行重启如何?它可以公开一个方法,Restart(string userId, string password) 或类似的东西。

    在被授权用户调用时,它可以使用answer 中概述的方法。那就是:

    1. 将服务设置为在失败时重新启动
    2. 致电Environment.Exit(1)
    3. 操作系统会为您重新启动服务。

    如果不想重新启动,您可以致电 Environment.Exit(0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多