您的位置:首页 > 其它

VC关于windows服务状态更改

2014-10-19 23:09 363 查看
更改服务状态

[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);

}

// 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);

}

启动、停止服务

[cpp] #include <winsvc.h>

void CStartServiceDlg::OnBnClickedButton1()

{

// 打开服务管理对象

SC_HANDLE hSC = ::OpenSCManager( NULL,

NULL, GENERIC_EXECUTE);

if( hSC == NULL)

{

TRACE( "open SCManager error");

return;

}

// 打开www服务。

SC_HANDLE hSvc = ::OpenService( hSC, "W3SVC",

SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);

if( hSvc == NULL)

{

TRACE( "Open www erron。");

::CloseServiceHandle( hSC);

return;

}

// 获得服务的状态

SERVICE_STATUS status;

if( ::QueryServiceStatus( hSvc, &status) == FALSE)

{

TRACE( "Get Service state error。");

::CloseServiceHandle( hSvc);

::CloseServiceHandle( hSC);

return;

}

//如果处于停止状态则启动服务,否则停止服务。

if( status.dwCurrentState == SERVICE_RUNNING)

{

// 停止服务

if( ::ControlService( hSvc,

SERVICE_CONTROL_STOP, &status) == FALSE)

{

TRACE( "stop service error。");

::CloseServiceHandle( hSvc);

::CloseServiceHandle( hSC);

return;

}

// 等待服务停止

while( ::QueryServiceStatus( hSvc, &status) == TRUE)

{

::Sleep( status.dwWaitHint);

if( status.dwCurrentState == SERVICE_STOPPED)

{

AfxMessageBox( "stop success。");

::CloseServiceHandle( hSvc);

::CloseServiceHandle( hSC);

return;

}

}

}

else if( status.dwCurrentState == SERVICE_STOPPED)

{

// 启动服务

if( ::StartService( hSvc, NULL, NULL) == FALSE)

{

TRACE( "start service error。");

::CloseServiceHandle( hSvc);

::CloseServiceHandle( hSC);

return;

}

// 等待服务启动

while( ::QueryServiceStatus( hSvc, &status) == TRUE)

{

::Sleep( status.dwWaitHint);

if( status.dwCurrentState == SERVICE_RUNNING)

{

AfxMessageBox( "start success。");

::CloseServiceHandle( hSvc);

::CloseServiceHandle( hSC);

return;

}

}

}

TRACE( "start error。");

::CloseServiceHandle( hSvc);

::CloseServiceHandle( hSC);

return;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: