启动没有高程的Windows服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启动没有高程的Windows服务相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

发生了系统错误5。

访问被拒绝。

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

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

答案

您可以为服务本身设置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。

另一答案

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

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

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

好吧,我做了一个名为Service1的Windows服务,我用WIX做了一个安装程序。在设置过程中,我打电话给ServiceInstall

      <ServiceInstall Id="ServiceInstaller" Type="ownProcess" Vital="yes"
       Name="Service1" DisplayName="Service1"
       Description="Service1 description"Start="demand"
       Account="NT AUTHORITYLocalService"
       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美分,这是我的解决方案,不需要任何复杂的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 "";
    }
另一答案

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

另一答案

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

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

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

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

以上是关于启动没有高程的Windows服务的主要内容,如果未能解决你的问题,请参考以下文章

从片段着色器中的地形高程数据计算法线

ForegroundService没有从片段开始?

scrapy按顺序启动多个爬虫代码片段(python3)

cesium高程tif数据转化成terrain

在 Windows 7 上创建高程 COM 对象失败

Visual C++ 用啥代码可以创建自动启动的windows服务呢