Jump to content

How to run a program as a Service


tain

Recommended Posts

I wanted to setup some programs to run as Windows Services but found information on the subject to be scattered around everywhere. So this post is basically for consolidation and clarification but is not focused on unattended installations.

What is a Service?

A Windows Service is automatically started when your system boots. There is no need to logon to the system. Services also are not affected by people logging off. Services automatically recover from program crashes and Standby and Hibernation modes. Windows 9x/ME do not have a Service facility. Installing software as a Service requires Administrator permissions.

What are the options for running a program as a Service?

  1. sc.exe
    This is Microsoft software and is installed by default on XP and 2003. It is probably the best and easiest method but it won't work if the target executable was not programmed to run as a Service. This rules it out for what many people are trying to do since most programs that are designed ro run as a Service have that option included somewhere in the application. sc.exe is useful for the Unattended crowd, though.
    The syntax for sc.exe is worth noting. This will NOT work:
    sc create YourServiceName binPath="c:\Program Files\directory\appname.exe"
    But this WILL work (note the space after the =):
    sc create YourServiceName binPath= "c:\Program Files\directory\appname.exe"
    Two other useful options, with the same syntax as above, are:
    type= <own|share|interact|kernel|filesys|rec>
    (default = own)
    start= <boot|system|auto|demand|disabled>
    (default = demand)


    You can use these commands for more details:

    sc /?

    sc create /?


  2. instsrv.exe and srvany.exe
    This is Microsoft software but was published as part of the Resource Kits. You can download the files here or here. Thanks to tacktech.com for providing the fileset.
    Instrsrv.exe installs the Service but srvany.exe is the real gem here as it is a wrapper that allows any software to be run as a Service. This method worked great for me but does require manual registry edits.
    Here is a quick summary of the steps invloved but you can find more complete instructions at Microsoft's KB page or TackTech's page with great screenshots.

    1. Unpack the fileset to a folder of your choice. srvany.exe needs to remain on your system for this method to work, so put it somewhere like Program files where you won't mind leaving it around. I use C:\Program Files\services in this example.
    2. Install the Service with a command like this:
      C:\Program Files\services\Instsrv.exe YourServiceName C:\Program Files\services\Srvany.exe

    3. Using a registry editor, find this key:
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName

    4. Add a new sub-key called Parameters.
    5. In the Parameters key, create a new string value named Application.
    6. Set the value data of Application to the full path of the executable file that you want the service to launch. For example, C:\WINNT\notepad.exe.
    7. Using the Services console, find your new service and make any necessary property edits. This dialog will allow you to set the startup type, logon method, and program failure options.
      One problem I ran into with this method was task tray entries. Some programs won't work if their task tray entry fails. If the software you want to run wants to put an icon in the task tray you can try enabling "Allow service to interact with the desktop" on the "Log On" tab of the Service properties. If that doesn't work you could also try disabling the task tray entry for the program.
    8. Launcher Service
      Camarade_Tux recommends Launcher Service. It is free and open source and looks very flexible and useful. This program has several unique features:
      • Start or stop a program based on network connectivity
      • External program can be run before or after execution
      • Delete *.tmp and *.pid files from the program's startup folder before execution

[*]WinServ

WinServ is a utility that can create an NT service that runs any application. When the application exits, the service becomes stopped.
I did not try this program but included it here since it is free, open source and looks useful.

[*]Non-free options

There are quite a few shareware and payware options. I didn't try any of them but I hear that FireDaemon works well for a lot of people.

References

Link to comment
Share on other sites


Thanks, jaclaz :)

NT Wrapper looks great but I can't find the differences between the Lite and Pro versions. Do you know?

The Lite version also comes with a neat app called SaferTray which helps keep wandering icons in the tray where they belong.

I looked at that other app previously but didn't include it since it is aimed at programmers instead of users. But if you look at the comments at the bottom of the page you will see the familiar name Bilou_Gateux! I wonder if he got a copy and if it is suitable for use here? :whistle:

/me PMs him

Link to comment
Share on other sites

NT Wrapper looks great but I can't find the differences between the Lite and Pro versions.

There's a chart on that page.

SMP/CPU binding only in pro version;

Lite version limited to one service/machine only

Pro version has offline help and support.

Codeproject (Sourcecode only) - any taker to compile it?:

