Is there any quick way to, given an executable file, create a Windows service that, when started, launches it?
13 Answers
To create a Windows Service from an executable, you can use sc.exe:
sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"
You must have quotation marks around the actual exe path, and a space after the binPath=.
More information on the sc command can be found in Microsoft KB251192.
Note that it will not work for just any executable: the executable must be a Windows Service (i.e. implement ServiceMain). When registering a non-service executable as a service, you'll get the following error upon trying to start the service:
Error 1053: The service did not respond to the start or control request in a timely fashion.
There are tools that can create a Windows Service from arbitrary, non-service executables, see the other answers for examples of such tools.
8 Comments
binpath= along with having to surround the executable path with double quotes is totally wrong, at least for windows 10. the quoting is required if and only if the path contains special characters like whitespace. also, casing (lowe/upper/mixed-case) doesn't matter anywhere, in variable names too, and displayname="my service" is another goodie to pass on the commandline while creating a service to view as the first row (Name) at services.msc.binPath= was required for me on Windows 7 but not on Windows 10Use NSSM( the non-Sucking Service Manager ) to run a .BAT or any .EXE file as a service.
- Step 1: Download NSSM
- Step 2: Install your sevice with
nssm.exe install [serviceName] - Step 3: This will open a GUI which you will use to locate your executable
14 Comments
Extending (Kevin Tong) answer.
Step 1: Download & Unzip nssm-2.24.zip
Step 2: From command line type:
C:\> nssm.exe install [servicename]
it will open GUI as below (the example is UT2003 server), then simply browse it to: yourapplication.exe

More information on: https://nssm.cc/usage
9 Comments
nssm.exe install [serviceName]. This solution works but if you have a GUI Application, it will not work on Win Serever2003. If you later want to remove it, use nssm.exe remove [youservicename]nginx is not necessary and misleading. The command will work without it as well. It is optional parameter if you want to supply service name from command prompt.these extras proved useful.. need to be executed as an Administrator
sc create <service_name> binpath= "<binary_path>"
sc stop <service_name>
sc queryex <service_name>
sc delete <service_name>
If your service name has any spaces, enclose in "quotes".
1 Comment
Many existing answers include human intervention at install time. This can be an error-prone process. If you have many executables wanted to be installed as services, the last thing you want to do is to do them manually at install time.
Towards the above described scenario, I created serman, a command line tool to install an executable as a service. All you need to write (and only write once) is a simple service configuration file along with your executable. Run
serman install <path_to_config_file>
will install the service. stdout and stderr are all logged. For more info, take a look at the project website.
A working configuration file is very simple, as demonstrated below. But it also has many useful features such as <env> and <persistent_env> below.
<service>
<id>hello</id>
<name>hello</name>
<description>This service runs the hello application</description>
<executable>node.exe</executable>
<!--
{{dir}} will be expanded to the containing directory of your
config file, which is normally where your executable locates
-->
<arguments>"{{dir}}\hello.js"</arguments>
<logmode>rotate</logmode>
<!-- OPTIONAL FEATURE:
NODE_ENV=production will be an environment variable
available to your application, but not visible outside
of your application
-->
<env name="NODE_ENV" value="production"/>
<!-- OPTIONAL FEATURE:
FOO_SERVICE_PORT=8989 will be persisted as an environment
variable to the system.
-->
<persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
1 Comment
Same as Sergii Pozharov's answer, but with a PowerShell cmdlet:
New-Service -Name "MyService" -BinaryPathName "C:\Path\to\myservice.exe"
See New-Service for more customization.
This will only work for executables that already implement the Windows Services API.
3 Comments
Some of the top answers point to NSSM. This project has not been updated since 2017.
More modern alternative of similar functionality is https://github.com/winsw/winsw/ - contains multiple examples and good docs.
Tip for convenient use, that helped me to set it up faster than NSSM: if you name the winsw executable as myapp.exe and create XML configuration file myapp.xml, you just run myapp.exe install and myapp.exe start and voila, the service is running.
1 Comment
I've tested a good product for that: AlwaysUp. Not free but they have a 30 days trial period so you can give it a try...
Comments
I created the cross-platform Service Manager software a few years back so that I could start PHP and other scripting languages as system services on Windows, Mac, and Linux OSes:
https://github.com/cubiclesoft/service-manager
Service Manager is a set of precompiled binaries that install and manage a system service on the target OS using nearly identical command-line options (source code also available). Each platform does have subtle differences but the core features are mostly normalized.
If the child process dies, Service Manager automatically restarts it.
Processes that are started with Service Manager should periodically watch for two notification files to handle restart and reload requests but they don't necessarily have to do that. Service Manager will force restart the child process if it doesn't respond in a timely fashion to controlled restart/reload requests.
Comments
You can check out my small free utility for service create\edit\delete operations. Here is create example:
Go to Service -> Modify -> Create
Executable file (google drive): [Download]
Source code: [Download]
Blog post: [BlogLink]
Service editor class: WinServiceUtils.cs
Comments
Probably all your answers are better, but - just to be complete on the choice of options - I wanted to remind about old, similar method used for years:
SrvAny (installed by InstSrv)
as described here: https://learn.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service
2 Comments
I have to add that using PowerShell the behavior is different than when using CMD.
For example, in Powershell you must use sc .exe delete ServiceName. In CMD it doesn't make difference somehow.
- The "sc.exe queryex" is to demonstrate that the service still there.
Comments
I have another method, using the open-source library called Topshelf. I used it in a c# project, but maybe its available in different programming languages.
Here's a video that explains how to use it a little. https://www.youtube.com/watch?v=y64L-3HKuP0
The crux of this issue for a lot of people is that you can't install any old .exe as a service unless you use the old method that Tomeg used. I couldn't find the windows nt toolkit that's needed to get that to work.
I was stuck in a corner and this was my way out.



