Click here to Skip to main content
11,812,712 members (72,294 online)
Click here to Skip to main content

Adding a description to a .NET Windows Service

, 6 Feb 2002 265K 1.7K 116
Rate this:
Please Sign up or sign in to vote.
This article describes how to add a description for your .NET Framework Windows Service to the Services administration tool.
<!-- Download Links --> <!-- Article image -->

Sample Image - example.gif

<!-- Add the rest of your HTML here -->


Although the .NET Framework provides extremely robust Windows Service support through the classes available under the System.ServiceProcess namespace, for some reason the ability to specify your the description displayed in the Services control panel applet/MMC snap-in for your service was omitted. There exists an attribute class named ServiceProcessDescription, but it actually specifies what the Services MMC displays under the name column, and the Description column is left blank. This article will walk you through a low-level hack for adding a description by adding it directly to your service's registry key.

Most services keep their configuration information in the registry under the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ key. This is where the Service Control Manager (SCM) looks to get a list of services installed on a machine, and the Services control panel uses the SCM to list and modify the services. If you look under the key for a service, you'll see several entries, but we're interested in one in particular: the Description value. This is a REG_SZ (string) value, and this is where the SCM looks to get a service's description. We'll now take advantage of this arcane knowledge in the code below (you may download the source by clicking here):

//This code should be inserted into your ProjectInstaller class' code

public override void Install(IDictionary stateServer)
  Microsoft.Win32.RegistryKey system,
    //...\<Service Name>
    //...\Parameters - this is where you can put service-specific configuration

    //Let the project installer do its job

    system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
    //Open CurrentControlSet
    currentControlSet = system.OpenSubKey("CurrentControlSet");
    //Go to the services key
    services = currentControlSet.OpenSubKey("Services");
    //Open the key for your service, and allow writing
    service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);
    //Add your service's description as a REG_SZ value named "Description"
    service.SetValue("Description", "This is my service's description.");
    //(Optional) Add some custom information your service will use...
    config = service.CreateSubKey("Parameters");
  catch(Exception e)
    Console.WriteLine("An exception was thrown during service installation:\n" + e.ToString());

public override void Uninstall(IDictionary stateServer)
  Microsoft.Win32.RegistryKey system,

    //Drill down to the service key and open it with write permission
    system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
    currentControlSet = system.OpenSubKey("CurrentControlSet");
    services = currentControlSet.OpenSubKey("Services");
    service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);
    //Delete any keys you created during installation (or that your service created)
  catch(Exception e)
    Console.WriteLine("Exception encountered while uninstalling service:\n" + e.ToString());
    //Let the project installer do its job

