在没有权限提升的情况下在C#中停止服务

时间:2011-10-25 12:50:20

标签: c# windows-services uac

我需要能够通过可以从第三方软件调用的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
        {
            // ...
        }
    }

有没有办法解决需要提升的问题?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

以这种方式思考:整个安全问题是什么,如果有办法解决它?

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

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

答案 2 :(得分:1)

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

所以你的所有app / .exe都发出了这个服务的信号,它必须停止/重启等特定服务。

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

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

希望这有帮助。