简体   繁体   中英

Restart NetworkService service from another service

I have a Windows service MyService (implemented in C#) that runs as NetworkService. MyService needs to start another third-party service TheirService which also runs as NetworkService. Attempt to start TheirService fails with an access denied error when attempted from MyService using this code:

    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;
    }

TheirService's SID info:

C:\>sc showsid TheirService
NAME: TheirService
SERVICE SID: S-1-5-80-3034156332-2544749427-1608259134-1317875859-4063208518

Is there a way to start TheirService from MyService programmatically from C#?

EDIT: Goal - As part of MyService installation, I want to be able to restart TheirService.

It doesn't matter what the services are set to run as. You need to elevate to an administrator to start / stop a windows service.

Alternatively, you could grant NetworkService permission to controller it, but those grants need to be made by an administrator, perhaps when your service is being installed. It also weakens the security of the 3rd party service since anyone running as NetworkService would be able to restart it, which defeats the least privilege purpose of the NetworkService account.

You would need elevated rights for this service. A hack would be to have an intermediary 'Local System' service which performs what you want and receive commands from your network service.

EDIT: If 'TheirService' can be modified, then you can send to it a command from your service and in its turn, it would restart itself based on this answer .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM