2 Unix SMB/Netbios implementation.
4 NT Domain Authentication SMB / MSRPC client
5 Copyright (C) Andrew Tridgell 1994-1997
6 Copyright (C) Luke Kenneth Casson Leighton 1996-1997
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32 extern int DEBUGLEVEL;
36 /****************************************************************************
37 do a SAMR create domain user
38 ****************************************************************************/
39 BOOL create_samr_domain_user(struct cli_state *cli, uint16 fnum,
40 POLICY_HND *pol_open_domain,
41 const char *acct_name, uint16 acb_info,
44 POLICY_HND pol_open_user;
47 if (pol_open_domain == NULL || acct_name == NULL) return False;
49 /* send create user */
50 if (!samr_create_dom_user(cli, fnum,
52 acct_name, acb_info, 0xe005000b,
58 DEBUG(5,("create_samr_domain_user: name: %s rid 0x%x\n",
61 return samr_close(cli, fnum, &pol_open_user) && ret;
64 /****************************************************************************
65 do a SAMR create domain alias
66 ****************************************************************************/
67 BOOL create_samr_domain_alias(struct cli_state *cli, uint16 fnum,
68 POLICY_HND *pol_open_domain,
69 const char *acct_name, const char *acct_desc,
72 POLICY_HND pol_open_alias;
76 if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False;
78 /* send create alias */
79 if (!samr_create_dom_alias(cli, fnum,
82 &pol_open_alias, rid))
87 DEBUG(5,("create_samr_domain_alias: name: %s rid 0x%x\n",
90 ctr.switch_value1 = 3;
91 make_samr_alias_info3(&ctr.alias.info3, acct_desc);
93 /* send set alias info */
94 if (!samr_set_aliasinfo(cli, fnum,
98 DEBUG(5,("create_samr_domain_alias: error in samr_set_aliasinfo\n"));
102 return samr_close(cli, fnum,&pol_open_alias) && ret;
105 /****************************************************************************
106 do a SAMR create domain group
107 ****************************************************************************/
108 BOOL create_samr_domain_group(struct cli_state *cli, uint16 fnum,
109 POLICY_HND *pol_open_domain,
110 const char *acct_name, const char *acct_desc,
113 POLICY_HND pol_open_group;
117 if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False;
119 /* send create group*/
120 if (!samr_create_dom_group(cli, fnum,
123 &pol_open_group, rid))
128 DEBUG(5,("create_samr_domain_group: name: %s rid 0x%x\n",
131 ctr.switch_value1 = 4;
132 ctr.switch_value2 = 4;
133 make_samr_group_info4(&ctr.group.info4, acct_desc);
135 /* send user groups query */
136 if (!samr_set_groupinfo(cli, fnum,
140 DEBUG(5,("create_samr_domain_group: error in samr_set_groupinfo\n"));
144 return samr_close(cli, fnum,&pol_open_group) && ret;
147 /****************************************************************************
148 do a SAMR query user groups
149 ****************************************************************************/
150 BOOL get_samr_query_usergroups(struct cli_state *cli, uint16 fnum,
151 POLICY_HND *pol_open_domain, uint32 user_rid,
152 uint32 *num_groups, DOM_GID **gid)
154 POLICY_HND pol_open_user;
157 if (pol_open_domain == NULL || num_groups == NULL || gid == NULL) return False;
159 /* send open domain (on user sid) */
160 if (!samr_open_user(cli, fnum,
168 /* send user groups query */
169 if (!samr_query_usergroups(cli, fnum,
173 DEBUG(5,("samr_query_usergroups: error in query user groups\n"));
177 return samr_close(cli, fnum,&pol_open_user) && ret;
180 /****************************************************************************
181 do a SAMR delete group
182 ****************************************************************************/
183 BOOL delete_samr_dom_group(struct cli_state *cli, uint16 fnum,
184 POLICY_HND *pol_open_domain,
187 POLICY_HND pol_open_group;
189 if (pol_open_domain == NULL) return False;
191 /* send open domain (on group rid) */
192 if (!samr_open_group(cli, fnum,pol_open_domain,
193 0x00000010, group_rid,
199 /* send group delete */
200 if (!samr_delete_dom_group(cli, fnum,&pol_open_group))
203 DEBUG(5,("delete_samr_dom_group: error in delete domain group\n"));
204 samr_close(cli, fnum,&pol_open_group);
212 /****************************************************************************
213 do a SAMR query group members
214 ****************************************************************************/
215 BOOL get_samr_query_groupmem(struct cli_state *cli, uint16 fnum,
216 POLICY_HND *pol_open_domain,
217 uint32 group_rid, uint32 *num_mem,
218 uint32 **rid, uint32 **attr)
220 POLICY_HND pol_open_group;
223 if (pol_open_domain == NULL || num_mem == NULL || rid == NULL || attr == NULL) return False;
225 /* send open domain (on group sid) */
226 if (!samr_open_group(cli, fnum,pol_open_domain,
227 0x00000010, group_rid,
233 /* send group info query */
234 if (!samr_query_groupmem(cli, fnum,&pol_open_group, num_mem, rid, attr))
237 DEBUG(5,("samr_query_group: error in query group members\n"));
241 return samr_close(cli, fnum,&pol_open_group) && ret;
244 /****************************************************************************
245 do a SAMR delete alias
246 ****************************************************************************/
247 BOOL delete_samr_dom_alias(struct cli_state *cli, uint16 fnum,
248 POLICY_HND *pol_open_domain,
251 POLICY_HND pol_open_alias;
253 if (pol_open_domain == NULL) return False;
255 /* send open domain (on alias rid) */
256 if (!samr_open_alias(cli, fnum,pol_open_domain,
257 0x000f001f, alias_rid, &pol_open_alias))
262 /* send alias delete */
263 if (!samr_delete_dom_alias(cli, fnum,&pol_open_alias))
266 DEBUG(5,("delete_samr_dom_alias: error in delete domain alias\n"));
267 samr_close(cli, fnum,&pol_open_alias);
275 /****************************************************************************
276 do a SAMR query alias members
277 ****************************************************************************/
278 BOOL get_samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
279 POLICY_HND *pol_open_domain,
280 uint32 alias_rid, uint32 *num_mem, DOM_SID2 *sid)
282 POLICY_HND pol_open_alias;
285 if (pol_open_domain == NULL || num_mem == NULL || sid == NULL) return False;
287 /* send open domain (on alias sid) */
288 if (!samr_open_alias(cli, fnum, pol_open_domain,
289 0x000f001f, alias_rid,
295 /* send alias info query */
296 if (!samr_query_aliasmem(cli, fnum, &pol_open_alias, num_mem, sid))
299 DEBUG(5,("samr_query_alias: error in query alias members\n"));
303 return samr_close(cli, fnum,&pol_open_alias) && ret;
306 /****************************************************************************
307 do a SAMR query user info
308 ****************************************************************************/
309 BOOL get_samr_query_userinfo(struct cli_state *cli, uint16 fnum,
310 POLICY_HND *pol_open_domain,
312 uint32 user_rid, SAM_USER_INFO_21 *usr)
314 POLICY_HND pol_open_user;
317 if (pol_open_domain == NULL || usr == NULL) return False;
319 bzero(usr, sizeof(*usr));
321 /* send open domain (on user sid) */
322 if (!samr_open_user(cli, fnum,
330 /* send user info query */
331 if (!samr_query_userinfo(cli, fnum,
333 info_level, (void*)usr))
335 DEBUG(5,("samr_query_userinfo: error in query user info, level 0x%x\n",
340 return samr_close(cli, fnum,&pol_open_user) && ret;
343 /****************************************************************************
344 do a SAMR query group info
345 ****************************************************************************/
346 BOOL get_samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
347 POLICY_HND *pol_open_domain,
349 uint32 group_rid, GROUP_INFO_CTR *ctr)
351 POLICY_HND pol_open_group;
354 if (pol_open_domain == NULL || ctr == NULL) return False;
356 bzero(ctr, sizeof(*ctr));
358 /* send open domain (on group sid) */
359 if (!samr_open_group(cli, fnum,
361 0x02000000, group_rid, &pol_open_group))
366 /* send group info query */
367 if (!samr_query_groupinfo(cli, fnum,
371 DEBUG(5,("samr_query_groupinfo: error in query group info, level 0x%x\n",
376 return samr_close(cli, fnum,&pol_open_group) && ret;
379 /****************************************************************************
380 do a SAMR change user password command
381 ****************************************************************************/
382 BOOL samr_chgpasswd_user(struct cli_state *cli, uint16 fnum,
383 char *srv_name, char *user_name,
384 char nt_newpass[516], uchar nt_oldhash[16],
385 char lm_newpass[516], uchar lm_oldhash[16])
390 SAMR_Q_CHGPASSWD_USER q_e;
391 BOOL valid_pwc = False;
393 /* create and send a MSRPC command with api SAMR_CHGPASSWD_USER */
395 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
396 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
398 DEBUG(4,("SAMR Change User Password. server:%s username:%s\n",
399 srv_name, user_name));
401 make_samr_q_chgpasswd_user(&q_e, srv_name, user_name,
402 nt_newpass, nt_oldhash,
403 lm_newpass, lm_oldhash);
405 /* turn parameters into data stream */
406 samr_io_q_chgpasswd_user("", &q_e, &data, 0);
408 /* send the data on \PIPE\ */
409 if (rpc_api_pipe_req(cli, fnum, SAMR_CHGPASSWD_USER, &data, &rdata))
411 SAMR_R_CHGPASSWD_USER r_e;
414 samr_io_r_chgpasswd_user("", &r_e, &rdata, 0);
416 p = rdata.offset != 0;
417 if (p && r_e.status != 0)
419 /* report error code */
420 DEBUG(4,("SAMR_R_CHGPASSWD_USER: %s\n", get_nt_error_msg(r_e.status)));
430 prs_mem_free(&data );
431 prs_mem_free(&rdata );
437 /****************************************************************************
438 do a SAMR unknown 0x38 command
439 ****************************************************************************/
440 BOOL samr_unknown_38(struct cli_state *cli, uint16 fnum, char *srv_name)
445 SAMR_Q_UNKNOWN_38 q_e;
446 BOOL valid_un8 = False;
448 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
450 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
451 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
453 DEBUG(4,("SAMR Unknown 38 server:%s\n", srv_name));
455 make_samr_q_unknown_38(&q_e, srv_name);
457 /* turn parameters into data stream */
458 samr_io_q_unknown_38("", &q_e, &data, 0);
460 /* send the data on \PIPE\ */
461 if (rpc_api_pipe_req(cli, fnum, SAMR_GET_DOM_PWINFO, &data, &rdata))
463 SAMR_R_UNKNOWN_38 r_e;
466 samr_io_r_unknown_38("", &r_e, &rdata, 0);
468 p = rdata.offset != 0;
470 if (p && r_e.status != 0)
472 /* report error code */
473 DEBUG(4,("SAMR_R_UNKNOWN_38: %s\n", get_nt_error_msg(r_e.status)));
483 prs_mem_free(&data );
484 prs_mem_free(&rdata );
489 /****************************************************************************
490 do a SAMR unknown 0x8 command
491 ****************************************************************************/
492 BOOL samr_query_dom_info(struct cli_state *cli, uint16 fnum,
493 POLICY_HND *domain_pol, uint16 switch_value,
499 SAMR_Q_QUERY_DOMAIN_INFO q_e;
500 BOOL valid_un8 = False;
502 DEBUG(4,("SAMR Unknown 8 switch:%d\n", switch_value));
504 if (domain_pol == NULL) return False;
506 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
508 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
509 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
511 /* store the parameters */
512 make_samr_q_query_dom_info(&q_e, domain_pol, switch_value);
514 /* turn parameters into data stream */
515 samr_io_q_query_dom_info("", &q_e, &data, 0);
517 /* send the data on \PIPE\ */
518 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_DOMAIN_INFO, &data, &rdata))
520 SAMR_R_QUERY_DOMAIN_INFO r_e;
524 samr_io_r_query_dom_info("", &r_e, &rdata, 0);
526 p = rdata.offset != 0;
527 if (p && r_e.status != 0)
529 /* report error code */
530 DEBUG(4,("SAMR_R_QUERY_DOMAIN_INFO: %s\n", get_nt_error_msg(r_e.status)));
540 prs_mem_free(&data );
541 prs_mem_free(&rdata );
546 /****************************************************************************
547 do a SAMR enumerate groups
548 ****************************************************************************/
549 uint32 samr_enum_dom_groups(struct cli_state *cli, uint16 fnum,
551 uint32 *start_idx, uint32 size,
552 struct acct_info **sam,
553 uint32 *num_sam_groups)
559 SAMR_Q_ENUM_DOM_GROUPS q_e;
561 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
563 if (pol == NULL || num_sam_groups == NULL)
565 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
568 /* create and send a MSRPC command with api SAMR_ENUM_DOM_GROUPS */
570 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
571 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
573 /* store the parameters */
574 make_samr_q_enum_dom_groups(&q_e, pol, *start_idx, size);
576 /* turn parameters into data stream */
577 samr_io_q_enum_dom_groups("", &q_e, &data, 0);
579 /* send the data on \PIPE\ */
580 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_GROUPS, &data, &rdata))
582 SAMR_R_ENUM_DOM_GROUPS r_e;
585 samr_io_r_enum_dom_groups("", &r_e, &rdata, 0);
588 p = rdata.offset != 0;
589 if (p && r_e.status != 0)
591 /* report error code */
592 DEBUG(4,("SAMR_R_ENUM_DOM_GROUPS: %s\n", get_nt_error_msg(r_e.status)));
593 p = (r_e.status == STATUS_MORE_ENTRIES);
598 uint32 i = (*num_sam_groups);
602 (*num_sam_groups) += r_e.num_entries2;
603 (*sam) = (struct acct_info*) Realloc((*sam),
604 sizeof(struct acct_info) * (*num_sam_groups));
608 (*num_sam_groups) = 0;
612 for (j = 0; i < (*num_sam_groups) && j < r_e.num_entries2; j++, i++)
614 (*sam)[i].rid = r_e.sam[j].rid;
615 (*sam)[i].acct_name[0] = 0;
616 (*sam)[i].acct_desc[0] = 0;
617 if (r_e.sam[j].hdr_name.buffer)
619 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
622 DEBUG(5,("samr_enum_dom_groups: idx: %4d rid: %8x acct: %s\n",
623 i, (*sam)[i].rid, (*sam)[i].acct_name));
625 (*start_idx) = r_e.next_idx;
627 else if (status == 0x0)
629 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
634 prs_mem_free(&data );
635 prs_mem_free(&rdata );
640 /****************************************************************************
641 do a SAMR enumerate aliases
642 ****************************************************************************/
643 BOOL samr_enum_dom_aliases(struct cli_state *cli, uint16 fnum,
645 uint32 start_idx, uint32 size,
646 struct acct_info **sam,
647 uint32 *num_sam_aliases)
652 SAMR_Q_ENUM_DOM_ALIASES q_e;
653 BOOL valid_pol = False;
655 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
657 if (pol == NULL || num_sam_aliases == NULL) return False;
659 /* create and send a MSRPC command with api SAMR_ENUM_DOM_ALIASES */
661 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
662 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
664 /* store the parameters */
665 make_samr_q_enum_dom_aliases(&q_e, pol, start_idx, size);
667 /* turn parameters into data stream */
668 samr_io_q_enum_dom_aliases("", &q_e, &data, 0);
670 /* send the data on \PIPE\ */
671 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_ALIASES, &data, &rdata))
673 SAMR_R_ENUM_DOM_ALIASES r_e;
676 samr_io_r_enum_dom_aliases("", &r_e, &rdata, 0);
678 p = rdata.offset != 0;
679 if (p && r_e.status != 0)
681 /* report error code */
682 DEBUG(4,("SAMR_R_ENUM_DOM_ALIASES: %s\n", get_nt_error_msg(r_e.status)));
691 *num_sam_aliases = r_e.num_entries2;
692 if (*num_sam_aliases > MAX_SAM_ENTRIES)
694 *num_sam_aliases = MAX_SAM_ENTRIES;
695 DEBUG(2,("samr_enum_dom_aliases: sam user entries limited to %d\n",
699 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_aliases));
703 *num_sam_aliases = 0;
706 for (i = 0; i < *num_sam_aliases; i++)
708 (*sam)[i].rid = r_e.sam[i].rid;
709 (*sam)[i].acct_name[0] = 0;
710 (*sam)[i].acct_desc[0] = 0;
711 if (r_e.sam[i].hdr_name.buffer)
713 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
716 DEBUG(5,("samr_enum_dom_aliases: idx: %4d rid: %8x acct: %s\n",
717 i, (*sam)[i].rid, (*sam)[i].acct_name));
723 prs_mem_free(&data );
724 prs_mem_free(&rdata );
729 /****************************************************************************
730 do a SAMR enumerate users
731 ****************************************************************************/
732 uint32 samr_enum_dom_users(struct cli_state *cli, uint16 fnum,
733 POLICY_HND *pol, uint32 *start_idx,
734 uint16 acb_mask, uint16 unk_1, uint32 size,
735 struct acct_info **sam,
736 uint32 *num_sam_users)
742 SAMR_Q_ENUM_DOM_USERS q_e;
744 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
746 if (pol == NULL || num_sam_users == NULL)
748 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
751 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
753 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
754 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
756 /* store the parameters */
757 make_samr_q_enum_dom_users(&q_e, pol, *start_idx,
758 acb_mask, unk_1, size);
760 /* turn parameters into data stream */
761 samr_io_q_enum_dom_users("", &q_e, &data, 0);
763 /* send the data on \PIPE\ */
764 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_USERS, &data, &rdata))
766 SAMR_R_ENUM_DOM_USERS r_e;
769 samr_io_r_enum_dom_users("", &r_e, &rdata, 0);
772 p = rdata.offset != 0;
774 if (p && r_e.status != 0)
776 /* report error code */
777 DEBUG(4,("SAMR_R_ENUM_DOM_USERS: %s\n", get_nt_error_msg(r_e.status)));
778 p = (r_e.status == STATUS_MORE_ENTRIES);
783 uint32 i = (*num_sam_users);
787 (*num_sam_users) += r_e.num_entries2;
788 (*sam) = (struct acct_info*) Realloc((*sam),
789 sizeof(struct acct_info) * (*num_sam_users));
793 (*num_sam_users) = 0;
797 for (j = 0; i < (*num_sam_users) && j < r_e.num_entries2; j++, i++)
799 (*sam)[i].rid = r_e.sam[j].rid;
800 (*sam)[i].acct_name[0] = 0;
801 (*sam)[i].acct_desc[0] = 0;
802 if (r_e.sam[j].hdr_name.buffer)
804 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_acct_name[name_idx], sizeof((*sam)[i].acct_name)-1);
807 DEBUG(5,("samr_enum_dom_users: idx: %4d rid: %8x acct: %s\n",
808 i, (*sam)[i].rid, (*sam)[i].acct_name));
810 (*start_idx) = r_e.next_idx;
812 else if (status == 0x0)
814 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
821 if (r_e.uni_acct_name != NULL)
823 free(r_e.uni_acct_name);
828 status = NT_STATUS_ACCESS_DENIED | 0xC0000000;
831 prs_mem_free(&data );
832 prs_mem_free(&rdata );
837 /****************************************************************************
839 ****************************************************************************/
840 BOOL samr_connect(struct cli_state *cli, uint16 fnum,
841 char *srv_name, uint32 unknown_0,
842 POLICY_HND *connect_pol)
848 BOOL valid_pol = False;
850 DEBUG(4,("SAMR Open Policy server:%s undoc value:%x\n",
851 srv_name, unknown_0));
853 if (srv_name == NULL || connect_pol == NULL) return False;
855 /* create and send a MSRPC command with api SAMR_CONNECT */
857 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
858 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
860 /* store the parameters */
861 make_samr_q_connect(&q_o, srv_name, unknown_0);
863 /* turn parameters into data stream */
864 samr_io_q_connect("", &q_o, &data, 0);
866 /* send the data on \PIPE\ */
867 if (rpc_api_pipe_req(cli, fnum, SAMR_CONNECT, &data, &rdata))
872 samr_io_r_connect("", &r_o, &rdata, 0);
873 p = rdata.offset != 0;
875 if (p && r_o.status != 0)
877 /* report error code */
878 DEBUG(4,("SAMR_R_CONNECT: %s\n", get_nt_error_msg(r_o.status)));
884 memcpy(connect_pol, &r_o.connect_pol, sizeof(r_o.connect_pol));
889 prs_mem_free(&data );
890 prs_mem_free(&rdata );
895 /****************************************************************************
897 ****************************************************************************/
898 BOOL samr_open_user(struct cli_state *cli, uint16 fnum,
899 POLICY_HND *pol, uint32 unk_0, uint32 rid,
900 POLICY_HND *user_pol)
905 SAMR_Q_OPEN_USER q_o;
906 BOOL valid_pol = False;
908 DEBUG(4,("SAMR Open User. unk_0: %08x RID:%x\n",
911 if (pol == NULL || user_pol == NULL) return False;
913 /* create and send a MSRPC command with api SAMR_OPEN_USER */
915 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
916 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
918 /* store the parameters */
919 make_samr_q_open_user(&q_o, pol, unk_0, rid);
921 /* turn parameters into data stream */
922 samr_io_q_open_user("", &q_o, &data, 0);
924 /* send the data on \PIPE\ */
925 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_USER, &data, &rdata))
927 SAMR_R_OPEN_USER r_o;
930 samr_io_r_open_user("", &r_o, &rdata, 0);
931 p = rdata.offset != 0;
933 if (p && r_o.status != 0)
935 /* report error code */
936 DEBUG(4,("SAMR_R_OPEN_USER: %s\n", get_nt_error_msg(r_o.status)));
942 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
947 prs_mem_free(&data );
948 prs_mem_free(&rdata );
953 /****************************************************************************
955 ****************************************************************************/
956 BOOL samr_open_alias(struct cli_state *cli, uint16 fnum,
957 POLICY_HND *domain_pol,
958 uint32 flags, uint32 rid,
959 POLICY_HND *alias_pol)
964 SAMR_Q_OPEN_ALIAS q_o;
965 BOOL valid_pol = False;
967 DEBUG(4,("SAMR Open Alias. RID:%x\n", rid));
969 if (alias_pol == NULL || domain_pol == NULL) return False;
971 /* create and send a MSRPC command with api SAMR_OPEN_ALIAS */
973 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
974 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
976 /* store the parameters */
977 make_samr_q_open_alias(&q_o, domain_pol, flags, rid);
979 /* turn parameters into data stream */
980 samr_io_q_open_alias("", &q_o, &data, 0);
982 /* send the data on \PIPE\ */
983 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_ALIAS, &data, &rdata))
985 SAMR_R_OPEN_ALIAS r_o;
988 samr_io_r_open_alias("", &r_o, &rdata, 0);
989 p = rdata.offset != 0;
991 if (p && r_o.status != 0)
993 /* report error code */
994 DEBUG(4,("SAMR_R_OPEN_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1000 memcpy(alias_pol, &r_o.pol, sizeof(r_o.pol));
1005 prs_mem_free(&data );
1006 prs_mem_free(&rdata );
1011 /****************************************************************************
1012 do a SAMR Delete Alias Member
1013 ****************************************************************************/
1014 BOOL samr_del_aliasmem(struct cli_state *cli, uint16 fnum,
1015 POLICY_HND *alias_pol, DOM_SID *sid)
1020 SAMR_Q_DEL_ALIASMEM q_o;
1021 BOOL valid_pol = False;
1023 if (alias_pol == NULL || sid == NULL) return False;
1025 /* create and send a MSRPC command with api SAMR_DEL_ALIASMEM */
1027 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1028 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1030 DEBUG(4,("SAMR Delete Alias Member.\n"));
1032 /* store the parameters */
1033 make_samr_q_del_aliasmem(&q_o, alias_pol, sid);
1035 /* turn parameters into data stream */
1036 samr_io_q_del_aliasmem("", &q_o, &data, 0);
1038 /* send the data on \PIPE\ */
1039 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_ALIASMEM, &data, &rdata))
1041 SAMR_R_DEL_ALIASMEM r_o;
1044 samr_io_r_del_aliasmem("", &r_o, &rdata, 0);
1045 p = rdata.offset != 0;
1047 if (p && r_o.status != 0)
1049 /* report error code */
1050 DEBUG(4,("SAMR_R_DEL_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1060 prs_mem_free(&data );
1061 prs_mem_free(&rdata );
1066 /****************************************************************************
1067 do a SAMR Add Alias Member
1068 ****************************************************************************/
1069 BOOL samr_add_aliasmem(struct cli_state *cli, uint16 fnum,
1070 POLICY_HND *alias_pol, DOM_SID *sid)
1075 SAMR_Q_ADD_ALIASMEM q_o;
1076 BOOL valid_pol = False;
1078 if (alias_pol == NULL || sid == NULL) return False;
1080 /* create and send a MSRPC command with api SAMR_ADD_ALIASMEM */
1082 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1083 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1085 DEBUG(4,("SAMR Add Alias Member.\n"));
1087 /* store the parameters */
1088 make_samr_q_add_aliasmem(&q_o, alias_pol, sid);
1090 /* turn parameters into data stream */
1091 samr_io_q_add_aliasmem("", &q_o, &data, 0);
1093 /* send the data on \PIPE\ */
1094 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_ALIASMEM, &data, &rdata))
1096 SAMR_R_ADD_ALIASMEM r_o;
1099 samr_io_r_add_aliasmem("", &r_o, &rdata, 0);
1100 p = rdata.offset != 0;
1102 if (p && r_o.status != 0)
1104 /* report error code */
1105 DEBUG(4,("SAMR_R_ADD_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1115 prs_mem_free(&data );
1116 prs_mem_free(&rdata );
1121 /****************************************************************************
1122 do a SAMR Delete Domain Alias
1123 ****************************************************************************/
1124 BOOL samr_delete_dom_alias(struct cli_state *cli, uint16 fnum,
1125 POLICY_HND *alias_pol)
1130 SAMR_Q_DELETE_DOM_ALIAS q_o;
1131 BOOL valid_pol = False;
1133 if (alias_pol == NULL) return False;
1135 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_ALIAS */
1137 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1138 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1140 DEBUG(4,("SAMR Delete Domain Alias.\n"));
1142 /* store the parameters */
1143 make_samr_q_delete_dom_alias(&q_o, alias_pol);
1145 /* turn parameters into data stream */
1146 samr_io_q_delete_dom_alias("", &q_o, &data, 0);
1148 /* send the data on \PIPE\ */
1149 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_ALIAS, &data, &rdata))
1151 SAMR_R_DELETE_DOM_ALIAS r_o;
1154 samr_io_r_delete_dom_alias("", &r_o, &rdata, 0);
1155 p = rdata.offset != 0;
1157 if (p && r_o.status != 0)
1159 /* report error code */
1160 DEBUG(4,("SAMR_R_DELETE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1170 prs_mem_free(&data );
1171 prs_mem_free(&rdata );
1176 /****************************************************************************
1177 do a SAMR Create Domain User
1178 ****************************************************************************/
1179 BOOL samr_create_dom_user(struct cli_state *cli, uint16 fnum,
1180 POLICY_HND *domain_pol, const char *acct_name,
1181 uint32 unk_0, uint32 unk_1,
1182 POLICY_HND *user_pol, uint32 *rid)
1187 SAMR_Q_CREATE_USER q_o;
1188 BOOL valid_pol = False;
1190 if (user_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1192 /* create and send a MSRPC command with api SAMR_CREATE_USER */
1194 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1195 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1197 DEBUG(4,("SAMR Create Domain User. Name:%s\n", acct_name));
1199 /* store the parameters */
1200 make_samr_q_create_user(&q_o, domain_pol, acct_name, unk_0, unk_1);
1202 /* turn parameters into data stream */
1203 samr_io_q_create_user("", &q_o, &data, 0);
1205 /* send the data on \PIPE\ */
1206 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_USER, &data, &rdata))
1208 SAMR_R_CREATE_USER r_o;
1211 samr_io_r_create_user("", &r_o, &rdata, 0);
1212 p = rdata.offset != 0;
1214 if (p && r_o.status != 0)
1216 /* report error code */
1217 DEBUG(4,("SAMR_R_CREATE_USER: %s\n", get_nt_error_msg(r_o.status)));
1223 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
1224 *rid = r_o.user_rid;
1229 prs_mem_free(&data );
1230 prs_mem_free(&rdata );
1235 /****************************************************************************
1236 do a SAMR Create Domain Alias
1237 ****************************************************************************/
1238 BOOL samr_create_dom_alias(struct cli_state *cli, uint16 fnum,
1239 POLICY_HND *domain_pol, const char *acct_name,
1240 POLICY_HND *alias_pol, uint32 *rid)
1245 SAMR_Q_CREATE_DOM_ALIAS q_o;
1246 BOOL valid_pol = False;
1248 if (alias_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1250 /* create and send a MSRPC command with api SAMR_CREATE_DOM_ALIAS */
1252 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1253 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1255 DEBUG(4,("SAMR Create Domain Alias. Name:%s\n", acct_name));
1257 /* store the parameters */
1258 make_samr_q_create_dom_alias(&q_o, domain_pol, acct_name);
1260 /* turn parameters into data stream */
1261 samr_io_q_create_dom_alias("", &q_o, &data, 0);
1263 /* send the data on \PIPE\ */
1264 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_ALIAS, &data, &rdata))
1266 SAMR_R_CREATE_DOM_ALIAS r_o;
1269 samr_io_r_create_dom_alias("", &r_o, &rdata, 0);
1270 p = rdata.offset != 0;
1272 if (p && r_o.status != 0)
1274 /* report error code */
1275 DEBUG(4,("SAMR_R_CREATE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1281 memcpy(alias_pol, &r_o.alias_pol, sizeof(r_o.alias_pol));
1287 prs_mem_free(&data );
1288 prs_mem_free(&rdata );
1294 /****************************************************************************
1295 do a SAMR Get Alias Info
1296 ****************************************************************************/
1297 BOOL samr_get_aliasinfo(struct cli_state *cli, uint16 fnum,
1298 POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1303 SAMR_Q_GET_ALIASINFO q_o;
1304 BOOL valid_pol = False;
1306 if (alias_pol == NULL || ctr == NULL) return False;
1308 /* create and send a MSRPC command with api SAMR_GET_ALIASINFO */
1310 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1311 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1313 DEBUG(4,("SAMR Get Alias Info\n"));
1315 /* store the parameters */
1316 make_samr_q_get_aliasinfo(&q_o, alias_pol, ctr);
1318 /* turn parameters into data stream */
1319 samr_io_q_get_aliasinfo("", &q_o, &data, 0);
1321 /* send the data on \PIPE\ */
1322 if (rpc_api_pipe_req(cli, fnum, SAMR_GET_ALIASINFO, &data, &rdata))
1324 SAMR_R_GET_ALIASINFO r_o;
1327 samr_io_r_get_aliasinfo("", &r_o, &rdata, 0);
1328 p = rdata.offset != 0;
1330 if (p && r_o.status != 0)
1332 /* report error code */
1333 DEBUG(4,("SAMR_R_GET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1343 prs_mem_free(&data );
1344 prs_mem_free(&rdata );
1350 /****************************************************************************
1351 do a SAMR Set Alias Info
1352 ****************************************************************************/
1353 BOOL samr_set_aliasinfo(struct cli_state *cli, uint16 fnum,
1354 POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1359 SAMR_Q_SET_ALIASINFO q_o;
1360 BOOL valid_pol = False;
1362 if (alias_pol == NULL || ctr == NULL) return False;
1364 /* create and send a MSRPC command with api SAMR_SET_ALIASINFO */
1366 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1367 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1369 DEBUG(4,("SAMR Set Alias Info\n"));
1371 /* store the parameters */
1372 make_samr_q_set_aliasinfo(&q_o, alias_pol, ctr);
1374 /* turn parameters into data stream */
1375 samr_io_q_set_aliasinfo("", &q_o, &data, 0);
1377 /* send the data on \PIPE\ */
1378 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_ALIASINFO, &data, &rdata))
1380 SAMR_R_SET_ALIASINFO r_o;
1383 samr_io_r_set_aliasinfo("", &r_o, &rdata, 0);
1384 p = rdata.offset != 0;
1386 if (p && r_o.status != 0)
1388 /* report error code */
1389 DEBUG(4,("SAMR_R_SET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1399 prs_mem_free(&data );
1400 prs_mem_free(&rdata );
1405 /****************************************************************************
1406 do a SAMR Open Group
1407 ****************************************************************************/
1408 BOOL samr_open_group(struct cli_state *cli, uint16 fnum,
1409 POLICY_HND *domain_pol,
1410 uint32 flags, uint32 rid,
1411 POLICY_HND *group_pol)
1416 SAMR_Q_OPEN_GROUP q_o;
1417 BOOL valid_pol = False;
1419 DEBUG(4,("SAMR Open Group. RID:%x\n", rid));
1421 if (group_pol == NULL || domain_pol == NULL) return False;
1423 /* create and send a MSRPC command with api SAMR_OPEN_GROUP */
1425 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1426 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1428 /* store the parameters */
1429 make_samr_q_open_group(&q_o, domain_pol, flags, rid);
1431 /* turn parameters into data stream */
1432 samr_io_q_open_group("", &q_o, &data, 0);
1434 /* send the data on \PIPE\ */
1435 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_GROUP, &data, &rdata))
1437 SAMR_R_OPEN_GROUP r_o;
1440 samr_io_r_open_group("", &r_o, &rdata, 0);
1441 p = rdata.offset != 0;
1443 if (p && r_o.status != 0)
1445 /* report error code */
1446 DEBUG(4,("SAMR_R_OPEN_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1452 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1457 prs_mem_free(&data );
1458 prs_mem_free(&rdata );
1463 /****************************************************************************
1464 do a SAMR Delete Group Member
1465 ****************************************************************************/
1466 BOOL samr_del_groupmem(struct cli_state *cli, uint16 fnum,
1467 POLICY_HND *group_pol, uint32 rid)
1472 SAMR_Q_DEL_GROUPMEM q_o;
1473 BOOL valid_pol = False;
1475 if (group_pol == NULL) return False;
1477 /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */
1479 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1480 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1482 DEBUG(4,("SAMR Delete Group Member.\n"));
1484 /* store the parameters */
1485 make_samr_q_del_groupmem(&q_o, group_pol, rid);
1487 /* turn parameters into data stream */
1488 samr_io_q_del_groupmem("", &q_o, &data, 0);
1490 /* send the data on \PIPE\ */
1491 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_GROUPMEM, &data, &rdata))
1493 SAMR_R_DEL_GROUPMEM r_o;
1496 samr_io_r_del_groupmem("", &r_o, &rdata, 0);
1497 p = rdata.offset != 0;
1499 if (p && r_o.status != 0)
1501 /* report error code */
1502 DEBUG(4,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1512 prs_mem_free(&data );
1513 prs_mem_free(&rdata );
1518 /****************************************************************************
1519 do a SAMR Add Group Member
1520 ****************************************************************************/
1521 BOOL samr_add_groupmem(struct cli_state *cli, uint16 fnum,
1522 POLICY_HND *group_pol, uint32 rid)
1527 SAMR_Q_ADD_GROUPMEM q_o;
1528 BOOL valid_pol = False;
1530 if (group_pol == NULL) return False;
1532 /* create and send a MSRPC command with api SAMR_ADD_GROUPMEM */
1534 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1535 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1537 DEBUG(4,("SAMR Add Group Member.\n"));
1539 /* store the parameters */
1540 make_samr_q_add_groupmem(&q_o, group_pol, rid);
1542 /* turn parameters into data stream */
1543 samr_io_q_add_groupmem("", &q_o, &data, 0);
1545 /* send the data on \PIPE\ */
1546 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_GROUPMEM, &data, &rdata))
1548 SAMR_R_ADD_GROUPMEM r_o;
1551 samr_io_r_add_groupmem("", &r_o, &rdata, 0);
1552 p = rdata.offset != 0;
1554 if (p && r_o.status != 0)
1556 /* report error code */
1557 DEBUG(4,("SAMR_R_ADD_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1567 prs_mem_free(&data );
1568 prs_mem_free(&rdata );
1573 /****************************************************************************
1574 do a SAMR Delete Domain Group
1575 ****************************************************************************/
1576 BOOL samr_delete_dom_group(struct cli_state *cli, uint16 fnum, POLICY_HND *group_pol)
1581 SAMR_Q_DELETE_DOM_GROUP q_o;
1582 BOOL valid_pol = False;
1584 if (group_pol == NULL) return False;
1586 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */
1588 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1589 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1591 DEBUG(4,("SAMR Delete Domain Group.\n"));
1593 /* store the parameters */
1594 make_samr_q_delete_dom_group(&q_o, group_pol);
1596 /* turn parameters into data stream */
1597 samr_io_q_delete_dom_group("", &q_o, &data, 0);
1599 /* send the data on \PIPE\ */
1600 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_GROUP, &data, &rdata))
1602 SAMR_R_DELETE_DOM_GROUP r_o;
1605 samr_io_r_delete_dom_group("", &r_o, &rdata, 0);
1606 p = rdata.offset != 0;
1608 if (p && r_o.status != 0)
1610 /* report error code */
1611 DEBUG(4,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1621 prs_mem_free(&data );
1622 prs_mem_free(&rdata );
1627 /****************************************************************************
1628 do a SAMR Create Domain Group
1629 ****************************************************************************/
1630 BOOL samr_create_dom_group(struct cli_state *cli, uint16 fnum,
1631 POLICY_HND *domain_pol, const char *acct_name,
1632 POLICY_HND *group_pol, uint32 *rid)
1637 SAMR_Q_CREATE_DOM_GROUP q_o;
1638 BOOL valid_pol = False;
1640 if (group_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1642 /* create and send a MSRPC command with api SAMR_CREATE_DOM_GROUP */
1644 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1645 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1647 DEBUG(4,("SAMR Create Domain Group. Name:%s\n", acct_name));
1649 /* store the parameters */
1650 make_samr_q_create_dom_group(&q_o, domain_pol, acct_name);
1652 /* turn parameters into data stream */
1653 samr_io_q_create_dom_group("", &q_o, &data, 0);
1655 /* send the data on \PIPE\ */
1656 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_GROUP, &data, &rdata))
1658 SAMR_R_CREATE_DOM_GROUP r_o;
1661 samr_io_r_create_dom_group("", &r_o, &rdata, 0);
1662 p = rdata.offset != 0;
1664 if (p && r_o.status != 0)
1666 /* report error code */
1667 DEBUG(4,("SAMR_R_CREATE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1673 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1679 prs_mem_free(&data );
1680 prs_mem_free(&rdata );
1685 /****************************************************************************
1686 do a SAMR Set Group Info
1687 ****************************************************************************/
1688 BOOL samr_set_groupinfo(struct cli_state *cli, uint16 fnum,
1689 POLICY_HND *group_pol, GROUP_INFO_CTR *ctr)
1694 SAMR_Q_SET_GROUPINFO q_o;
1695 BOOL valid_pol = False;
1697 if (group_pol == NULL || ctr == NULL) return False;
1699 /* create and send a MSRPC command with api SAMR_SET_GROUPINFO */
1701 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1702 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1704 DEBUG(4,("SAMR Set Group Info\n"));
1706 /* store the parameters */
1707 make_samr_q_set_groupinfo(&q_o, group_pol, ctr);
1709 /* turn parameters into data stream */
1710 samr_io_q_set_groupinfo("", &q_o, &data, 0);
1712 /* send the data on \PIPE\ */
1713 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_GROUPINFO, &data, &rdata))
1715 SAMR_R_SET_GROUPINFO r_o;
1718 samr_io_r_set_groupinfo("", &r_o, &rdata, 0);
1719 p = rdata.offset != 0;
1721 if (p && r_o.status != 0)
1723 /* report error code */
1724 DEBUG(4,("SAMR_R_SET_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
1734 prs_mem_free(&data );
1735 prs_mem_free(&rdata );
1740 /****************************************************************************
1741 do a SAMR Open Domain
1742 ****************************************************************************/
1743 BOOL samr_open_domain(struct cli_state *cli, uint16 fnum,
1744 POLICY_HND *connect_pol, uint32 ace_perms,
1746 POLICY_HND *domain_pol)
1752 SAMR_Q_OPEN_DOMAIN q_o;
1753 BOOL valid_pol = False;
1755 if (DEBUGLEVEL >= 4)
1757 sid_to_string(sid_str, sid);
1758 DEBUG(4,("SAMR Open Domain. SID:%s Permissions:%x\n",
1759 sid_str, ace_perms));
1762 if (connect_pol == NULL || sid == NULL || domain_pol == NULL) return False;
1764 /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
1766 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1767 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1769 /* store the parameters */
1770 make_samr_q_open_domain(&q_o, connect_pol, ace_perms, sid);
1772 /* turn parameters into data stream */
1773 samr_io_q_open_domain("", &q_o, &data, 0);
1775 /* send the data on \PIPE\ */
1776 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_DOMAIN, &data, &rdata))
1778 SAMR_R_OPEN_DOMAIN r_o;
1781 samr_io_r_open_domain("", &r_o, &rdata, 0);
1782 p = rdata.offset != 0;
1784 if (p && r_o.status != 0)
1786 /* report error code */
1787 DEBUG(4,("SAMR_R_OPEN_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1793 memcpy(domain_pol, &r_o.domain_pol, sizeof(r_o.domain_pol));
1798 prs_mem_free(&data );
1799 prs_mem_free(&rdata );
1804 /****************************************************************************
1805 do a SAMR Query Lookup Domain
1806 ****************************************************************************/
1807 BOOL samr_query_lookup_domain(struct cli_state *cli, uint16 fnum,
1808 POLICY_HND *pol, const char *dom_name,
1814 SAMR_Q_LOOKUP_DOMAIN q_o;
1815 BOOL valid_query = False;
1817 if (pol == NULL || dom_name == NULL || dom_sid == NULL) return False;
1819 /* create and send a MSRPC command with api SAMR_LOOKUP_DOMAIN */
1821 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1822 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1824 DEBUG(4,("SAMR Query Lookup Domain.\n"));
1826 /* store the parameters */
1827 make_samr_q_lookup_domain(&q_o, pol, dom_name);
1829 /* turn parameters into data stream */
1830 samr_io_q_lookup_domain("", &q_o, &data, 0);
1832 /* send the data on \PIPE\ */
1833 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_DOMAIN, &data, &rdata))
1835 SAMR_R_LOOKUP_DOMAIN r_o;
1838 samr_io_r_lookup_domain("", &r_o, &rdata, 0);
1839 p = rdata.offset != 0;
1841 if (p && r_o.status != 0)
1843 /* report error code */
1844 DEBUG(4,("SAMR_R_LOOKUP_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1848 if (p && r_o.ptr_sid != 0)
1850 sid_copy(dom_sid, &r_o.dom_sid.sid);
1855 prs_mem_free(&data );
1856 prs_mem_free(&rdata );
1861 /****************************************************************************
1862 do a SAMR Query Lookup Names
1863 ****************************************************************************/
1864 BOOL samr_query_lookup_names(struct cli_state *cli, uint16 fnum,
1865 POLICY_HND *pol, uint32 flags,
1866 uint32 num_names, char **names,
1868 uint32 rid[MAX_LOOKUP_SIDS],
1869 uint32 type[MAX_LOOKUP_SIDS])
1874 SAMR_Q_LOOKUP_NAMES q_o;
1875 BOOL valid_query = False;
1877 if (pol == NULL || flags == 0 || num_names == 0 || names == NULL ||
1878 num_rids == NULL || rid == NULL || type == NULL ) return False;
1880 /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */
1882 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1883 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1885 DEBUG(4,("SAMR Query Lookup NAMES.\n"));
1887 /* store the parameters */
1888 make_samr_q_lookup_names(&q_o, pol, flags, num_names, names);
1890 /* turn parameters into data stream */
1891 samr_io_q_lookup_names("", &q_o, &data, 0);
1893 /* send the data on \PIPE\ */
1894 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_NAMES, &data, &rdata))
1896 SAMR_R_LOOKUP_NAMES r_o;
1899 samr_io_r_lookup_names("", &r_o, &rdata, 0);
1900 p = rdata.offset != 0;
1902 if (p && r_o.status != 0)
1904 /* report error code */
1905 DEBUG(4,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status)));
1906 p = r_o.status == 0x107;
1911 if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 &&
1912 r_o.num_types1 == r_o.num_rids1)
1917 *num_rids = r_o.num_rids1;
1919 for (i = 0; i < r_o.num_rids1; i++)
1921 rid[i] = r_o.rid[i];
1923 for (i = 0; i < r_o.num_types1; i++)
1925 type[i] = r_o.type[i];
1928 else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0)
1940 prs_mem_free(&data );
1941 prs_mem_free(&rdata );
1946 /****************************************************************************
1947 do a SAMR Query Lookup RIDS
1948 ****************************************************************************/
1949 BOOL samr_query_lookup_rids(struct cli_state *cli, uint16 fnum,
1950 POLICY_HND *pol, uint32 flags,
1951 uint32 num_rids, uint32 *rids,
1959 SAMR_Q_LOOKUP_RIDS q_o;
1960 BOOL valid_query = False;
1962 if (pol == NULL || flags == 0 || num_rids == 0 || rids == NULL ||
1963 num_names == NULL || names == NULL || type == NULL ) return False;
1965 /* create and send a MSRPC command with api SAMR_LOOKUP_RIDS */
1967 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1968 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1970 DEBUG(4,("SAMR Query Lookup RIDs.\n"));
1972 /* store the parameters */
1973 make_samr_q_lookup_rids(&q_o, pol, flags, num_rids, rids);
1975 /* turn parameters into data stream */
1976 samr_io_q_lookup_rids("", &q_o, &data, 0);
1978 /* send the data on \PIPE\ */
1979 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_RIDS, &data, &rdata))
1981 SAMR_R_LOOKUP_RIDS r_o;
1985 samr_io_r_lookup_rids("", &r_o, &rdata, 0);
1986 p = rdata.offset != 0;
1988 if (p && r_o.status != 0)
1990 /* report error code */
1991 DEBUG(4,("SAMR_R_LOOKUP_RIDS: %s\n", get_nt_error_msg(r_o.status)));
1997 if (r_o.ptr_names != 0 && r_o.ptr_types != 0 &&
1998 r_o.num_types1 == r_o.num_names1)
2006 for (i = 0; i < r_o.num_names1; i++)
2009 unistr2_to_ascii(tmp, &r_o.uni_name[i], sizeof(tmp)-1);
2010 add_chars_to_array(num_names, names, tmp);
2013 if ((*num_names) != 0)
2015 (*type) = (uint32*)malloc((*num_names) * sizeof(**type));
2018 for (i = 0; (*type) != NULL && i < r_o.num_types1; i++)
2020 (*type)[i] = r_o.type[i];
2023 else if (r_o.ptr_names == 0 && r_o.ptr_types == 0)
2036 samr_free_r_lookup_rids(&r_o);
2039 prs_mem_free(&data );
2040 prs_mem_free(&rdata );
2045 /****************************************************************************
2046 do a SAMR Query Alias Members
2047 ****************************************************************************/
2048 BOOL samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
2049 POLICY_HND *alias_pol,
2050 uint32 *num_mem, DOM_SID2 *sid)
2055 SAMR_Q_QUERY_ALIASMEM q_o;
2056 BOOL valid_query = False;
2058 DEBUG(4,("SAMR Query Alias Members.\n"));
2060 if (alias_pol == NULL || sid == NULL || num_mem == NULL) return False;
2062 /* create and send a MSRPC command with api SAMR_QUERY_ALIASMEM */
2064 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2065 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2067 /* store the parameters */
2068 make_samr_q_query_aliasmem(&q_o, alias_pol);
2070 /* turn parameters into data stream */
2071 samr_io_q_query_aliasmem("", &q_o, &data, 0);
2073 /* send the data on \PIPE\ */
2074 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_ALIASMEM, &data, &rdata))
2076 SAMR_R_QUERY_ALIASMEM r_o;
2082 samr_io_r_query_aliasmem("", &r_o, &rdata, 0);
2083 p = rdata.offset != 0;
2085 if (p && r_o.status != 0)
2087 /* report error code */
2088 DEBUG(4,("SAMR_R_QUERY_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
2092 if (p && r_o.ptr != 0)
2095 *num_mem = r_o.num_sids;
2100 prs_mem_free(&data );
2101 prs_mem_free(&rdata );
2106 /****************************************************************************
2107 do a SAMR Query User Aliases
2108 ****************************************************************************/
2109 BOOL samr_query_useraliases(struct cli_state *cli, uint16 fnum,
2110 POLICY_HND *pol, uint32 *ptr_sid, DOM_SID2 *sid,
2111 uint32 *num_aliases, uint32 **rid)
2116 SAMR_Q_QUERY_USERALIASES q_o;
2117 BOOL valid_query = False;
2120 DEBUG(4,("SAMR Query User Aliases.\n"));
2122 if (pol == NULL || sid == NULL || rid == NULL || num_aliases == 0) return False;
2124 /* create and send a MSRPC command with api SAMR_QUERY_USERALIASES */
2126 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2127 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2129 /* store the parameters */
2130 make_samr_q_query_useraliases(&q_o, pol, ptr_sid, sid);
2132 /* turn parameters into data stream */
2133 samr_io_q_query_useraliases("", &q_o, &data, 0);
2135 /* send the data on \PIPE\ */
2136 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERALIASES, &data, &rdata))
2138 SAMR_R_QUERY_USERALIASES r_o;
2143 samr_io_r_query_useraliases("", &r_o, &rdata, 0);
2145 p = rdata.offset != 0;
2147 if (p && r_o.status != 0)
2149 /* report error code */
2150 DEBUG(4,("SAMR_R_QUERY_USERALIASES: %s\n", get_nt_error_msg(r_o.status)));
2154 if (p && r_o.ptr != 0)
2157 *num_aliases = r_o.num_entries;
2162 prs_mem_free(&data );
2163 prs_mem_free(&rdata );
2168 /****************************************************************************
2169 do a SAMR Query Group Members
2170 ****************************************************************************/
2171 BOOL samr_query_groupmem(struct cli_state *cli, uint16 fnum,
2172 POLICY_HND *group_pol,
2173 uint32 *num_mem, uint32 **rid, uint32 **attr)
2178 SAMR_Q_QUERY_GROUPMEM q_o;
2179 BOOL valid_query = False;
2181 DEBUG(4,("SAMR Query Group Members.\n"));
2183 if (group_pol == NULL || rid == NULL || attr == NULL || num_mem == NULL) return False;
2185 /* create and send a MSRPC command with api SAMR_QUERY_GROUPMEM */
2187 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2188 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2190 /* store the parameters */
2191 make_samr_q_query_groupmem(&q_o, group_pol);
2193 /* turn parameters into data stream */
2194 samr_io_q_query_groupmem("", &q_o, &data, 0);
2196 /* send the data on \PIPE\ */
2197 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPMEM, &data, &rdata))
2199 SAMR_R_QUERY_GROUPMEM r_o;
2205 samr_io_r_query_groupmem("", &r_o, &rdata, 0);
2208 p = rdata.offset != 0;
2210 if (p && r_o.status != 0)
2212 /* report error code */
2213 DEBUG(4,("SAMR_R_QUERY_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
2217 if (p && r_o.ptr != 0 &&
2218 r_o.ptr_rids != 0 && r_o.ptr_attrs != 0 &&
2219 r_o.num_rids == r_o.num_attrs)
2222 *num_mem = r_o.num_rids;
2227 prs_mem_free(&data );
2228 prs_mem_free(&rdata );
2233 /****************************************************************************
2234 do a SAMR Query User Groups
2235 ****************************************************************************/
2236 BOOL samr_query_usergroups(struct cli_state *cli, uint16 fnum,
2237 POLICY_HND *pol, uint32 *num_groups,
2243 SAMR_Q_QUERY_USERGROUPS q_o;
2244 BOOL valid_query = False;
2246 DEBUG(4,("SAMR Query User Groups.\n"));
2248 if (pol == NULL || gid == NULL || num_groups == 0) return False;
2250 /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
2252 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2253 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2255 /* store the parameters */
2256 make_samr_q_query_usergroups(&q_o, pol);
2258 /* turn parameters into data stream */
2259 samr_io_q_query_usergroups("", &q_o, &data, 0);
2261 /* send the data on \PIPE\ */
2262 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERGROUPS, &data, &rdata))
2264 SAMR_R_QUERY_USERGROUPS r_o;
2270 samr_io_r_query_usergroups("", &r_o, &rdata, 0);
2272 p = rdata.offset != 0;
2274 if (p && r_o.status != 0)
2276 /* report error code */
2277 DEBUG(4,("SAMR_R_QUERY_USERGROUPS: %s\n", get_nt_error_msg(r_o.status)));
2281 if (p && r_o.ptr_0 != 0)
2284 *num_groups = r_o.num_entries;
2289 prs_mem_free(&data );
2290 prs_mem_free(&rdata );
2295 /****************************************************************************
2296 do a SAMR Query Group Info
2297 ****************************************************************************/
2298 BOOL samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
2300 uint16 switch_value, GROUP_INFO_CTR* ctr)
2305 SAMR_Q_QUERY_GROUPINFO q_o;
2306 BOOL valid_query = False;
2308 DEBUG(4,("SAMR Query Group Info. level: %d\n", switch_value));
2310 if (pol == NULL || ctr == NULL || switch_value == 0) return False;
2312 /* create and send a MSRPC command with api SAMR_QUERY_GROUPINFO */
2314 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2315 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2317 /* store the parameters */
2318 make_samr_q_query_groupinfo(&q_o, pol, switch_value);
2320 /* turn parameters into data stream */
2321 samr_io_q_query_groupinfo("", &q_o, &data, 0);
2323 /* send the data on \PIPE\ */
2324 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPINFO, &data, &rdata))
2326 SAMR_R_QUERY_GROUPINFO r_o;
2332 samr_io_r_query_groupinfo("", &r_o, &rdata, 0);
2333 p = rdata.offset != 0;
2335 if (p && r_o.status != 0)
2337 /* report error code */
2338 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
2342 if (p && r_o.ctr->switch_value1 != switch_value)
2344 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: received incorrect level %d\n",
2345 r_o.ctr->switch_value1));
2348 if (p && r_o.ptr != 0)
2354 prs_mem_free(&data );
2355 prs_mem_free(&rdata );
2360 /****************************************************************************
2361 do a SAMR Query User Info
2362 ****************************************************************************/
2363 BOOL samr_query_userinfo(struct cli_state *cli, uint16 fnum,
2364 POLICY_HND *pol, uint16 switch_value, void* usr)
2369 SAMR_Q_QUERY_USERINFO q_o;
2370 BOOL valid_query = False;
2372 DEBUG(4,("SAMR Query User Info. level: %d\n", switch_value));
2374 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2376 /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
2378 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2379 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2381 /* store the parameters */
2382 make_samr_q_query_userinfo(&q_o, pol, switch_value);
2384 /* turn parameters into data stream */
2385 samr_io_q_query_userinfo("", &q_o, &data, 0);
2387 /* send the data on \PIPE\ */
2388 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERINFO, &data, &rdata))
2390 SAMR_R_QUERY_USERINFO r_o;
2396 samr_io_r_query_userinfo("", &r_o, &rdata, 0);
2397 p = rdata.offset != 0;
2399 if (p && r_o.status != 0)
2401 /* report error code */
2402 DEBUG(4,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2406 if (p && r_o.switch_value != switch_value)
2408 DEBUG(4,("SAMR_R_QUERY_USERINFO: received incorrect level %d\n",
2412 if (p && r_o.ptr != 0)
2418 prs_mem_free(&data );
2419 prs_mem_free(&rdata );
2424 /****************************************************************************
2426 ****************************************************************************/
2427 BOOL samr_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
2432 SAMR_Q_CLOSE_HND q_c;
2433 BOOL valid_close = False;
2435 DEBUG(4,("SAMR Close\n"));
2437 if (hnd == NULL) return False;
2439 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2440 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2442 /* create and send a MSRPC command with api SAMR_CLOSE_HND */
2444 /* store the parameters */
2445 make_samr_q_close_hnd(&q_c, hnd);
2447 /* turn parameters into data stream */
2448 samr_io_q_close_hnd("", &q_c, &data, 0);
2450 /* send the data on \PIPE\ */
2451 if (rpc_api_pipe_req(cli, fnum, SAMR_CLOSE_HND, &data, &rdata))
2453 SAMR_R_CLOSE_HND r_c;
2456 samr_io_r_close_hnd("", &r_c, &rdata, 0);
2457 p = rdata.offset != 0;
2459 if (p && r_c.status != 0)
2461 /* report error code */
2462 DEBUG(4,("SAMR_CLOSE_HND: %s\n", get_nt_error_msg(r_c.status)));
2468 /* check that the returned policy handle is all zeros */
2472 for (i = 0; i < sizeof(r_c.pol.data); i++)
2474 if (r_c.pol.data[i] != 0)
2476 valid_close = False;
2482 DEBUG(4,("SAMR_CLOSE_HND: non-zero handle returned\n"));
2487 prs_mem_free(&data );
2488 prs_mem_free(&rdata );
2493 /****************************************************************************
2494 do a SAMR query display info
2495 ****************************************************************************/
2496 BOOL samr_query_dispinfo(struct cli_state *cli, uint16 fnum,
2497 POLICY_HND *pol_open_domain, uint16 level,
2498 uint32 *num_entries,
2499 SAM_DISPINFO_CTR *ctr)
2504 SAMR_Q_QUERY_DISPINFO q_o;
2505 BOOL valid_query = False;
2507 DEBUG(4,("SAMR Query Display Info. level: %d\n", level));
2509 if (pol_open_domain == NULL || num_entries == NULL || ctr == NULL ||
2515 /* create and send a MSRPC command with api SAMR_QUERY_DISPINFO */
2517 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2518 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2520 /* store the parameters */
2521 make_samr_q_query_dispinfo(&q_o, pol_open_domain, level, 0, 0xffffffff);
2523 /* turn parameters into data stream */
2524 samr_io_q_query_dispinfo("", &q_o, &data, 0);
2526 /* send the data on \PIPE\ */
2527 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_DISPINFO, &data, &rdata))
2529 SAMR_R_QUERY_DISPINFO r_o;
2535 samr_io_r_query_dispinfo("", &r_o, &rdata, 0);
2536 p = rdata.offset != 0;
2538 if (p && r_o.status != 0)
2540 /* report error code */
2541 DEBUG(4,("SAMR_R_QUERY_DISPINFO: %s\n", get_nt_error_msg(r_o.status)));
2545 if (p && r_o.switch_level != level)
2547 DEBUG(4,("SAMR_R_QUERY_DISPINFO: received incorrect level %d\n",
2551 if (p && r_o.ptr_entries != 0)
2557 prs_mem_free(&data );
2558 prs_mem_free(&rdata );