Absolutely! I would, but there's no need for that as there's also a pre-compiled version along with the source in the zip file. If you have no account (req'd to download) and don't want to signup, then try bugmenot.

Link to comment
Share on other sites

So there is. :blink:

I will blame this blunder on my sometimes over-eager filtering proxy. I see the table when I bypass it. Thanks!

Being limited to one service would be a deal breaker for me. How many apps do you guys think most people need to run as a service? I need at least two, but probably three.

Link to comment
Share on other sites

Being limited to one service would be a deal breaker for me. How many apps do you guys think most people need to run as a service? I need at least two, but probably three.

Hard to tell... Personally I don't use any of these apps as Visual Studio will let you create your own services when you need one... (and even an installer for it and all - example with source code here)

But there are likely reasons to run other apps as a service like that (not that I've ever had the need - most apps that need or would benefit from this already take care of it, like web/ftp servers).

I can understand he wants to charge for it though - not that it's a very complex app or anything, but it takes time to design/code/make installer, write proper documentation, create a website for it (pay associated costs too), pay for hosting, end up having to support people (some people will ask questions - so you need email or a forum or something - and it can take a fair amount of time to answer those), maintain/bugfix/enhance it, etc. Understandable he wants to get some of that money back (or be paid for part of his time spent). So he's putting some artificial limitations on it to get their users with the most needs to pay for it.

Thing is, it's easy to create a simple app like that, and there's already some free & open source options (I bet one would find some stuff on sourceforge too). So people are mostly paying for convenience (they don't want to have to write or compile code or such things) - that and support. Someone with some knowledge and time will use something else or just "roll their own" basically.

People with simple needs will use the free version, others will either pay ~20$/PC or find something else if that's too much (but then you need to spend time looking for something else and such - not as "convenient")... Personally, I'd rather use something that I have the source for (willing to fix/enhance/modify it as req'd)

Link to comment
Share on other sites

I have used vbscript in the past to create services:

CreateService.vbs

Const OWN_PROCESS = 16
Const NOT_INTERACTIVE = False
Const NORMAL_ERROR_CONTROL = 2

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=Impersonate}!\\" & strComputer & "\root\cimv2")

Set objService = objWMIService.Get("Win32_BaseService")
errReturn = objService.Create("DbService", _
"NAME", _
"C:\WINDOWS\PROGRAM.EXE", _
OWN_PROCESS, _
NORMAL_ERROR_CONTROL, _
"Manual", _
NOT_INTERACTIVE, _
"NT AUTHORITY\LocalService", "")

RemoveService.vbs

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where Name = 'SERVICE_NAME'")
For Each objService in colListOfServices
objService.StopService()
objService.Delete()
Next

I do believe that this will work only for programs that are meant to run as a service.

Link to comment
Share on other sites

Very interesting post! :)

I may add (Freeware for non commercial use):

NTWRAPPER

http://www.duodata.de/ntwrapper/index.htm

Codeproject (Sourcecode only) - any taker to compile it?:

XYNTSERVICE

http://www.codeproject.com/system/xyntservice.asp

jaclaz

XYNTSERVICE GUI wrapper with compiled version

;)

Edited by Bilou_Gateux
Link to comment
Share on other sites

I have used vbscript in the past to create services:

CreateService.vbs

Const OWN_PROCESS = 16
Const NOT_INTERACTIVE = False
Const NORMAL_ERROR_CONTROL = 2

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=Impersonate}!\\" & strComputer & "\root\cimv2")

Set objService = objWMIService.Get("Win32_BaseService")
errReturn = objService.Create("DbService", _
"NAME", _
"C:\WINDOWS\PROGRAM.EXE", _
OWN_PROCESS, _
NORMAL_ERROR_CONTROL, _
"Manual", _
NOT_INTERACTIVE, _
"NT AUTHORITY\LocalService", "")

RemoveService.vbs

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where Name = 'SERVICE_NAME'")
For Each objService in colListOfServices
objService.StopService()
objService.Delete()
Next

I do believe that this will work only for programs that are meant to run as a service.

Afaik, windows DOS-style programs have a main function, graphical ones a winmain one and services have serv(ice)main or so function.

So a program needs to be designed to run as a service and moreover, services receive some specific messages (shutting down and co.) your program should handle if you want it not to simply die when you power your computer off.

[*]Launcher Service

Camarade_Tux recommends Launcher Service. It is free and open source and looks very flexible and useful. This program has several unique features:

  • Start or stop a program based on network connectivity
  • External program can be run before or after execution
  • Delete *.tmp and *.pid files from the program's startup folder before execution

... to be continued. :D

Link to comment
Share on other sites

Do you think it is possible to make a program starting as a service during Unattended?

Say it's some kind of driver (dll or sys) that can act as a service after regular installation.

I think Bilou_Gateux did something similar :rolleyes:

Link to comment
Share on other sites

TAiN

Thank you. But doesn't sc.exe applies to .EXE files? And if there is a .SYS file (say - system driver)? And there are two .INF files with it which install and specify this .SYS as a service. But they don't make it to start like a service :(

Vbscripts can't be used for some reason :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...