diff options
Diffstat (limited to 'source3/rpc_client/cli_samr.c')
-rw-r--r-- | source3/rpc_client/cli_samr.c | 374 |
1 files changed, 371 insertions, 3 deletions
diff --git a/source3/rpc_client/cli_samr.c b/source3/rpc_client/cli_samr.c index 4fc1c3f5a0..e950269ec3 100644 --- a/source3/rpc_client/cli_samr.c +++ b/source3/rpc_client/cli_samr.c @@ -150,6 +150,38 @@ BOOL get_samr_query_usergroups(struct cli_state *cli, } /**************************************************************************** +do a SAMR delete group +****************************************************************************/ +BOOL delete_samr_dom_group(struct cli_state *cli, + POLICY_HND *pol_open_domain, + uint32 group_rid) +{ + POLICY_HND pol_open_group; + + if (pol_open_domain == NULL) return False; + + /* send open domain (on group rid) */ + if (!samr_open_group(cli, pol_open_domain, + 0x00000010, group_rid, + &pol_open_group)) + { + return False; + } + + /* send group delete */ + if (!samr_delete_dom_group(cli, &pol_open_group)) + + { + DEBUG(5,("delete_samr_dom_group: error in delete domain group\n")); + samr_close(cli, &pol_open_group); + return False; + } + + return True; +} + + +/**************************************************************************** do a SAMR query group members ****************************************************************************/ BOOL get_samr_query_groupmem(struct cli_state *cli, @@ -182,6 +214,37 @@ BOOL get_samr_query_groupmem(struct cli_state *cli, } /**************************************************************************** +do a SAMR delete alias +****************************************************************************/ +BOOL delete_samr_dom_alias(struct cli_state *cli, + POLICY_HND *pol_open_domain, + uint32 alias_rid) +{ + POLICY_HND pol_open_alias; + + if (pol_open_domain == NULL) return False; + + /* send open domain (on alias rid) */ + if (!samr_open_alias(cli, pol_open_domain, + 0x000f001f, alias_rid, &pol_open_alias)) + { + return False; + } + + /* send alias delete */ + if (!samr_delete_dom_alias(cli, &pol_open_alias)) + + { + DEBUG(5,("delete_samr_dom_alias: error in delete domain alias\n")); + samr_close(cli, &pol_open_alias); + return False; + } + + return True; +} + + +/**************************************************************************** do a SAMR query alias members ****************************************************************************/ BOOL get_samr_query_aliasmem(struct cli_state *cli, @@ -195,7 +258,7 @@ BOOL get_samr_query_aliasmem(struct cli_state *cli, /* send open domain (on alias sid) */ if (!samr_open_alias(cli, pol_open_domain, - alias_rid, + 0x000f001f, alias_rid, &pol_open_alias)) { return False; @@ -842,7 +905,8 @@ BOOL samr_open_user(struct cli_state *cli, do a SAMR Open Alias ****************************************************************************/ BOOL samr_open_alias(struct cli_state *cli, - POLICY_HND *domain_pol, uint32 rid, + POLICY_HND *domain_pol, + uint32 flags, uint32 rid, POLICY_HND *alias_pol) { prs_struct data; @@ -861,7 +925,7 @@ BOOL samr_open_alias(struct cli_state *cli, prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True ); /* store the parameters */ - make_samr_q_open_alias(&q_o, domain_pol, 0x000f001f, rid); + make_samr_q_open_alias(&q_o, domain_pol, flags, rid); /* turn parameters into data stream */ samr_io_q_open_alias("", &q_o, &data, 0); @@ -896,6 +960,61 @@ BOOL samr_open_alias(struct cli_state *cli, } /**************************************************************************** +do a SAMR Delete Alias Member +****************************************************************************/ +BOOL samr_del_aliasmem(struct cli_state *cli, + POLICY_HND *alias_pol, DOM_SID *sid) +{ + prs_struct data; + prs_struct rdata; + + SAMR_Q_DEL_ALIASMEM q_o; + BOOL valid_pol = False; + + if (alias_pol == NULL || sid == NULL) return False; + + /* create and send a MSRPC command with api SAMR_DEL_ALIASMEM */ + + prs_init(&data , 1024, 4, SAFETY_MARGIN, False); + prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True ); + + DEBUG(4,("SAMR Delete Alias Member.\n")); + + /* store the parameters */ + make_samr_q_del_aliasmem(&q_o, alias_pol, sid); + + /* turn parameters into data stream */ + samr_io_q_del_aliasmem("", &q_o, &data, 0); + + /* send the data on \PIPE\ */ + if (rpc_api_pipe_req(cli, SAMR_DEL_ALIASMEM, &data, &rdata)) + { + SAMR_R_DEL_ALIASMEM r_o; + BOOL p; + + samr_io_r_del_aliasmem("", &r_o, &rdata, 0); + p = rdata.offset != 0; + + if (p && r_o.status != 0) + { + /* report error code */ + DEBUG(0,("SAMR_R_DEL_ALIASMEM: %s\n", get_nt_error_msg(r_o.status))); + p = False; + } + + if (p) + { + valid_pol = True; + } + } + + prs_mem_free(&data ); + prs_mem_free(&rdata ); + + return valid_pol; +} + +/**************************************************************************** do a SAMR Add Alias Member ****************************************************************************/ BOOL samr_add_aliasmem(struct cli_state *cli, @@ -951,6 +1070,61 @@ BOOL samr_add_aliasmem(struct cli_state *cli, } /**************************************************************************** +do a SAMR Delete Domain Alias +****************************************************************************/ +BOOL samr_delete_dom_alias(struct cli_state *cli, + POLICY_HND *alias_pol) +{ + prs_struct data; + prs_struct rdata; + + SAMR_Q_DELETE_DOM_ALIAS q_o; + BOOL valid_pol = False; + + if (alias_pol == NULL) return False; + + /* delete and send a MSRPC command with api SAMR_DELETE_DOM_ALIAS */ + + prs_init(&data , 1024, 4, SAFETY_MARGIN, False); + prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True ); + + DEBUG(4,("SAMR Delete Domain Alias.\n")); + + /* store the parameters */ + make_samr_q_delete_dom_alias(&q_o, alias_pol); + + /* turn parameters into data stream */ + samr_io_q_delete_dom_alias("", &q_o, &data, 0); + + /* send the data on \PIPE\ */ + if (rpc_api_pipe_req(cli, SAMR_DELETE_DOM_ALIAS, &data, &rdata)) + { + SAMR_R_DELETE_DOM_ALIAS r_o; + BOOL p; + + samr_io_r_delete_dom_alias("", &r_o, &rdata, 0); + p = rdata.offset != 0; + + if (p && r_o.status != 0) + { + /* report error code */ + DEBUG(0,("SAMR_R_DELETE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status))); + p = False; + } + + if (p) + { + valid_pol = True; + } + } + + prs_mem_free(&data ); + prs_mem_free(&rdata ); + + return valid_pol; +} + +/**************************************************************************** do a SAMR Create Domain Alias ****************************************************************************/ BOOL samr_create_dom_alias(struct cli_state *cli, @@ -1122,6 +1296,61 @@ BOOL samr_open_group(struct cli_state *cli, } /**************************************************************************** +do a SAMR Delete Group Member +****************************************************************************/ +BOOL samr_del_groupmem(struct cli_state *cli, + POLICY_HND *group_pol, uint32 rid) +{ + prs_struct data; + prs_struct rdata; + + SAMR_Q_DEL_GROUPMEM q_o; + BOOL valid_pol = False; + + if (group_pol == NULL) return False; + + /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */ + + prs_init(&data , 1024, 4, SAFETY_MARGIN, False); + prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True ); + + DEBUG(4,("SAMR Delete Group Member.\n")); + + /* store the parameters */ + make_samr_q_del_groupmem(&q_o, group_pol, rid); + + /* turn parameters into data stream */ + samr_io_q_del_groupmem("", &q_o, &data, 0); + + /* send the data on \PIPE\ */ + if (rpc_api_pipe_req(cli, SAMR_DEL_GROUPMEM, &data, &rdata)) + { + SAMR_R_DEL_GROUPMEM r_o; + BOOL p; + + samr_io_r_del_groupmem("", &r_o, &rdata, 0); + p = rdata.offset != 0; + + if (p && r_o.status != 0) + { + /* report error code */ + DEBUG(0,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status))); + p = False; + } + + if (p) + { + valid_pol = True; + } + } + + prs_mem_free(&data ); + prs_mem_free(&rdata ); + + return valid_pol; +} + +/**************************************************************************** do a SAMR Add Group Member ****************************************************************************/ BOOL samr_add_groupmem(struct cli_state *cli, @@ -1177,6 +1406,60 @@ BOOL samr_add_groupmem(struct cli_state *cli, } /**************************************************************************** +do a SAMR Delete Domain Group +****************************************************************************/ +BOOL samr_delete_dom_group(struct cli_state *cli, POLICY_HND *group_pol) +{ + prs_struct data; + prs_struct rdata; + + SAMR_Q_DELETE_DOM_GROUP q_o; + BOOL valid_pol = False; + + if (group_pol == NULL) return False; + + /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */ + + prs_init(&data , 1024, 4, SAFETY_MARGIN, False); + prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True ); + + DEBUG(4,("SAMR Delete Domain Group.\n")); + + /* store the parameters */ + make_samr_q_delete_dom_group(&q_o, group_pol); + + /* turn parameters into data stream */ + samr_io_q_delete_dom_group("", &q_o, &data, 0); + + /* send the data on \PIPE\ */ + if (rpc_api_pipe_req(cli, SAMR_DELETE_DOM_GROUP, &data, &rdata)) + { + SAMR_R_DELETE_DOM_GROUP r_o; + BOOL p; + + samr_io_r_delete_dom_group("", &r_o, &rdata, 0); + p = rdata.offset != 0; + + if (p && r_o.status != 0) + { + /* report error code */ + DEBUG(0,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status))); + p = False; + } + + if (p) + { + valid_pol = True; + } + } + + prs_mem_free(&data ); + prs_mem_free(&rdata ); + + return valid_pol; +} + +/**************************************************************************** do a SAMR Create Domain Group ****************************************************************************/ BOOL samr_create_dom_group(struct cli_state *cli, @@ -1349,6 +1632,91 @@ BOOL samr_open_domain(struct cli_state *cli, } /**************************************************************************** +do a SAMR Query Lookup Names +****************************************************************************/ +BOOL samr_query_lookup_names(struct cli_state *cli, + POLICY_HND *pol, uint32 flags, + uint32 num_names, const char **names, + uint32 *num_rids, + uint32 rid[MAX_LOOKUP_SIDS], + uint32 type[MAX_LOOKUP_SIDS]) +{ + prs_struct data; + prs_struct rdata; + + SAMR_Q_LOOKUP_NAMES q_o; + BOOL valid_query = False; + + if (pol == NULL || flags == 0 || num_names == 0 || names == NULL || + num_rids == NULL || rid == NULL || type == NULL ) return False; + + /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */ + + prs_init(&data , 1024, 4, SAFETY_MARGIN, False); + prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True ); + + DEBUG(4,("SAMR Query Lookup NAMES.\n")); + + /* store the parameters */ + make_samr_q_lookup_names(&q_o, pol, flags, num_names, names); + + /* turn parameters into data stream */ + samr_io_q_lookup_names("", &q_o, &data, 0); + + /* send the data on \PIPE\ */ + if (rpc_api_pipe_req(cli, SAMR_LOOKUP_NAMES, &data, &rdata)) + { + SAMR_R_LOOKUP_NAMES r_o; + BOOL p; + + samr_io_r_lookup_names("", &r_o, &rdata, 0); + p = rdata.offset != 0; + + if (p && r_o.status != 0) + { + /* report error code */ + DEBUG(0,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status))); + p = False; + } + + if (p) + { + if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 && + r_o.num_types1 == r_o.num_rids1) + { + int i; + + valid_query = True; + *num_rids = r_o.num_rids1; + + for (i = 0; i < r_o.num_rids1; i++) + { + rid[i] = r_o.rid[i]; + } + for (i = 0; i < r_o.num_types1; i++) + { + type[i] = r_o.type[i]; + } + } + else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0) + { + valid_query = True; + *num_rids = 0; + } + else + { + p = False; + } + } + } + + prs_mem_free(&data ); + prs_mem_free(&rdata ); + + return valid_query; +} + +/**************************************************************************** do a SAMR Query Lookup RIDS ****************************************************************************/ BOOL samr_query_lookup_rids(struct cli_state *cli, |