启动没有高程的Windows服务

问题描述 投票:4回答:5

我有一个Windows服务“Service1”配置为登录为“本地服务”。

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

        var service = new ServiceController("Service1");
        service.Start();

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

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

发生了系统错误5。

访问被拒绝。

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

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

service elevated-privileges
5个回答
9
投票

您可以为服务本身设置ACL以允许此操作。 SetACL.exe utility使这(有点)直截了当;例如。:

SetACL.exe -on "MyService" -ot srv -actn ace -ace "n:S-1-5-32-545;p:start_stop"

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


2
投票

我跟着torak link,我理解这个关于服务权利的关键区别:

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

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

好吧,我做了一个名为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>

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

var service = new ServiceController("Service1");
service.Start();

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

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

<util:PermissionEx User="Users" ServiceStart="yes" ServiceStop="yes">
</util:PermissionEx>

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


2
投票

如果我可以加2美分,这是我的解决方案,不需要任何复杂的App.Manifest或Windows服务修改。

这个概念只是通过一个提升的过程来调用“Net Start”:

public string StartServiceViaProcess(string param_strServiceName)
    {
        try
        {
            const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.

            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.FileName = "cmd.exe";
            startInfo.Verb = "runas";
            startInfo.UseShellExecute = true;
            startInfo.Arguments = "/C net start " + param_strServiceName;
            process.StartInfo = startInfo;
            try
            {
                Process.Start(startInfo);
            }
            catch (Win32Exception ex)
            {
                if (ex.NativeErrorCode == ERROR_CANCELLED)
                    return "L'usager a annulé la demande d'exécution avec privilège.";
                else
                    throw;
            }
        }
        catch (Exception ex)
        {
            return ex.SI_ConvertToString();
        }
        return "";
    }

0
投票

我认为你不能这样做 - 我的理解是这是出于安全原因。允许恶意软件自动提升自身会有问题。


0
投票

This是我遵循的链接并解决了我的问题。

如何授予非管理员权限以管理服务

默认情况下,没有系统管理员权限的普通用户无法管理Windows服务。这意味着他们无法停止,启动或更改此类服务的设置或权限。在某些情况下,用户必须具有重新启动或管理某些服务的权限。在本文中,我们将考虑一些管理Windows服务权限的方法。特别是,我们将展示如何授予没有管理权限的标准用户启动和停止特定服务的权限......

没有简单方便的集成工具来管理Windows中的服务权限。我们将考虑一些方法来授予用户管理服务的权限......

© www.soinside.com 2019 - 2024. All rights reserved.