diff options
-rw-r--r-- | source3/include/proto.h | 43 | ||||
-rw-r--r-- | source3/include/rpc_svcctl.h | 69 | ||||
-rw-r--r-- | source3/rpc_client/cli_svcctl.c | 74 | ||||
-rw-r--r-- | source3/rpc_parse/parse_misc.c | 37 | ||||
-rw-r--r-- | source3/rpc_parse/parse_svc.c | 194 | ||||
-rw-r--r-- | source3/rpcclient/cmd_svcctl.c | 74 | ||||
-rw-r--r-- | source3/rpcclient/rpcclient.c | 6 |
7 files changed, 243 insertions, 254 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index df06ac2e9d..d99ba9e27c 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -2136,11 +2136,16 @@ BOOL svc_query_svc_cfg(struct cli_state *cli, uint16 fnum, QUERY_SERVICE_CONFIG *cfg, uint32 *buf_size); BOOL svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd); -BOOL svc_query_unknown_1b(struct cli_state *cli, uint16 fnum, - const POLICY_HND *pol, uint32 switch_value, - uint32 unknown_1, - uint32 *num_items, - uint32 ***items); +BOOL svc_change_svc_cfg(struct cli_state *cli, uint16 fnum, + POLICY_HND *hnd, + uint32 service_type, uint32 start_type, + uint32 unknown_0, + uint32 error_control, + char* bin_path_name, char* load_order_grp, + uint32 tag_id, + char* dependencies, char* service_start_name, + char* password, + char* disp_name); /*The following definitions come from rpc_client/cli_wkssvc.c */ @@ -2445,7 +2450,8 @@ BOOL make_buffer2_multi(BUFFER2 *str, char *const* const buf, uint32 num); BOOL make_buffer2(BUFFER2 *str, const char *buf, int len); BOOL smb_io_buffer2(char *desc, BUFFER2 *buf2, uint32 buffer, prs_struct *ps, int depth); BOOL make_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf); -BOOL make_string2(STRING2 *str, char *buf, int len); +BOOL make_string2(STRING2 *str, const char *buf, int len); +BOOL make_buf_string2(STRING2 *str, uint32 *ptr, const char *buf); BOOL smb_io_string2(char *desc, STRING2 *str2, uint32 buffer, prs_struct *ps, int depth); BOOL make_unistr2(UNISTR2 *str, const char *buf, int len); BOOL smb_io_unistr2(char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct *ps, int depth); @@ -3434,16 +3440,19 @@ BOOL svc_io_r_query_disp_name(char *desc, SVC_R_QUERY_DISP_NAME *r_u, prs_struct BOOL make_svc_q_close(SVC_Q_CLOSE *q_c, POLICY_HND *hnd); BOOL svc_io_q_close(char *desc, SVC_Q_CLOSE *q_u, prs_struct *ps, int depth); BOOL svc_io_r_close(char *desc, SVC_R_CLOSE *r_u, prs_struct *ps, int depth); -BOOL make_svc_q_unknown_1b(SVC_Q_UNKNOWN_1B *q_u, - const POLICY_HND *pol, uint32 switch_value, - uint32 unknown_1); -BOOL svc_io_q_unknown_1b(char *desc, SVC_Q_UNKNOWN_1B *q_u, prs_struct *ps, int depth); -BOOL make_svc_r_unknown_1b(SVC_R_UNKNOWN_1B *r_u, - uint32 switch_value, uint32 unknown_1, - uint32 num_items, uint32 **item, - uint32 status); -BOOL svc_io_r_unknown_1b(char *desc, SVC_R_UNKNOWN_1B *r_u, prs_struct *ps, int depth); -void svc_free_r_unknown_1b(SVC_R_UNKNOWN_1B *r_u); +BOOL make_svc_q_change_svc_config(SVC_Q_CHANGE_SVC_CONFIG *q_u, POLICY_HND *hnd, + uint32 service_type, uint32 start_type, + uint32 unknown_0, + uint32 error_control, + char* bin_path_name, char* load_order_grp, + uint32 tag_id, + char* dependencies, char* service_start_name, + char* password, + char* disp_name); +BOOL svc_io_q_change_svc_config(char *desc, SVC_Q_CHANGE_SVC_CONFIG *q_u, prs_struct *ps, int depth); +BOOL make_svc_r_change_svc_config(SVC_R_CHANGE_SVC_CONFIG *r_c, + uint32 unknown_0, uint32 status); +BOOL svc_io_r_change_svc_config(char *desc, SVC_R_CHANGE_SVC_CONFIG *r_u, prs_struct *ps, int depth); /*The following definitions come from rpc_parse/parse_wks.c */ @@ -3681,7 +3690,7 @@ BOOL msrpc_svc_enum(struct client_info *info, void cmd_svc_enum(struct client_info *info, int argc, char *argv[]); void cmd_svc_stop(struct client_info *info, int argc, char *argv[]); void cmd_svc_start(struct client_info *info, int argc, char *argv[]); -void cmd_svc_test(struct client_info *info, int argc, char *argv[]); +void cmd_svc_set(struct client_info *info, int argc, char *argv[]); /*The following definitions come from rpcclient/cmd_wkssvc.c */ diff --git a/source3/include/rpc_svcctl.h b/source3/include/rpc_svcctl.h index 1815de8532..ecd1188fe8 100644 --- a/source3/include/rpc_svcctl.h +++ b/source3/include/rpc_svcctl.h @@ -26,15 +26,15 @@ /* svcctl pipe */ -#define SVC_OPEN_SC_MAN 0x0f -#define SVC_ENUM_SVCS_STATUS 0x0e -#define SVC_QUERY_SVC_CONFIG 0x11 -#define SVC_QUERY_DISP_NAME 0x14 -#define SVC_OPEN_SERVICE 0x10 -#define SVC_START_SERVICE 0x13 -#define SVC_STOP_SERVICE 0x01 -#define SVC_UNKNOWN_1B 0x1b -#define SVC_CLOSE 0x00 +#define SVC_OPEN_SC_MAN 0x0f +#define SVC_ENUM_SVCS_STATUS 0x0e +#define SVC_QUERY_SVC_CONFIG 0x11 +#define SVC_QUERY_DISP_NAME 0x14 +#define SVC_CHANGE_SVC_CONFIG 0x0b +#define SVC_OPEN_SERVICE 0x10 +#define SVC_START_SERVICE 0x13 +#define SVC_STOP_SERVICE 0x01 +#define SVC_CLOSE 0x00 /* SVC_Q_OPEN_SC_MAN */ @@ -244,30 +244,45 @@ typedef struct r_svc_close_info } SVC_R_CLOSE; -/* SVC_Q_UNKNOWN_1B */ -typedef struct q_svc_unk_1b_info +/* SVC_Q_CHANGE_SVC_CONFIG */ +typedef struct q_svc_change_svc_cfg_info { - POLICY_HND pol; /* service policy handle */ - uint32 switch_value; /* 0x01 */ - uint32 unknown_1; /* 0x0000 0228 */ + POLICY_HND pol; + uint32 service_type; + uint32 start_type; + uint32 unknown_0; + uint32 error_control; + + uint32 ptr_bin_path_name; + UNISTR2 uni_bin_path_name; + + uint32 ptr_load_order_grp; + UNISTR2 uni_load_order_grp; + + uint32 tag_id; -} SVC_Q_UNKNOWN_1B; + uint32 ptr_dependencies; + UNISTR2 uni_dependencies; + + uint32 ptr_service_start_name; + UNISTR2 uni_service_start_name; + + uint32 ptr_password; + STRING2 str_password; -/* SVC_R_UNKNOWN_1B */ -typedef struct r_svc_unk_1b_info + uint32 ptr_display_name; + UNISTR2 uni_display_name; + +} SVC_Q_CHANGE_SVC_CONFIG; + +/* SVC_R_CHANGE_SVC_CONFIG */ +typedef struct r_svc_change_svc_cfg_info { - uint32 switch_value1; /* 0x01 */ - uint32 ptr; - uint32 switch_value2; /* 0x01 */ - uint32 unknown_1; /* 0x0000 0228 */ - uint32 num_items1; - uint32 *ptr_items; - uint32 num_items2; - uint32 **items; + uint32 unknown_0; /* */ + uint32 status; /* return status */ - uint32 status; +} SVC_R_CHANGE_SVC_CONFIG; -} SVC_R_UNKNOWN_1B; #endif /* _RPC_SVCCTL_H */ diff --git a/source3/rpc_client/cli_svcctl.c b/source3/rpc_client/cli_svcctl.c index bba6342db8..f85e37dcb5 100644 --- a/source3/rpc_client/cli_svcctl.c +++ b/source3/rpc_client/cli_svcctl.c @@ -479,61 +479,73 @@ BOOL svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd) } /**************************************************************************** -do a SVC Query Lookup RIDS +do a SVC Change Service Config ****************************************************************************/ -BOOL svc_query_unknown_1b(struct cli_state *cli, uint16 fnum, - const POLICY_HND *pol, uint32 switch_value, - uint32 unknown_1, - uint32 *num_items, - uint32 ***items) +BOOL svc_change_svc_cfg(struct cli_state *cli, uint16 fnum, + POLICY_HND *hnd, + uint32 service_type, uint32 start_type, + uint32 unknown_0, + uint32 error_control, + char* bin_path_name, char* load_order_grp, + uint32 tag_id, + char* dependencies, char* service_start_name, + char* password, + char* disp_name) { - prs_struct data; - prs_struct rdata; - - SVC_Q_UNKNOWN_1B q_o; - BOOL valid_query = False; + prs_struct rbuf; + prs_struct buf; + SVC_Q_CHANGE_SVC_CONFIG q_c; + BOOL valid_cfg = False; - if (pol == NULL || num_items == NULL || items == NULL ) return False; + if (hnd == NULL) return False; - /* create and send a MSRPC command with api SVC_UNKNOWN_1B */ + /* create and send a MSRPC command with api SVC_CHANGE_SVC_CONFIG */ - prs_init(&data , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True ); + prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); + prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - DEBUG(4,("SVC Query Unknown 1b.\n")); + DEBUG(4,("SVC Change Service Config\n")); /* store the parameters */ - make_svc_q_unknown_1b(&q_o, pol, switch_value, unknown_1); + make_svc_q_change_svc_config(&q_c, hnd, + service_type, start_type, + unknown_0, error_control, + bin_path_name, load_order_grp, + tag_id, + dependencies, service_start_name, + password, disp_name); /* turn parameters into data stream */ - svc_io_q_unknown_1b("", &q_o, &data, 0); + svc_io_q_change_svc_config("", &q_c, &buf, 0); /* send the data on \PIPE\ */ - if (rpc_api_pipe_req(cli, fnum, SVC_UNKNOWN_1B, &data, &rdata)) + if (rpc_api_pipe_req(cli, fnum, SVC_CHANGE_SVC_CONFIG, &buf, &rbuf)) { - SVC_R_UNKNOWN_1B r_o; + SVC_R_CHANGE_SVC_CONFIG r_c; BOOL p; - ZERO_STRUCT(r_o); - svc_io_r_unknown_1b("", &r_o, &rdata, 0); - p = rdata.offset != 0; - - if (p && r_o.status != 0) + ZERO_STRUCT (r_c); + + svc_io_r_change_svc_config("", &r_c, &rbuf, 0); + p = rbuf.offset != 0; + + if (p && r_c.status != 0) { /* report error code */ - DEBUG(4,("SVC_R_UNKNOWN_1B: %s\n", get_nt_error_msg(r_o.status))); + DEBUG(1,("SVC_CHANGE_SVC_CONFIG: %s\n", get_nt_error_msg(r_c.status))); p = False; } if (p) { - (*num_items) = r_o.num_items1; - (*items) = r_o.items; + valid_cfg = True; } } - prs_mem_free(&data ); - prs_mem_free(&rdata ); + prs_mem_free(&rbuf); + prs_mem_free(&buf ); - return valid_query; + return valid_cfg; } + + diff --git a/source3/rpc_parse/parse_misc.c b/source3/rpc_parse/parse_misc.c index 2f2c68648a..fe65aaf4d4 100644 --- a/source3/rpc_parse/parse_misc.c +++ b/source3/rpc_parse/parse_misc.c @@ -777,16 +777,37 @@ BOOL make_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf) /******************************************************************* creates a STRING2 structure. ********************************************************************/ -BOOL make_string2(STRING2 *str, char *buf, int len) +BOOL make_string2(STRING2 *str, const char *buf, int len) { - /* set up string lengths. */ - str->str_max_len = len; - str->undoc = 0; - str->str_str_len = len; + /* set up string lengths. */ + str->str_max_len = len; + str->undoc = 0; + str->str_str_len = len; + + /* store the string */ + if(len != 0) + { + memcpy(str->buffer, buf, len); + } - /* store the string */ - if(len != 0) - memcpy(str->buffer, buf, len); + return True; +} + +/******************************************************************* +creates a STRING2 structure: sets up the buffer, too +********************************************************************/ +BOOL make_buf_string2(STRING2 *str, uint32 *ptr, const char *buf) +{ + if (buf != NULL) + { + *ptr = 1; + make_string2(str, buf, strlen(buf)+1); + } + else + { + *ptr = 0; + make_string2(str, "", 0); + } return True; } diff --git a/source3/rpc_parse/parse_svc.c b/source3/rpc_parse/parse_svc.c index b35b98a354..93ad0dcced 100644 --- a/source3/rpc_parse/parse_svc.c +++ b/source3/rpc_parse/parse_svc.c @@ -822,20 +822,35 @@ BOOL svc_io_r_close(char *desc, SVC_R_CLOSE *r_u, prs_struct *ps, int depth) } /******************************************************************* -makes a SVC_Q_UNKNOWN_1B structure. +makes an SVC_Q_CHANGE_SVC_CONFIG structure. ********************************************************************/ -BOOL make_svc_q_unknown_1b(SVC_Q_UNKNOWN_1B *q_u, - const POLICY_HND *pol, uint32 switch_value, - uint32 unknown_1) +BOOL make_svc_q_change_svc_config(SVC_Q_CHANGE_SVC_CONFIG *q_u, POLICY_HND *hnd, + uint32 service_type, uint32 start_type, + uint32 unknown_0, + uint32 error_control, + char* bin_path_name, char* load_order_grp, + uint32 tag_id, + char* dependencies, char* service_start_name, + char* password, + char* disp_name) { - if (q_u == NULL) return False; + if (q_u == NULL || hnd == NULL) return False; - DEBUG(5,("make_svc_r_unknwon_12\n")); + DEBUG(5,("make_svc_q_change_svc_config\n")); - memcpy(&(q_u->pol), pol, sizeof(*pol)); + memcpy(&(q_u->pol), hnd, sizeof(q_u->pol)); - q_u->switch_value = switch_value; - q_u->unknown_1 = unknown_1; + q_u->service_type = service_type; + q_u->start_type = start_type; + q_u->unknown_0 = unknown_0; + q_u->error_control = error_control; + make_buf_unistr2(&(q_u->uni_bin_path_name ), &(q_u->ptr_bin_path_name ), bin_path_name ); + make_buf_unistr2(&(q_u->uni_load_order_grp ), &(q_u->ptr_load_order_grp ), load_order_grp ); + q_u->tag_id = tag_id; + make_buf_unistr2(&(q_u->uni_dependencies ), &(q_u->ptr_dependencies ), dependencies ); + make_buf_unistr2(&(q_u->uni_service_start_name), &(q_u->ptr_service_start_name), service_start_name); + make_buf_string2(&(q_u->str_password ), &(q_u->ptr_password ), password ); + make_buf_unistr2(&(q_u->uni_display_name ), &(q_u->ptr_display_name ), disp_name ); return True; } @@ -843,67 +858,60 @@ BOOL make_svc_q_unknown_1b(SVC_Q_UNKNOWN_1B *q_u, /******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL svc_io_q_unknown_1b(char *desc, SVC_Q_UNKNOWN_1B *q_u, prs_struct *ps, int depth) +BOOL svc_io_q_change_svc_config(char *desc, SVC_Q_CHANGE_SVC_CONFIG *q_u, prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "svc_io_q_unknown_1b"); + prs_debug(ps, depth, desc, "svc_io_q_change_svc_config"); depth++; prs_align(ps); - smb_io_pol_hnd("pol", &(q_u->pol), ps, depth); + smb_io_pol_hnd("", &(q_u->pol), ps, depth); + prs_align(ps); + + prs_uint32("service_type ", ps, depth, &(q_u->service_type )); + prs_uint32("start_type ", ps, depth, &(q_u->start_type )); + prs_uint32("unknown_0 ", ps, depth, &(q_u->unknown_0 )); + prs_uint32("error_control ", ps, depth, &(q_u->error_control )); + prs_uint32("ptr_bin_path_name ", ps, depth, &(q_u->ptr_bin_path_name )); + smb_io_unistr2("uni_bin_path_name ", &(q_u->uni_bin_path_name ), q_u->ptr_bin_path_name , ps, depth); + prs_align(ps); + + prs_uint32("ptr_load_order_grp ", ps, depth, &(q_u->ptr_load_order_grp )); + smb_io_unistr2("uni_load_order_grp ", &(q_u->uni_load_order_grp ), q_u->ptr_load_order_grp , ps, depth); + prs_align(ps); + prs_uint32("tag_id ", ps, depth, &(q_u->tag_id )); + prs_uint32("ptr_dependencies ", ps, depth, &(q_u->ptr_dependencies )); + smb_io_unistr2("uni_dependencies ", &(q_u->uni_dependencies ), q_u->ptr_dependencies , ps, depth); + prs_align(ps); + prs_uint32("ptr_service_start_name", ps, depth, &(q_u->ptr_service_start_name)); + smb_io_unistr2("uni_service_start_name", &(q_u->uni_service_start_name), q_u->ptr_service_start_name, ps, depth); + prs_align(ps); + prs_uint32("ptr_password ", ps, depth, &(q_u->ptr_password )); + + smb_io_string2("str_password ", &(q_u->str_password ), q_u->ptr_display_name , ps, depth); prs_align(ps); - prs_uint32("switch_value", ps, depth, &(q_u->switch_value)); - prs_uint32("unknown_1 ", ps, depth, &(q_u->unknown_1 )); + prs_uint32("ptr_display_name ", ps, depth, &(q_u->ptr_display_name )); + smb_io_unistr2("uni_display_name ", &(q_u->uni_display_name ), q_u->ptr_display_name , ps, depth); + prs_align(ps); return True; } /******************************************************************* -makes a SVC_R_UNKNOWN_1B structure. +makes an SVC_R_CHANGE_SVC_CONFIG structure. ********************************************************************/ -BOOL make_svc_r_unknown_1b(SVC_R_UNKNOWN_1B *r_u, - uint32 switch_value, uint32 unknown_1, - uint32 num_items, uint32 **item, - uint32 status) +BOOL make_svc_r_change_svc_config(SVC_R_CHANGE_SVC_CONFIG *r_c, + uint32 unknown_0, uint32 status) { - uint32 i; - if (r_u == NULL) return False; - - DEBUG(5,("make_svc_r_unknown_1b\n")); - - if (status == 0x0) - { - r_u->num_items1 = num_items; - r_u->ptr = 1; - r_u->num_items2 = num_items; - - r_u->items = item; - if (num_items != 0) - { - r_u->ptr_items = (uint32*)malloc(num_items * sizeof(r_u->ptr_items[0])); - if (r_u->ptr_items == NULL) - { - svc_free_r_unknown_1b(r_u); - return False; - } - for (i = 0; i < num_items; i++) - { - r_u->ptr_items[i] = item[i] != NULL ? 1 : 0; - } - } + if (r_c == NULL) return False; - } - else - { - r_u->num_items1 = num_items; - r_u->ptr_items = 0; - r_u->num_items2 = num_items; - } + DEBUG(5,("make_svc_r_change_svc_config\n")); - r_u->status = status; + r_c->unknown_0 = unknown_0; + r_c->status = status; return True; } @@ -911,92 +919,18 @@ BOOL make_svc_r_unknown_1b(SVC_R_UNKNOWN_1B *r_u, /******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL svc_io_r_unknown_1b(char *desc, SVC_R_UNKNOWN_1B *r_u, prs_struct *ps, int depth) +BOOL svc_io_r_change_svc_config(char *desc, SVC_R_CHANGE_SVC_CONFIG *r_u, prs_struct *ps, int depth) { - uint32 i; - uint32 count = 0; - fstring tmp; if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "svc_io_r_unknown_1b"); + prs_debug(ps, depth, desc, "svc_io_r_change_svc_config"); depth++; prs_align(ps); - prs_uint32("num_items1", ps, depth, &(r_u->num_items1)); - prs_uint32("ptr ", ps, depth, &(r_u->ptr )); - prs_uint32("num_items2", ps, depth, &(r_u->num_items2)); - - if (r_u->ptr_items != 0 && r_u->num_items1 != 0) - { - r_u->ptr_items = (uint32*)Realloc(r_u->ptr_items, - r_u->num_items2 * sizeof(r_u->ptr_items[0])); - if (r_u->ptr_items == NULL) - { - return False; - } - - for (i = 0; i < r_u->num_items2; i++) - { - prs_grow(ps); - slprintf(tmp, sizeof(tmp) - 1, "ptr_item[%02d]", i); - prs_uint32(tmp, ps, depth, &(r_u->ptr_items[i])); - } - - for (i = 0; i < r_u->num_items2; i++) - { - slprintf(tmp, sizeof(tmp) - 1, "item[%02d]", i); - - if (ps->io) - { - /* reading */ - if (r_u->ptr_items[i] != 0) - { - uint32 item; - prs_uint32(tmp, ps, depth, &item); - add_uint32s_to_array(&count, &r_u->items, &item); - } - else - { - add_uint32s_to_array(&count, &r_u->items, NULL); - } - } - else - { - /* writing */ - if (r_u->ptr_items[i] != 0) - { - prs_uint32(tmp, ps, depth, r_u->items[i]); - } - } - } - } - - prs_uint32("status", ps, depth, &(r_u->status)); - - if (!ps->io) - { - /* storing. don't need memory any more */ - svc_free_r_unknown_1b(r_u); - } + prs_uint32("unknown_0", ps, depth, &(r_u->unknown_0)); + prs_uint32("status ", ps, depth, &(r_u->status )); return True; } -/******************************************************************* -frees a structure. -********************************************************************/ -void svc_free_r_unknown_1b(SVC_R_UNKNOWN_1B *r_u) -{ - if (r_u->ptr_items != NULL) - { - free(r_u->ptr_items); - r_u->ptr_items = NULL; - } - if (r_u->items != NULL) - { - free_uint32_array(r_u->num_items1, r_u->items); - r_u->items = NULL; - r_u->num_items1 = 0; - } -} diff --git a/source3/rpcclient/cmd_svcctl.c b/source3/rpcclient/cmd_svcctl.c index 6d2311b962..708dd49de1 100644 --- a/source3/rpcclient/cmd_svcctl.c +++ b/source3/rpcclient/cmd_svcctl.c @@ -383,19 +383,21 @@ void cmd_svc_start(struct client_info *info, int argc, char *argv[]) } /**************************************************************************** -nt test service +nt service set ****************************************************************************/ -void cmd_svc_test(struct client_info *info, int argc, char *argv[]) +void cmd_svc_set(struct client_info *info, int argc, char *argv[]) { uint16 fnum; BOOL res = True; - BOOL res1 = True; - char *svc_name; BOOL res2 = True; + BOOL res3; POLICY_HND pol_svc; + QUERY_SERVICE_CONFIG cfg; + uint32 svc_buf_size = 0x8000; + + char *svc_name; + POLICY_HND pol_scm; - uint32 num_items = 0; - uint32 **items = NULL; fstring srv_name; @@ -403,63 +405,59 @@ void cmd_svc_test(struct client_info *info, int argc, char *argv[]) fstrcat(srv_name, info->myhostname); strupper(srv_name); - DEBUG(4,("cmd_svc_test: server:%s\n", srv_name)); + DEBUG(4,("cmd_svc_set: server:%s\n", srv_name)); if (argc < 2) { - report(out_hnd,"svctest <service name>]\n"); + report(out_hnd,"svcset <service name>\n"); return; } - argv++; - argc--; - - svc_name = argv[0]; - - argv++; - argc--; + svc_name = argv[1]; /* open SVCCTL session. */ res = res ? cli_nt_session_open(smb_cli, PIPE_SVCCTL, &fnum) : False; /* open service control manager receive a policy handle */ res = res ? svc_open_sc_man(smb_cli, fnum, - srv_name, NULL, 0x80000000, + srv_name, NULL, 0x80000004, &pol_scm) : False; - res1 = res ? svc_open_service(smb_cli, fnum, + res2 = res ? svc_open_service(smb_cli, fnum, &pol_scm, - svc_name, 0x80000010, + svc_name, 0x80000001, &pol_svc) : False; - res2 = res1 ? svc_query_unknown_1b(smb_cli, fnum, - &pol_svc, 1, 0x227, - &num_items, &items) : False; + res3 = res2 ? svc_query_svc_cfg(smb_cli, fnum, + &pol_svc, &cfg, + &svc_buf_size) : False; - res1 = res1 ? svc_close(smb_cli, fnum, &pol_svc) : False; - res = res ? svc_close(smb_cli, fnum, &pol_scm) : False; + if (res3) + { + res3 = svc_change_svc_cfg(smb_cli, fnum, &pol_svc, + cfg.service_type, + cfg.start_type, + 0xffffffff, + 0, + NULL, NULL, + cfg.tag_id, + NULL, "administrator", NULL, NULL); + + } + + res2 = res2 ? svc_close(smb_cli, fnum, &pol_svc) : False; + + res = res ? svc_close(smb_cli, fnum, &pol_scm) : False; /* close the session */ cli_nt_session_close(smb_cli, fnum); - if (res2) + if (res3) { - uint32 i; - report(out_hnd,"Test 0x1b Service %s\n", svc_name); - for (i = 0; i < num_items; i++) - { - if (items[i] != NULL) - { - report(out_hnd, "%x\n", *items[i]); - } - } - DEBUG(5,("cmd_svc_test: succeeded\n")); + DEBUG(5,("cmd_svc_set: change succeeded\n")); } else - report(out_hnd,"Failed Test 0x1b (%s)\n", svc_name); { - DEBUG(5,("cmd_svc_test: failed\n")); + DEBUG(5,("cmd_svc_set: change failed\n")); } - - free_uint32_array(num_items, items); } diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index de0f72c65d..f242f9c4ea 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -158,9 +158,9 @@ commands[] = }, { - "svctest", - cmd_svc_test, - "<service> Test Service", + "svcset", + cmd_svc_set, + "<service> Test Set Service", {COMPL_SVCLST, COMPL_NONE} }, |