【问题标题】:Controlling a service using ServiceController versus using services.msc, with UAC enabled使用 ServiceController 与使用 services.msc 控制服务,启用 UAC
【发布时间】:2013-12-17 11:44:19
【问题描述】:

我正在开发一个管理构成某些产品的服务的应用程序。 到目前为止,可以预见该应用程序是以提升启动的(因此用户必须确认 UAC 提示)。 对于大多数操作来说,似乎不需要提升,例如启动停止服务。

应用程序通常由本地管理员组的成员运行;这些人可以启动 services.msc,然后他们可以启动和停止服务。所以我希望它“正常工作”:

ServiceController sc = new ServiceController(Environment.MachineName, "MyServiceApp");
sc.Start();

失败并出现“拒绝访问”异常。 所以我加了

ServiceControllerPermission scp = 
    new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "MyServiceApp");
scp.Demand();
ServiceController sc = new ServiceController(Environment.MachineName, "MyServiceApp");
sc.Start();

需求成功,启动依旧失败。

我在 StackExchange 上阅读了很多关于 ServiceController 和安全问题的问题(和答案);很多答案表明需要提升。由于我(我是本地管理员组的成员)可以开始和停止使用 services.msc,所以不要购买它。

那么 services.msc 怎么了?我的代码怎么了?我确实启用了 UAC,但我不想禁用它。 要启动或停止服务,不需要提升,对吗?否则 services.msc 也需要提升吗? (我的一位同事建议 services.msc 包含一些“使它工作”的“特殊代码”;我也不买那个)。

感谢您的任何回答。

【问题讨论】:

    标签: c#-4.0 servicecontroller


    【解决方案1】:

    Services.msc(mmc.exe)不一定以提升/管理权限运行。

    您可以让一些“特殊代码”要求 Windows 运行您的程序以提升权限运行。您将使用 manifest 文件。

    How do I force my .NET application to run as administrator? https://stackoverflow.com/a/4084620/787893

    【讨论】:

    • 我启用了 UAC。我不需要确认运行 services.msc 的升级。那么它是如何获得海拔的呢?清单不授予它,它只是指定它需要它。我的清单当前状态为“AsInvoker”——我不想提升。我接受没有获得启动服务的权利,但我知道我拥有它,无需提升,只需启动 services.msc。
    • 我没有专门看 services.msc MMC,但是一些应用,比如 taskmgr.exe 会正常运行,然后启动另一个提升的实例。
    • 找到这篇文章:technet.microsoft.com/en-us/magazine/2009.07.uac.aspx#id0560031 -> 所以,是的,你是对的,它在清单中,指定“autoelevation”,它仅适用于具有特定数字签名的可执行文件。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多