启动没有高程的Windows服务

时间:2013-03-19 10:26:33

标签: service elevated-privileges

我将Windows服务“Service1”配置为以“本地服务”身份登录。

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

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

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

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

  

发生了系统错误5。

     

访问被拒绝。

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

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

5 个答案:

答案 0 :(得分:9)

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

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。

答案 1 :(得分: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)

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

这个概念只是打电话给&#34; Net Start &#34;通过一个提升的过程:

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 "";
    }

答案 3 :(得分:0)

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

答案 4 :(得分:0)

This是我关注的链接并解决了我的问题。

  

如何授予非管理员管理服务的权利

     

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

     

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