After you add the above code to your ProjectInstaller class, you should see a description for your service alongside your service's name after your service is installed. In a future article, we'll look at how we can add the description as a custom attribute and extend the ServiceInstaller class to add the description for us automatically.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Andy Hopper
Web Developer
United States United States
Andy Hopper is a Enterprise Architect for Wintellect (, a company that supplies software training, consulting, and debugging services.

Classically trained as an electrical engineer, Andy rediscovered his long-lost love with programming while working on a PhD project and changed careers in 1995 to become a self-taught software engineer. Andy realized his time with C++, VB and ATL were at an end when he received the .NET Framework preview at the 2000 Professional Developer's Conference.

You may also be interested in...

Comments and Discussions

QuestionThanks Pin
Member 1012372212-Mar-15 0:51
memberMember 1012372212-Mar-15 0:51 
Questionit is better to use API Pin
Radu Laurentiu Ialovoi26-Feb-14 22:40
memberRadu Laurentiu Ialovoi26-Feb-14 22:40 
QuestionVery Nice! This worked for me. Pin
Member 251592129-Jul-13 3:20
memberMember 251592129-Jul-13 3:20 
GeneralMy vote of 5 Pin
VasileI27-Jul-10 16:07
memberVasileI27-Jul-10 16:07 
Generalgood article for its time Pin
Donsw29-Nov-09 9:32
memberDonsw29-Nov-09 9:32 
GeneralThere is still a far easier way even in .Net1.1 ... Pin
Member 307368920-Oct-08 2:46
memberMember 307368920-Oct-08 2:46 
NewsThere is a far easier way Pin
Xarium3-May-07 16:06
memberXarium3-May-07 16:06 
GeneralRe: There is a far easier way Pin
bkavanaugh1-Jun-07 2:15
memberbkavanaugh1-Jun-07 2:15 2.0 Pin
luc_arne9-Oct-06 4:04
memberluc_arne9-Oct-06 4:04 
GeneralNice Article Pin
krishna199-Jun-06 0:50
memberkrishna199-Jun-06 0:50 
GeneralA Cleaner Approach in C# Pin
c.sharpener6-Feb-06 9:25
memberc.sharpener6-Feb-06 9:25 
Perhaps a cleaner approach over the posted code is to simply exploit the ServiceInstaller.Committed event handler. As an example,
public ProjectInstaller()
     serviceInstaller.Committed += new System.Configuration.Install.InstallEventHandler(serviceInstaller_Committed);
private void serviceInstaller_Committed(object sender, System.Configuration.Install.InstallEventArgs e)
     serviceInstaller_ServiceDescription("service description text");
private void serviceInstaller_ServiceDescription(string description)
     RegistryKey registrykey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Services\\" + serviceInstaller.ServiceName,true);
This can still be optimized further by incorporating a try/catch on the registry operations, etc. But you get the general idea.

GeneralRe: A Cleaner Approach in C# Pin
Duoc BT15-Feb-06 17:10
memberDuoc BT15-Feb-06 17:10 
GeneralRegistry Editor Pin
ye win zaw29-Sep-05 16:50
memberye win zaw29-Sep-05 16:50 
GeneralOffical way to add a description to a service Pin
napalm2k10-Sep-05 10:26
membernapalm2k10-Sep-05 10:26 
GeneralVery good! Pin
Caio Proiete28-May-05 9:06
memberCaio Proiete28-May-05 9:06 
GeneralReusable component (VB.NET) Pin
Scott Hutchinson12-May-05 15:26
memberScott Hutchinson12-May-05 15:26 
GeneralRe: Reusable component (VB.NET &amp; C#) Pin
Caio Proiete28-May-05 9:13
memberCaio Proiete28-May-05 9:13 
GeneralVB.Net Translation Pin
jbaggaley23-Aug-04 1:15
memberjbaggaley23-Aug-04 1:15 
GeneralRe: VB.Net Translation Pin
Anonymous7-Oct-05 5:56
sussAnonymous7-Oct-05 5:56 
GeneralUser privileges to stop service Pin
Anonymous28-Apr-04 5:17
sussAnonymous28-Apr-04 5:17 
GeneralRunnig Winzip from Windows Service Pin
Adeel Ahmad12-Apr-04 1:23
sussAdeel Ahmad12-Apr-04 1:23 
Generalmultiple services Pin
Per Søderlind16-Mar-04 4:55
sussPer Søderlind16-Mar-04 4:55 
GeneralKey Flushing is required Pin
pcsInfo9-Mar-04 7:21
memberpcsInfo9-Mar-04 7:21 
GeneralG&#233;nial Pin
Anonymous1-Dec-03 13:05
sussAnonymous1-Dec-03 13:05 
Generaldefault Start Parameters Pin
Bill DeWeese6-Nov-03 14:52
memberBill DeWeese6-Nov-03 14:52 
GeneralCOM .NET Marshaling Pin
ash8822-Oct-03 21:00
memberash8822-Oct-03 21:00 
GeneralRe: COM .NET Marshaling Pin
Priyacb6-Jul-04 1:49
memberPriyacb6-Jul-04 1:49 
GeneralProblems writing registry key Pin
Michael Gamauf5-Sep-03 1:52
sussMichael Gamauf5-Sep-03 1:52 
Generalrunning a exe file from windows service Pin
goodnews12327-Aug-03 22:55
membergoodnews12327-Aug-03 22:55 
GeneralRe: running a exe file from windows service Pin
Okeno Palmer29-Aug-03 6:57
memberOkeno Palmer29-Aug-03 6:57 
Questionwhy so many levels? Pin
av41230-Jul-03 11:33
memberav41230-Jul-03 11:33 
AnswerRe: why so many levels? Pin
the_cRaCk_6-Aug-03 22:21
memberthe_cRaCk_6-Aug-03 22:21 
GeneralRe: why so many levels? Pin
Andy Hopper7-Aug-03 1:24
memberAndy Hopper7-Aug-03 1:24 
GeneralRe: why so many levels? Pin
RGabo19-Nov-04 17:27
memberRGabo19-Nov-04 17:27 
AnswerRe: why so many levels? Pin
akosows7-Jul-05 23:39
memberakosows7-Jul-05 23:39 
GeneralExcellent Pin
zzzzip16-Jun-03 19:27
memberzzzzip16-Jun-03 19:27 
QuestionWhat is Windows Service? Pin
Anonymous21-Apr-03 20:33
sussAnonymous21-Apr-03 20:33 
AnswerRe: What is Windows Service? Pin
xrenvam22-Apr-03 15:12
memberxrenvam22-Apr-03 15:12 
Generalthrows exception Pin
xrenvam14-Apr-03 14:41
memberxrenvam14-Apr-03 14:41 
GeneralAdd Start Parameters to Windows Service Pin
David Spectorman14-Apr-03 3:49
memberDavid Spectorman14-Apr-03 3:49 
GeneralRe: Add Start Parameters to Windows Service Pin
booze4-Jul-03 8:46
memberbooze4-Jul-03 8:46 
GeneralRe: Add Start Parameters to Windows Service Pin
David Spectorman26-Nov-03 1:11
memberDavid Spectorman26-Nov-03 1:11 
GeneralThanks! Pin
rado20-Feb-03 21:35
memberrado20-Feb-03 21:35 
Questionwhat about.... Pin
Figuerres20-Jan-03 7:24
memberFiguerres20-Jan-03 7:24 
AnswerRe: what about.... Pin
Figuerres21-Jan-03 5:29
memberFiguerres21-Jan-03 5:29 
GeneralNiiice Pin
keno8-Jan-03 16:17
memberkeno8-Jan-03 16:17 
GeneralDescriptions to .NET Services Pin
vbscripteater26-Aug-02 8:03
membervbscripteater26-Aug-02 8:03 
GeneralRe: Descriptions to .NET Services Pin
Anonymous26-Aug-02 16:06
sussAnonymous26-Aug-02 16:06 
GeneralRe: Descriptions to .NET Services Pin
Anonymous18-Dec-02 17:33
sussAnonymous18-Dec-02 17:33 
GeneralRe: Descriptions to .NET Services Pin
Jim Rogers28-Nov-03 4:46
memberJim Rogers28-Nov-03 4:46 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.151002.1 | Last Updated 7 Feb 2002
Article Copyright 2002 by Andy Hopper
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid