How to determine if starting inside a windows service?

In .NET Core, you can determine if the application is running as a Windows Service by using the WindowsServiceHelpers.IsWindowsService() static helper method available in the Microsoft.Extensions.Hosting.WindowsServices NuGet package.

Install-Package Microsoft.Extensions.Hosting.WindowsServices

if (WindowsServiceHelpers.IsWindowsService())
{
    // The application is running as a Windows Service
}
else
{
    // The application is not running as a Windows Service
}

The issue with the accepted answer is that checking the status of an service that isn't installed will throw. The IsService Method I'm using looks like this:

    private bool IsService(string name)
    {
        if (!Environment.UserInteractive) return true;
        System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(name);
        try
        {
            return sc.Status == System.ServiceProcess.ServiceControllerStatus.StartPending;
        }
        catch(InvalidOperationException)
        {
            return false;
        }
    }

Which should work more reliably than just checking Environment.UserInteractive


Also, it must be noted, that Environment.UserInteractive always returns true in .NET Core, even if it is running as a Windows Service.

For the time being, best method seems to be this one from ASP.NET Core.

Sources: .NET Core 2.2 .NET Core 3.1

Fixed in .NET 5


It's not perfect, but you could probably do something like this:

public static bool IsService()
{
    ServiceController sc = new ServiceController("MyApplication");
    return sc.Status == ServiceControllerStatus.StartPending;
}

The idea is that if you run this while your service is still starting up then it will always be in the pending state. If the service isn't installed at all then the method will always return false. It will only fail in the very unlikely corner case that the service is starting and somebody is trying to start it as an application at the same time.

I don't love this answer but I think it is probably the best you can do. Realistically it's not a very good idea to allow the same application to run in either service or application mode - in the long run it will be easier if you abstract all of the common functionality into a class library and just create a separate service app. But if for some reason you really really need to have your cake and eat it too, you could probably combine the IsService method above with Environment.UserInteractive to get the correct answer almost all of the time.