我有一个以ServiceService运行的Windows服务MyService(在C#中实现)。 MyService需要启动另一个第三方服务TheyService,它也作为NetworkService运行。尝试从MyService尝试使用此代码时,尝试启动他们的服务失败并显示访问被拒绝错误:
public static bool StartService(string serviceName, TimeSpan timeout)
{
bool started = false;
try
{
using (ServiceController sc = new ServiceController(serviceName))
{
if (sc != null)
{
sc.Refresh();
if (sc.Status == ServiceControllerStatus.Running)
{
// Stop service
Trace.TraceInformation("Util.StartService Stopping service '{0}'...", serviceName);
sc.Stop();
}
sc.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
sc.Refresh();
// Start service
Trace.TraceInformation("Util.StartService Starting service '{0}'...", serviceName);
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running, timeout);
sc.Refresh();
started = (sc.Status == ServiceControllerStatus.Running);
}
}
}
catch (Exception e)
{
Trace.TraceError("Util.StartService Exception occurred while starting service '{0}'.\n{1}\n{2}", serviceName, e.Message, e.StackTrace);
}
Trace.TraceInformation("Util.StartService Service '{0}' restarted? {1}", serviceName, started);
return started;
}
他们服务的SID信息:
C:\>sc showsid TheirService
NAME: TheirService
SERVICE SID: S-1-5-80-3034156332-2544749427-1608259134-1317875859-4063208518
有没有办法从C#以编程方式从MyService启动他们的服务?
编辑:目标 - 作为MyService安装的一部分,我希望能够重新启动他们的服务。
答案 0 :(得分:1)
将服务设置为运行的并不重要。您需要升级到管理员才能启动/停止Windows服务。
或者,您可以grant NetworkService permission控制它,但这些授权需要由管理员进行,可能在您安装服务时。它还会削弱第三方服务的安全性,因为任何以NetworkService身份运行的人都可以重新启动它,这会破坏NetworkService帐户的最低权限目的。
答案 1 :(得分:1)
您需要提升此服务的权限。黑客将拥有一个中间“本地系统”服务,它可以执行您想要的任务并从您的网络服务接收命令。
修改强> 如果可以修改“他们的服务”,那么您可以从服务中向其发送命令,反过来,它会根据this answer重新启动。