【问题标题】:Stopping a service in C# without permission elevation在没有权限提升的情况下停止 C# 中的服务
【发布时间】:2011-10-25 12:50:20
【问题描述】:

我需要能够通过可以从第三方软件调用的 exe 关闭服务,所以我想我会使用 C# 快速解决问题。

我正在尝试使用我在网上找到的以下代码来停止服务,但除非我以管理员身份运行 exe,否则它将无法工作(理想情况下,我不想这样做,因为我试图将其作为一个光滑的)

public static void StopService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        service.MachineName = ".";
        try
        {
            TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

            service.Stop();
            service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
        }
        catch
        {
            // ...
        }
    }

有没有办法绕过需要海拔?

【问题讨论】:

  • 我不认为您可以停止 Windows 服务,除非该服务在同一帐户下运行。
  • 这个技巧不会破坏特权和访问权限的目的。什么病毒不会利用这个技巧?
  • 除了入侵系统/利用一些错误之外,没有其他办法... => 不!
  • 大家好——从那个角度没有考虑过。我是域管理员,所以我可以以某种方式传递安全凭据吗?
  • 一个更简单的解决方案可能是让用户在启动时以管理员身份运行。这是一个简单的设置功能吗?

标签: c# windows-services uac


【解决方案1】:

各个服务都有访问控制列表。您可以向特定用户或组授予权限,以便能够关闭/启动特定服务。您可以从 Microsoft 获取 cmd 行工具“subinacl”来设置 acl:http://www.microsoft.com/download/en/details.aspx?id=23510 请注意,您可以授予关闭服务的权限,而无需授予查询服务配置的权限。

【讨论】:

    【解决方案2】:

    这样想:如果有办法绕过它,整个安全问题会有什么意义?

    所以,不。除非该服务在同一帐户下运行,否则不应允许您停止它。

    如果我是病毒,我会做的第一件事是什么?使用“需要提升的方法”停止病毒扫描服务。

    【讨论】:

      【解决方案3】:

      您可以安装自己的“Stopper-Service”,它与专用 .exe 文件或任何知道如何与该服务通信(例如通过命名管道)的应用程序进行通信。

      因此,您的 app/.exe 所做的一切都是向该服务发出信号,它必须停止/重新启动等特定服务。

      如果你只想停止你自己的服务,你可以考虑集成这样的消息功能,这样你就可以在没有管理员权限的情况下控制它。

      当然,您必须实施足够的安全机制,以确保只有经过授权的应用才能获得控制权。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        • 2018-06-11
        • 1970-01-01
        • 2021-06-10
        • 2017-11-16
        • 1970-01-01
        相关资源
        最近更新 更多