2008-02-18 13:48:51 +03:00
/*
Samba Unix / Linux SMB client library
Distributed SMB / CIFS Server Management Utility
2005-03-24 07:25:49 +03:00
Copyright ( C ) Gerald ( Jerry ) Carter 2005
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2005-03-24 07:25:49 +03:00
( at your option ) any later version .
2008-02-18 13:48:51 +03:00
2005-03-24 07:25:49 +03:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2008-02-18 13:48:51 +03:00
2005-03-24 07:25:49 +03:00
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>. */
2008-02-18 13:48:51 +03:00
2005-03-24 07:25:49 +03:00
# include "includes.h"
# include "utils/net.h"
2011-04-13 16:32:16 +04:00
# include "rpc_client/rpc_client.h"
2010-08-06 16:50:31 +04:00
# include "../librpc/gen_ndr/ndr_svcctl.h"
2011-01-12 01:21:41 +03:00
# include "../librpc/gen_ndr/ndr_svcctl_c.h"
2008-03-20 03:26:37 +03:00
struct svc_state_msg {
uint32 flag ;
const char * message ;
} ;
static struct svc_state_msg state_msg_table [ ] = {
2009-08-10 22:23:41 +04:00
{ SVCCTL_STOPPED , N_ ( " stopped " ) } ,
{ SVCCTL_START_PENDING , N_ ( " start pending " ) } ,
{ SVCCTL_STOP_PENDING , N_ ( " stop pending " ) } ,
{ SVCCTL_RUNNING , N_ ( " running " ) } ,
{ SVCCTL_CONTINUE_PENDING , N_ ( " resume pending " ) } ,
{ SVCCTL_PAUSE_PENDING , N_ ( " pause pending " ) } ,
{ SVCCTL_PAUSED , N_ ( " paused " ) } ,
2008-03-20 03:26:37 +03:00
{ 0 , NULL }
} ;
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
const char * svc_status_string ( uint32 state )
{
fstring msg ;
int i ;
2009-08-10 22:23:41 +04:00
fstr_sprintf ( msg , _ ( " Unknown State [%d] " ) , state ) ;
2008-03-20 03:26:37 +03:00
for ( i = 0 ; state_msg_table [ i ] . message ; i + + ) {
if ( state_msg_table [ i ] . flag = = state ) {
fstrcpy ( msg , state_msg_table [ i ] . message ) ;
break ;
}
}
return talloc_strdup ( talloc_tos ( ) , msg ) ;
}
2005-03-25 03:38:30 +03:00
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-01-12 21:00:16 +03:00
static WERROR open_service ( struct dcerpc_binding_handle * b ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * hSCM ,
const char * service ,
uint32_t access_mask ,
struct policy_handle * hService )
2005-03-25 03:38:30 +03:00
{
2008-02-18 14:45:13 +03:00
NTSTATUS status ;
2011-01-12 21:00:16 +03:00
WERROR result ;
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_OpenServiceW ( b , mem_ctx ,
2008-02-18 14:45:13 +03:00
hSCM ,
service ,
2011-01-12 21:00:16 +03:00
access_mask ,
hService ,
2008-02-18 14:45:13 +03:00
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr , _ ( " Failed to open service. [%s] \n " ) ,
nt_errstr ( status ) ) ;
return result ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Failed to open service. [%s] \n " ) ,
win_errstr ( result ) ) ;
2005-03-25 03:38:30 +03:00
return result ;
}
2011-01-12 21:00:16 +03:00
return WERR_OK ;
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-01-12 21:08:48 +03:00
static WERROR open_scm ( struct dcerpc_binding_handle * b ,
TALLOC_CTX * mem_ctx ,
const char * server_name ,
uint32_t access_mask ,
struct policy_handle * hSCM )
{
NTSTATUS status ;
WERROR result ;
status = dcerpc_svcctl_OpenSCManagerW ( b , mem_ctx ,
server_name ,
NULL ,
access_mask ,
hSCM ,
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr ,
_ ( " Failed to open Service Control Manager. [%s] \n " ) ,
nt_errstr ( status ) ) ;
return result ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
d_fprintf ( stderr ,
_ ( " Failed to open Service Control Manager. [%s] \n " ) ,
win_errstr ( result ) ) ;
return result ;
}
return WERR_OK ;
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-01-12 21:00:16 +03:00
static WERROR query_service_state ( struct rpc_pipe_client * pipe_hnd ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * hSCM ,
const char * service ,
uint32 * state )
{
struct policy_handle hService ;
struct SERVICE_STATUS service_status ;
WERROR result = WERR_GENERAL_FAILURE ;
NTSTATUS status ;
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
/* now cycle until the status is actually 'watch_state' */
result = open_service ( b , mem_ctx , hSCM , service ,
SC_RIGHT_SVC_QUERY_STATUS ,
& hService ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
return result ;
}
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_QueryServiceStatus ( b , mem_ctx ,
2008-02-19 04:43:04 +03:00
& hService ,
& service_status ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
2005-03-25 03:38:30 +03:00
}
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
* state = service_status . state ;
done :
if ( is_valid_policy_hnd ( & hService ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hService , & _result ) ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
return result ;
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR watch_service_state ( struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2009-03-19 00:49:41 +03:00
struct policy_handle * hSCM ,
2008-02-18 13:48:51 +03:00
const char * service ,
2005-09-30 21:13:37 +04:00
uint32 watch_state ,
uint32 * final_state )
2005-03-25 03:38:30 +03:00
{
uint32 i ;
uint32 state = 0 ;
WERROR result = WERR_GENERAL_FAILURE ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
i = 0 ;
while ( ( state ! = watch_state ) & & i < 30 ) {
/* get the status */
2005-09-30 21:13:37 +04:00
result = query_service_state ( pipe_hnd , mem_ctx , hSCM , service , & state ) ;
2005-03-25 03:38:30 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
break ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
d_printf ( " . " ) ;
i + + ;
2012-03-24 23:43:07 +04:00
usleep ( 100 ) ;
2005-03-25 03:38:30 +03:00
}
d_printf ( " \n " ) ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
* final_state = state ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
return result ;
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR control_service ( struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2009-03-19 00:49:41 +03:00
struct policy_handle * hSCM ,
2008-02-18 13:48:51 +03:00
const char * service ,
2005-09-30 21:13:37 +04:00
uint32 control ,
uint32 watch_state )
2005-03-25 03:38:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle hService ;
2005-03-25 03:38:30 +03:00
WERROR result = WERR_GENERAL_FAILURE ;
2008-02-18 14:45:13 +03:00
NTSTATUS status ;
2009-01-08 15:23:59 +03:00
struct SERVICE_STATUS service_status ;
2005-03-25 03:38:30 +03:00
uint32 state = 0 ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
/* Open the Service */
2008-02-18 13:48:51 +03:00
2011-01-12 21:00:16 +03:00
result = open_service ( b , mem_ctx , hSCM , service ,
( SC_RIGHT_SVC_STOP | SC_RIGHT_SVC_PAUSE_CONTINUE ) ,
& hService ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2011-01-12 21:00:16 +03:00
return result ;
2005-03-25 03:38:30 +03:00
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
/* get the status */
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_ControlService ( b , mem_ctx ,
2008-02-19 04:37:12 +03:00
& hService ,
control ,
& service_status ,
& result ) ;
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr , _ ( " Control service request failed. [%s] \n " ) ,
nt_errstr ( status ) ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Control service request failed. [%s] \n " ) ,
win_errstr ( result ) ) ;
2005-03-25 03:38:30 +03:00
goto done ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
/* loop -- checking the state until we are where we want to be */
2008-02-18 13:48:51 +03:00
2005-09-30 21:13:37 +04:00
result = watch_service_state ( pipe_hnd , mem_ctx , hSCM , service , watch_state , & state ) ;
2008-02-18 13:48:51 +03:00
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " %s service is %s. \n " ) , service , svc_status_string ( state ) ) ;
2005-03-25 03:38:30 +03:00
2008-02-18 13:48:51 +03:00
done :
2011-01-12 01:21:41 +03:00
if ( is_valid_policy_hnd ( & hService ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hService , & _result ) ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
return result ;
2008-02-18 13:48:51 +03:00
}
2005-03-25 03:38:30 +03:00
2005-03-24 19:11:23 +03:00
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-03-24 07:25:49 +03:00
2008-05-10 01:22:12 +04:00
static NTSTATUS rpc_service_list_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2008-02-18 13:48:51 +03:00
const char * domain_name ,
2005-09-30 21:13:37 +04:00
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2005-09-30 21:13:37 +04:00
int argc ,
const char * * argv )
2005-03-24 19:11:23 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle hSCM ;
2009-01-09 18:18:51 +03:00
struct ENUM_SERVICE_STATUSW * services = NULL ;
2005-03-24 19:11:23 +03:00
WERROR result = WERR_GENERAL_FAILURE ;
2008-02-18 14:10:54 +03:00
NTSTATUS status ;
2005-03-24 21:05:31 +03:00
int i ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2008-02-18 13:48:51 +03:00
2012-12-21 19:03:51 +04:00
uint8_t * buffer ;
2009-01-09 18:18:51 +03:00
uint32_t buf_size = 0 ;
uint32_t bytes_needed = 0 ;
uint32_t num_services = 0 ;
uint32_t resume_handle = 0 ;
2005-03-24 19:11:23 +03:00
if ( argc ! = 0 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service list \n " , _ ( " Usage: " ) ) ;
2005-03-24 19:11:23 +03:00
return NT_STATUS_OK ;
}
2005-03-24 07:25:49 +03:00
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_ENUMERATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-24 19:11:23 +03:00
return werror_to_ntstatus ( result ) ;
2005-03-24 07:25:49 +03:00
}
2008-02-18 13:48:51 +03:00
2012-12-21 19:03:51 +04:00
buffer = talloc_array ( mem_ctx , uint8_t , buf_size ) ;
if ( buffer = = NULL ) {
status = NT_STATUS_NO_MEMORY ;
goto done ;
}
2009-01-09 18:18:51 +03:00
do {
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_EnumServicesStatusW ( b , mem_ctx ,
2009-01-09 18:18:51 +03:00
& hSCM ,
SERVICE_TYPE_WIN32 ,
SERVICE_STATE_ALL ,
buffer ,
buf_size ,
& bytes_needed ,
& num_services ,
& resume_handle ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr ,
_ ( " Failed to enumerate services. [%s] \n " ) ,
2011-01-12 01:21:41 +03:00
nt_errstr ( status ) ) ;
2009-01-09 18:18:51 +03:00
break ;
}
2008-02-18 13:48:51 +03:00
2009-01-09 18:18:51 +03:00
if ( W_ERROR_EQUAL ( result , WERR_MORE_DATA ) & & bytes_needed > 0 ) {
buf_size = bytes_needed ;
2012-12-21 19:03:51 +04:00
buffer = talloc_realloc ( mem_ctx , buffer , uint8_t , bytes_needed ) ;
if ( buffer = = NULL ) {
status = NT_STATUS_NO_MEMORY ;
break ;
}
2009-01-09 18:18:51 +03:00
continue ;
}
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
status = werror_to_ntstatus ( result ) ;
d_fprintf ( stderr ,
_ ( " Failed to enumerate services. [%s] \n " ) ,
win_errstr ( result ) ) ;
break ;
}
2009-01-09 18:18:51 +03:00
if ( num_services = = 0 ) {
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " No services returned \n " ) ) ;
2009-01-09 18:18:51 +03:00
break ;
}
2008-02-18 13:48:51 +03:00
2009-01-09 18:18:51 +03:00
{
enum ndr_err_code ndr_err ;
DATA_BLOB blob ;
struct ndr_pull * ndr ;
blob . length = buf_size ;
blob . data = talloc_steal ( mem_ctx , buffer ) ;
services = talloc_array ( mem_ctx , struct ENUM_SERVICE_STATUSW , num_services ) ;
if ( ! services ) {
status = NT_STATUS_NO_MEMORY ;
break ;
}
2010-05-10 02:42:06 +04:00
ndr = ndr_pull_init_blob ( & blob , mem_ctx ) ;
2009-01-09 18:18:51 +03:00
if ( ndr = = NULL ) {
status = NT_STATUS_NO_MEMORY ;
break ;
}
ndr_err = ndr_pull_ENUM_SERVICE_STATUSW_array (
ndr , num_services , services ) ;
if ( ! NDR_ERR_CODE_IS_SUCCESS ( ndr_err ) ) {
status = ndr_map_error2ntstatus ( ndr_err ) ;
break ;
}
for ( i = 0 ; i < num_services ; i + + ) {
d_printf ( " %-20s \" %s \" \n " ,
services [ i ] . service_name ,
services [ i ] . display_name ) ;
}
}
2008-02-18 13:48:51 +03:00
2009-01-09 18:18:51 +03:00
} while ( W_ERROR_EQUAL ( result , WERR_MORE_DATA ) ) ;
2005-03-24 21:05:31 +03:00
2012-12-21 19:03:51 +04:00
done :
2011-01-12 01:21:41 +03:00
if ( is_valid_policy_hnd ( & hSCM ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
}
2008-02-18 13:48:51 +03:00
2009-01-09 18:18:51 +03:00
return status ;
2008-02-18 13:48:51 +03:00
}
2005-03-24 07:25:49 +03:00
2005-03-25 01:32:31 +03:00
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static NTSTATUS rpc_service_status_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2008-02-18 13:48:51 +03:00
const char * domain_name ,
2005-09-30 21:13:37 +04:00
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2005-09-30 21:13:37 +04:00
int argc ,
const char * * argv )
2005-03-25 01:32:31 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle hSCM , hService ;
2005-03-25 01:32:31 +03:00
WERROR result = WERR_GENERAL_FAILURE ;
2008-02-18 14:10:54 +03:00
NTSTATUS status ;
2009-01-08 15:23:59 +03:00
struct SERVICE_STATUS service_status ;
2008-10-16 03:35:27 +04:00
struct QUERY_SERVICE_CONFIG config ;
uint32_t buf_size = sizeof ( config ) ;
uint32_t ret_size = 0 ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2008-02-18 13:48:51 +03:00
2005-03-25 01:32:31 +03:00
if ( argc ! = 1 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service status <service> \n " , _ ( " Usage: " ) ) ;
2005-03-25 01:32:31 +03:00
return NT_STATUS_OK ;
}
/* Open the Service Control Manager */
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_ENUMERATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-25 01:32:31 +03:00
return werror_to_ntstatus ( result ) ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 01:32:31 +03:00
/* Open the Service */
2008-02-18 13:48:51 +03:00
2011-01-12 21:00:16 +03:00
result = open_service ( b , mem_ctx , & hSCM , argv [ 0 ] ,
( SC_RIGHT_SVC_QUERY_STATUS | SC_RIGHT_SVC_QUERY_CONFIG ) ,
& hService ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-25 01:32:31 +03:00
goto done ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 01:32:31 +03:00
/* get the status */
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_QueryServiceStatus ( b , mem_ctx ,
2008-02-19 04:43:04 +03:00
& hService ,
& service_status ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr , _ ( " Query status request failed. [%s] \n " ) ,
nt_errstr ( status ) ) ;
goto done ;
}
2008-02-19 04:43:04 +03:00
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Query status request failed. [%s] \n " ) ,
win_errstr ( result ) ) ;
2005-03-25 01:32:31 +03:00
goto done ;
}
2008-02-18 13:48:51 +03:00
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " %s service is %s. \n " ) , argv [ 0 ] ,
svc_status_string ( service_status . state ) ) ;
2005-03-25 01:32:31 +03:00
/* get the config */
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_QueryServiceConfigW ( b , mem_ctx ,
2008-10-16 03:35:27 +04:00
& hService ,
& config ,
buf_size ,
& ret_size ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr , _ ( " Query config request failed. [%s] \n " ) ,
nt_errstr ( status ) ) ;
goto done ;
}
2008-10-16 03:35:27 +04:00
if ( W_ERROR_EQUAL ( result , WERR_INSUFFICIENT_BUFFER ) ) {
buf_size = ret_size ;
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_QueryServiceConfigW ( b , mem_ctx ,
2008-10-16 03:35:27 +04:00
& hService ,
& config ,
buf_size ,
& ret_size ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr , _ ( " Query config request failed. [%s] \n " ) ,
nt_errstr ( status ) ) ;
goto done ;
}
2008-10-16 03:35:27 +04:00
}
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Query config request failed. [%s] \n " ) ,
win_errstr ( result ) ) ;
2005-03-25 01:32:31 +03:00
goto done ;
}
/* print out the configuration information for the service */
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " Configuration details: \n " ) ) ;
d_printf ( _ ( " \t Controls Accepted = 0x%x \n " ) ,
service_status . controls_accepted ) ;
d_printf ( _ ( " \t Service Type = 0x%x \n " ) , config . service_type ) ;
d_printf ( _ ( " \t Start Type = 0x%x \n " ) , config . start_type ) ;
d_printf ( _ ( " \t Error Control = 0x%x \n " ) , config . error_control ) ;
d_printf ( _ ( " \t Tag ID = 0x%x \n " ) , config . tag_id ) ;
2005-03-25 01:32:31 +03:00
2008-10-16 03:35:27 +04:00
if ( config . executablepath ) {
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " \t Executable Path = %s \n " ) ,
config . executablepath ) ;
2005-03-25 01:32:31 +03:00
}
2008-10-16 03:35:27 +04:00
if ( config . loadordergroup ) {
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " \t Load Order Group = %s \n " ) ,
config . loadordergroup ) ;
2005-03-25 01:32:31 +03:00
}
2008-10-16 03:35:27 +04:00
if ( config . dependencies ) {
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " \t Dependencies = %s \n " ) ,
config . dependencies ) ;
2005-03-25 01:32:31 +03:00
}
2008-10-16 03:35:27 +04:00
if ( config . startname ) {
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " \t Start Name = %s \n " ) , config . startname ) ;
2005-03-25 01:32:31 +03:00
}
2008-10-16 03:35:27 +04:00
if ( config . displayname ) {
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " \t Display Name = %s \n " ) ,
config . displayname ) ;
2005-03-25 01:32:31 +03:00
}
2008-02-18 13:48:51 +03:00
done :
2011-01-12 01:21:41 +03:00
if ( is_valid_policy_hnd ( & hService ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hService , & _result ) ;
}
if ( is_valid_policy_hnd ( & hSCM ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
}
2005-09-30 21:13:37 +04:00
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
2008-02-18 13:48:51 +03:00
}
2005-03-25 03:38:30 +03:00
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static NTSTATUS rpc_service_stop_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2008-02-18 13:48:51 +03:00
const char * domain_name ,
2005-09-30 21:13:37 +04:00
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2005-09-30 21:13:37 +04:00
int argc ,
const char * * argv )
2005-03-25 03:38:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle hSCM ;
2005-03-25 03:38:30 +03:00
WERROR result = WERR_GENERAL_FAILURE ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
if ( argc ! = 1 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service status <service> \n " , _ ( " Usage: " ) ) ;
2005-03-25 03:38:30 +03:00
return NT_STATUS_OK ;
}
/* Open the Service Control Manager */
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_ENUMERATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
}
2008-02-18 13:48:51 +03:00
2011-01-12 21:12:07 +03:00
result = control_service ( pipe_hnd , mem_ctx , & hSCM , argv [ 0 ] ,
2005-03-25 03:38:30 +03:00
SVCCTL_CONTROL_STOP , SVCCTL_STOPPED ) ;
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
if ( is_valid_policy_hnd ( & hSCM ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
2008-02-18 13:48:51 +03:00
}
2005-03-25 03:38:30 +03:00
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static NTSTATUS rpc_service_pause_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2008-02-18 13:48:51 +03:00
const char * domain_name ,
2005-09-30 21:13:37 +04:00
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2005-09-30 21:13:37 +04:00
int argc ,
const char * * argv )
2005-03-25 03:38:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle hSCM ;
2005-03-25 03:38:30 +03:00
WERROR result = WERR_GENERAL_FAILURE ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
if ( argc ! = 1 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service status <service> \n " , _ ( " Usage: " ) ) ;
2005-03-25 03:38:30 +03:00
return NT_STATUS_OK ;
}
/* Open the Service Control Manager */
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_ENUMERATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
}
2008-02-18 13:48:51 +03:00
2011-01-12 21:12:07 +03:00
result = control_service ( pipe_hnd , mem_ctx , & hSCM , argv [ 0 ] ,
2005-03-25 03:38:30 +03:00
SVCCTL_CONTROL_PAUSE , SVCCTL_PAUSED ) ;
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
if ( is_valid_policy_hnd ( & hSCM ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 01:32:31 +03:00
return werror_to_ntstatus ( result ) ;
2008-02-18 13:48:51 +03:00
}
2005-03-24 07:25:49 +03:00
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static NTSTATUS rpc_service_resume_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2008-02-18 13:48:51 +03:00
const char * domain_name ,
2005-09-30 21:13:37 +04:00
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2005-09-30 21:13:37 +04:00
int argc ,
const char * * argv )
2005-03-25 03:38:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle hSCM ;
2005-03-25 03:38:30 +03:00
WERROR result = WERR_GENERAL_FAILURE ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
if ( argc ! = 1 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service status <service> \n " , _ ( " Usage: " ) ) ;
2005-03-25 03:38:30 +03:00
return NT_STATUS_OK ;
}
/* Open the Service Control Manager */
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_ENUMERATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
}
2008-02-18 13:48:51 +03:00
2011-01-12 21:12:07 +03:00
result = control_service ( pipe_hnd , mem_ctx , & hSCM , argv [ 0 ] ,
2005-03-25 03:38:30 +03:00
SVCCTL_CONTROL_CONTINUE , SVCCTL_RUNNING ) ;
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
if ( is_valid_policy_hnd ( & hSCM ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
2008-02-18 13:48:51 +03:00
}
2005-03-25 03:38:30 +03:00
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static NTSTATUS rpc_service_start_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2008-02-18 13:48:51 +03:00
const char * domain_name ,
2005-09-30 21:13:37 +04:00
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
2008-02-18 13:48:51 +03:00
TALLOC_CTX * mem_ctx ,
2005-09-30 21:13:37 +04:00
int argc ,
const char * * argv )
2005-03-25 03:38:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle hSCM , hService ;
2005-03-25 03:38:30 +03:00
WERROR result = WERR_GENERAL_FAILURE ;
2008-02-18 14:10:54 +03:00
NTSTATUS status ;
2005-03-25 03:38:30 +03:00
uint32 state = 0 ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
if ( argc ! = 1 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service status <service> \n " , _ ( " Usage: " ) ) ;
2005-03-25 03:38:30 +03:00
return NT_STATUS_OK ;
}
/* Open the Service Control Manager */
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_ENUMERATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
}
2008-02-18 13:48:51 +03:00
2011-01-12 01:21:41 +03:00
2005-03-25 03:38:30 +03:00
/* Open the Service */
2008-02-18 13:48:51 +03:00
2011-01-12 21:00:16 +03:00
result = open_service ( b , mem_ctx , & hSCM , argv [ 0 ] ,
SC_RIGHT_SVC_START ,
& hService ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-03-25 03:38:30 +03:00
goto done ;
}
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
/* get the status */
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_StartServiceW ( b , mem_ctx ,
2008-02-19 04:29:16 +03:00
& hService ,
0 ,
NULL ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr , _ ( " Query status request failed. [%s] \n " ) ,
nt_errstr ( status ) ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Query status request failed. [%s] \n " ) ,
win_errstr ( result ) ) ;
2005-03-25 03:38:30 +03:00
goto done ;
}
2008-02-18 13:48:51 +03:00
2008-02-18 14:45:13 +03:00
result = watch_service_state ( pipe_hnd , mem_ctx , & hSCM , argv [ 0 ] , SVCCTL_RUNNING , & state ) ;
2008-02-18 13:48:51 +03:00
2005-03-25 03:38:30 +03:00
if ( W_ERROR_IS_OK ( result ) & & ( state = = SVCCTL_RUNNING ) )
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " Successfully started service: %s \n " ) ,
argv [ 0 ] ) ;
2005-03-25 03:38:30 +03:00
else
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Failed to start service: %s [%s] \n " ) ,
argv [ 0 ] , win_errstr ( result ) ) ;
2008-02-18 13:48:51 +03:00
done :
2011-01-12 01:21:41 +03:00
if ( is_valid_policy_hnd ( & hService ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hService , & _result ) ;
}
if ( is_valid_policy_hnd ( & hSCM ) ) {
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
}
2005-09-30 21:13:37 +04:00
2005-03-25 03:38:30 +03:00
return werror_to_ntstatus ( result ) ;
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-04-08 23:45:04 +04:00
static NTSTATUS rpc_service_delete_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2009-04-08 23:45:04 +04:00
const char * domain_name ,
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
{
struct policy_handle hSCM , hService ;
WERROR result = WERR_GENERAL_FAILURE ;
NTSTATUS status ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2009-04-08 23:45:04 +04:00
if ( argc ! = 1 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service delete <service> \n " , _ ( " Usage: " ) ) ;
2009-04-08 23:45:04 +04:00
return NT_STATUS_OK ;
}
2011-01-12 01:21:41 +03:00
ZERO_STRUCT ( hSCM ) ;
ZERO_STRUCT ( hService ) ;
2009-04-08 23:45:04 +04:00
/* Open the Service Control Manager */
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_ENUMERATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-04-08 23:45:04 +04:00
return werror_to_ntstatus ( result ) ;
}
/* Open the Service */
2011-01-12 21:00:16 +03:00
result = open_service ( b , mem_ctx , & hSCM , argv [ 0 ] ,
SERVICE_ALL_ACCESS ,
& hService ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-04-08 23:45:04 +04:00
goto done ;
}
/* Delete the Service */
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_DeleteService ( b , mem_ctx ,
2009-04-08 23:45:04 +04:00
& hService ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
d_fprintf ( stderr , _ ( " Delete service request failed. [%s] \n " ) ,
nt_errstr ( status ) ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Delete service request failed. [%s] \n " ) ,
2009-04-08 23:45:04 +04:00
win_errstr ( result ) ) ;
goto done ;
}
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " Successfully deleted Service: %s \n " ) , argv [ 0 ] ) ;
2009-04-08 23:45:04 +04:00
done :
if ( is_valid_policy_hnd ( & hService ) ) {
2011-01-12 01:21:41 +03:00
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hService , & _result ) ;
2009-04-08 23:45:04 +04:00
}
if ( is_valid_policy_hnd ( & hSCM ) ) {
2011-01-12 01:21:41 +03:00
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
2009-04-08 23:45:04 +04:00
}
return werror_to_ntstatus ( result ) ;
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static NTSTATUS rpc_service_create_internal ( struct net_context * c ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2009-04-08 23:45:04 +04:00
const char * domain_name ,
struct cli_state * cli ,
struct rpc_pipe_client * pipe_hnd ,
TALLOC_CTX * mem_ctx ,
int argc ,
const char * * argv )
{
struct policy_handle hSCM , hService ;
WERROR result = WERR_GENERAL_FAILURE ;
NTSTATUS status ;
const char * ServiceName ;
const char * DisplayName ;
const char * binary_path ;
2011-01-12 01:21:41 +03:00
struct dcerpc_binding_handle * b = pipe_hnd - > binding_handle ;
2009-04-08 23:45:04 +04:00
if ( argc ! = 3 ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s net rpc service create <service> "
" <displayname> <binarypath> \n " , _ ( " Usage: " ) ) ;
2009-04-08 23:45:04 +04:00
return NT_STATUS_OK ;
}
2011-01-12 01:21:41 +03:00
ZERO_STRUCT ( hSCM ) ;
ZERO_STRUCT ( hService ) ;
2009-04-08 23:45:04 +04:00
/* Open the Service Control Manager */
2011-01-12 21:08:48 +03:00
result = open_scm ( b , mem_ctx , pipe_hnd - > srv_name_slash ,
SC_RIGHT_MGR_CREATE_SERVICE ,
& hSCM ) ;
2011-01-12 01:21:41 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2009-04-08 23:45:04 +04:00
return werror_to_ntstatus ( result ) ;
}
/* Create the service */
ServiceName = argv [ 0 ] ;
DisplayName = argv [ 1 ] ;
binary_path = argv [ 2 ] ;
2011-01-12 01:21:41 +03:00
status = dcerpc_svcctl_CreateServiceW ( b , mem_ctx ,
2009-04-08 23:45:04 +04:00
& hSCM ,
ServiceName ,
DisplayName ,
SERVICE_ALL_ACCESS ,
SERVICE_TYPE_WIN32_OWN_PROCESS ,
SVCCTL_DEMAND_START ,
SVCCTL_SVC_ERROR_NORMAL ,
binary_path ,
NULL , /* LoadOrderGroupKey */
NULL , /* TagId */
NULL , /* dependencies */
0 , /* dependencies_size */
NULL , /* service_start_name */
NULL , /* password */
0 , /* password_size */
& hService ,
& result ) ;
2011-01-12 01:21:41 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
2009-08-10 22:23:41 +04:00
d_fprintf ( stderr , _ ( " Create service request failed. [%s] \n " ) ,
2011-01-12 01:21:41 +03:00
nt_errstr ( status ) ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
d_fprintf ( stderr , _ ( " Create service request failed. [%s] \n " ) ,
win_errstr ( result ) ) ;
2009-04-08 23:45:04 +04:00
goto done ;
}
2009-08-10 22:23:41 +04:00
d_printf ( _ ( " Successfully created Service: %s \n " ) , argv [ 0 ] ) ;
2009-04-08 23:45:04 +04:00
done :
if ( is_valid_policy_hnd ( & hService ) ) {
2011-01-12 01:21:41 +03:00
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hService , & _result ) ;
2009-04-08 23:45:04 +04:00
}
if ( is_valid_policy_hnd ( & hSCM ) ) {
2011-01-12 01:21:41 +03:00
WERROR _result ;
dcerpc_svcctl_CloseServiceHandle ( b , mem_ctx , & hSCM , & _result ) ;
2009-04-08 23:45:04 +04:00
}
return werror_to_ntstatus ( result ) ;
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static int rpc_service_list ( struct net_context * c , int argc , const char * * argv )
2005-03-24 07:25:49 +03:00
{
2008-05-21 12:37:10 +04:00
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service list \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " View configured Win32 services " ) ) ;
2008-05-21 12:37:10 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_list_internal , argc , argv ) ;
2005-03-24 07:25:49 +03:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static int rpc_service_start ( struct net_context * c , int argc , const char * * argv )
2005-03-24 07:25:49 +03:00
{
2008-05-21 12:37:10 +04:00
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service start <service> \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " Start a Win32 service " ) ) ;
2008-05-21 12:37:10 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_start_internal , argc , argv ) ;
2005-03-24 07:25:49 +03:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static int rpc_service_stop ( struct net_context * c , int argc , const char * * argv )
2005-03-24 07:25:49 +03:00
{
2008-05-21 12:37:10 +04:00
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service stop <service> \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " Stop a Win32 service " ) ) ;
2008-05-21 12:37:10 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_stop_internal , argc , argv ) ;
2005-03-25 03:38:30 +03:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static int rpc_service_resume ( struct net_context * c , int argc , const char * * argv )
2005-03-25 03:38:30 +03:00
{
2008-05-21 12:37:10 +04:00
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service resume <service> \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " Resume a Win32 service " ) ) ;
2008-05-21 12:37:10 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_resume_internal , argc , argv ) ;
2005-03-24 07:25:49 +03:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static int rpc_service_pause ( struct net_context * c , int argc , const char * * argv )
2005-03-24 07:25:49 +03:00
{
2008-05-21 12:37:10 +04:00
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service pause <service> \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " Pause a Win32 service " ) ) ;
2008-05-21 12:37:10 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_pause_internal , argc , argv ) ;
2005-03-24 07:25:49 +03:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
static int rpc_service_status ( struct net_context * c , int argc , const char * * argv )
2005-03-24 07:25:49 +03:00
{
2008-05-21 12:37:10 +04:00
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service status <service> \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " Show the current status of a service " ) ) ;
2008-05-21 12:37:10 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_status_internal , argc , argv ) ;
2005-03-24 07:25:49 +03:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-04-08 23:45:04 +04:00
static int rpc_service_delete ( struct net_context * c , int argc , const char * * argv )
{
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service delete <service> \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " Delete a Win32 service " ) ) ;
2009-04-08 23:45:04 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_delete_internal , argc , argv ) ;
2009-04-08 23:45:04 +04:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int rpc_service_create ( struct net_context * c , int argc , const char * * argv )
{
if ( c - > display_usage ) {
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n "
2009-08-10 22:23:41 +04:00
" net rpc service create <service> \n "
2010-01-19 13:43:54 +03:00
" %s \n " ,
_ ( " Usage: " ) ,
_ ( " Create a Win32 service " ) ) ;
2009-04-08 23:45:04 +04:00
return 0 ;
}
2012-01-10 14:53:42 +04:00
return run_rpc_command ( c , NULL , & ndr_table_svcctl , 0 ,
2009-11-08 21:37:26 +03:00
rpc_service_create_internal , argc , argv ) ;
2009-04-08 23:45:04 +04:00
}
/********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-10 01:22:12 +04:00
int net_rpc_service ( struct net_context * c , int argc , const char * * argv )
2005-03-24 07:25:49 +03:00
{
2008-06-07 04:25:08 +04:00
struct functable func [ ] = {
2008-05-21 12:37:10 +04:00
{
" list " ,
rpc_service_list ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " View configured Win32 services " ) ,
N_ ( " net rpc service list \n "
" View configured Win32 services " )
2008-05-21 12:37:10 +04:00
} ,
{
" start " ,
rpc_service_start ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " Start a service " ) ,
N_ ( " net rpc service start \n "
" Start a service " )
2008-05-21 12:37:10 +04:00
} ,
{
" stop " ,
rpc_service_stop ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " Stop a service " ) ,
N_ ( " net rpc service stop \n "
" Stop a service " )
2008-05-21 12:37:10 +04:00
} ,
{
" pause " ,
rpc_service_pause ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " Pause a service " ) ,
N_ ( " net rpc service pause \n "
" Pause a service " )
2008-05-21 12:37:10 +04:00
} ,
{
" resume " ,
rpc_service_resume ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " Resume a paused service " ) ,
N_ ( " net rpc service resume \n "
" Resume a service " )
2008-05-21 12:37:10 +04:00
} ,
{
" status " ,
rpc_service_status ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " View current status of a service " ) ,
N_ ( " net rpc service status \n "
" View current status of a service " )
2008-05-21 12:37:10 +04:00
} ,
2009-04-08 23:45:04 +04:00
{
" delete " ,
rpc_service_delete ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " Delete a service " ) ,
N_ ( " net rpc service delete \n "
" Deletes a service " )
2009-04-08 23:45:04 +04:00
} ,
{
" create " ,
rpc_service_create ,
NET_TRANSPORT_RPC ,
2009-08-10 22:23:41 +04:00
N_ ( " Create a service " ) ,
N_ ( " net rpc service create \n "
" Creates a service " )
2009-04-08 23:45:04 +04:00
} ,
2008-05-21 12:37:10 +04:00
{ NULL , NULL , 0 , NULL , NULL }
2005-03-24 07:25:49 +03:00
} ;
2008-02-18 13:48:51 +03:00
2008-06-07 04:25:08 +04:00
return net_run_function ( c , argc , argv , " net rpc service " , func ) ;
2005-03-24 07:25:49 +03:00
}