6

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

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

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

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

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

发生系统错误 5。

访问被拒绝。

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

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

4

5 回答 5

11

您可以为服务本身设置 ACL 以允许这样做。SetACL.exe实用程序使这(有点)简单;例如:

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

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

于 2013-03-19T17:58:26.867 回答
4

我关注了 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>

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

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

显然它不会在没有提升 TestProgram (在普通用户帐户下运行)的情况下启动服务。

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

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

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

于 2013-03-28T09:39:37.217 回答
4

如果我可以加 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 "";
    }
于 2018-02-28T16:20:09.000 回答
0

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

于 2013-03-19T10:35:57.780 回答
0

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

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

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

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

于 2017-03-06T10:37:53.083 回答