启动没有高程的Windows服务

Be.*_*St. 5 service elevated-privileges

我有一个Windows服务"Service1"配置为登录为"本地服务".

我构建了一个控制台应用程序来以编程方式启动它

        var service = new ServiceController("Service1");
        service.Start();
Run Code Online (Sandbox Code Playgroud)

我知道如果我从管理员命令提示符运行ConsoleApplication1它会顺利启动.

如果我在没有抬高的情况下运行它,我得到一个:

发生了系统错误5.

访问被拒绝.

但是,我需要在没有提升的情况下启动它.

是否可能,或者我必须改变实现这一目标的方式?

Bil*_*art 10

您可以为服务本身设置ACL以允许此操作.所述SetACL.exe实用程序使得该(有点)简单; 例如:

SetACL.exe -on "MyService" -ot srv -actn ace -ace "n:S-1-5-32-545;p:start_stop"
Run Code Online (Sandbox Code Playgroud)

这允许Users组的成员(S-1-5-32-545)启动和停止MyService.


Be.*_*St. 5

我关注了 torak链接,我了解了有关服务权利的关键区别:

  • 服务拥有与“运行身份”用户相关的权限
  • 服务具有不同的权限来控制服务(即启动/停止它)

因此,要启动服务,我需要修改服务控制权限。

好吧,我已经做了一个名为 Service1 的 Windows 服务,并使用 WIX 制作了一个安装程序。在设置过程中我调用ServiceInstall

      <ServiceInstall Id="ServiceInstaller" Type="ownProcess" Vital="yes"
       Name="Service1" DisplayName="Service1"
       Description="Service1 description"Start="demand"
       Account="NT AUTHORITY\LocalService"
       ErrorControl="ignore" Interactive="no" >
      </ServiceInstall>
Run Code Online (Sandbox Code Playgroud)

然后我有一个名为 TestProgram 的客户端程序,我尝试在其中启动服务:

var service = new ServiceController("Service1");
service.Start();
Run Code Online (Sandbox Code Playgroud)

显然,如果没有提升 TestProgram(在普通用户帐户下运行),它就不会启动服务。

因此,解决方案是指示 WIX 允许用户组的成员(例如)使用PermissionEx标签启动/停止服务:

<util:PermissionEx User="Users" ServiceStart="yes" ServiceStop="yes">
</util:PermissionEx>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。谢谢你们。