Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Changing a Service's Configuration

A service configuration program uses the ChangeServiceConfig and ChangeServiceConfig2 functions to change the configuration parameters of an installed service. The program opens a handle to the service object, modifies its configuration, and then closes the service object handle.

In the following example, the DoDisableSvc function uses ChangeServiceConfig to change the service start type to "Disabled", the DoEnableSvc function uses ChangeServiceConfig to change the service start type to "Enabled", and the DoUpdateSvcDesc function uses ChangeServiceConfig2 to set the service description to "This is a test description". The szSvcName variable is a global variable that contains the name of the service. For the complete example that sets this variable, see SvcConfig.cpp.

//
// Purpose: 
// Disables the service.
//
// Parameters:
// None
// 
// Return value:
// None
//
VOID __stdcall DoDisableSvc()
{
 SC_HANDLE schSCManager;
 SC_HANDLE schService;

 // Get a handle to the SCM database. 
 
 schSCManager = OpenSCManager( 
 NULL, // local computer
 NULL, // ServicesActive database 
 SC_MANAGER_ALL_ACCESS); // full access rights 
 
 if (NULL == schSCManager) 
 {
 printf("OpenSCManager failed (%d)\n", GetLastError());
 return;
 }

 // Get a handle to the service.

 schService = OpenService( 
 schSCManager, // SCM database 
 szSvcName, // name of service 
 SERVICE_CHANGE_CONFIG); // need change config access 
 
 if (schService == NULL)
 { 
 printf("OpenService failed (%d)\n", GetLastError()); 
 CloseServiceHandle(schSCManager);
 return;
 } 

 // Change the service start type.

 if (! ChangeServiceConfig( 
 schService, // handle of service 
 SERVICE_NO_CHANGE, // service type: no change 
 SERVICE_DISABLED, // service start type 
 SERVICE_NO_CHANGE, // error control: no change 
 NULL, // binary path: no change 
 NULL, // load order group: no change 
 NULL, // tag ID: no change 
 NULL, // dependencies: no change 
 NULL, // account name: no change 
 NULL, // password: no change 
 NULL) ) // display name: no change
 {
 printf("ChangeServiceConfig failed (%d)\n", GetLastError()); 
 }
 else printf("Service disabled successfully.\n"); 

 CloseServiceHandle(schService); 
 CloseServiceHandle(schSCManager);
}

//
// Purpose: 
// Enables the service.
//
// Parameters:
// None
// 
// Return value:
// None
//
VOID __stdcall DoEnableSvc()
{
 SC_HANDLE schSCManager;
 SC_HANDLE schService;

 // Get a handle to the SCM database. 
 
 schSCManager = OpenSCManager( 
 NULL, // local computer
 NULL, // ServicesActive database 
 SC_MANAGER_ALL_ACCESS); // full access rights 
 
 if (NULL == schSCManager) 
 {
 printf("OpenSCManager failed (%d)\n", GetLastError());
 return;
 }

 // Get a handle to the service.

 schService = OpenService( 
 schSCManager, // SCM database 
 szSvcName, // name of service 
 SERVICE_CHANGE_CONFIG); // need change config access 
 
 if (schService == NULL)
 { 
 printf("OpenService failed (%d)\n", GetLastError()); 
 CloseServiceHandle(schSCManager);
 return;
 } 

 // Change the service start type.

 if (! ChangeServiceConfig( 
 schService, // handle of service 
 SERVICE_NO_CHANGE, // service type: no change 
 SERVICE_DEMAND_START, // service start type 
 SERVICE_NO_CHANGE, // error control: no change 
 NULL, // binary path: no change 
 NULL, // load order group: no change 
 NULL, // tag ID: no change 
 NULL, // dependencies: no change 
 NULL, // account name: no change 
 NULL, // password: no change 
 NULL) ) // display name: no change
 {
 printf("ChangeServiceConfig failed (%d)\n", GetLastError()); 
 }
 else printf("Service enabled successfully.\n"); 

 CloseServiceHandle(schService); 
 CloseServiceHandle(schSCManager);
}

//
// Purpose: 
// Updates the service description to "This is a test description".
//
// Parameters:
// None
// 
// Return value:
// None
//
VOID __stdcall DoUpdateSvcDesc()
{
 SC_HANDLE schSCManager;
 SC_HANDLE schService;
 SERVICE_DESCRIPTION sd;
 LPTSTR szDesc = TEXT("This is a test description");

 // Get a handle to the SCM database. 
 
 schSCManager = OpenSCManager( 
 NULL, // local computer
 NULL, // ServicesActive database 
 SC_MANAGER_ALL_ACCESS); // full access rights 
 
 if (NULL == schSCManager) 
 {
 printf("OpenSCManager failed (%d)\n", GetLastError());
 return;
 }

 // Get a handle to the service.

 schService = OpenService( 
 schSCManager, // SCM database 
 szSvcName, // name of service 
 SERVICE_CHANGE_CONFIG); // need change config access 
 
 if (schService == NULL)
 { 
 printf("OpenService failed (%d)\n", GetLastError()); 
 CloseServiceHandle(schSCManager);
 return;
 } 

 // Change the service description.

 sd.lpDescription = szDesc;

 if( !ChangeServiceConfig2(
 schService, // handle to service
 SERVICE_CONFIG_DESCRIPTION, // change: description
 &sd) ) // new description
 {
 printf("ChangeServiceConfig2 failed\n");
 }
 else printf("Service description updated successfully.\n");

 CloseServiceHandle(schService); 
 CloseServiceHandle(schSCManager);
}

Related topics

Service Configuration

The Complete Service Sample


Feedback

Was this page helpful?

Additional resources