This article describes some common mistakes that you must
avoid when you write a service. The article also suggests best practices to
follow when you create Microsoft Windows Services. A Windows Service is a
program, a routine, or a process that performs a specific system function to
support other programs, particularly at a low (close to the hardware) level.
Examples of Windows Services include server products, such as Microsoft
Exchange and Microsoft SQL Server, and other client applications, such as
Windows Timer that sets the computer clock. Windows Services are automatically
started when you start the computer and do not have a user
interface.
The following guidelines may be useful when you write a
Windows Service:
- Design your service for use without a user interface.
Service applications run outside any particular user context and should not
require any user intervention. These applications typically perform tasks in
the background. Design your service to run without any user
intervention.
- Do not build interactive services. Run the service as an
isolated service without user intervention.
When the interactive user is logged into the same instance of Windows Services,
window message attacks may occur. The interactive user may inject and run
the arbitrary code in an interactive services process.
If the interactive
user sends a WM_COPYDATA message, copies malicious code into the address space of a highly
privileged interactive service process, and then sends a WM_TIMER message, the service process runs the malicious code. This
elevation of privilege attack may be carried out either by a user who has
physical access to the computer or by a user who logs on the computer by using
Microsoft Terminal Services. - Remove all Assert statements before you ship your service. Microsoft does not
recommend that you use the Assert method. The Assert method displays a dialog box that shows the line of code that
failed, and then gives you the option to debug the code. Therefore, remove all
the Assert statements before you ship your service.
- Run the service in a specific security context. To help
secure your system from attacks, run the service with minimal
user rights. If you require more user rights than those that are granted to the
minimal user accounts, do not run the service as a user with administrative
credentials.
Also, do not change the security policy to elevate the
user rights of the built-in logons (SYSTEM, Anonymous Logon, Local Service, and
Network Service). Instead, create a custom account, and then grant the account
the user rights that your service may require. If you require network
credentials, use a domain account. If you do not require network credentials,
use a local account. You may spend more time creating a custom account with limited user rights, but this is more secure than if you either run the service with too many user rights or when you add user rights to an account that is included with the operating system. - Avoid using both printing and mapped drives in Windows Services. Printing and mapped drives are typically available to a
particular user or a group of users. If you are using printing or mapped
drives, make sure that your service runs under an account with the user rights
that they must have to access printing or mapped drives. Typically, mapped
drives disconnect when you log off and then reconnect when you log on to the computer.
- Avoid relying on user profile settings when you write
Windows Services.
For more information about Windows Services, visit the
following Microsoft Developer Network Web sites: