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 0x00000010, 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 BOOL samr_enum_dom_groups(struct cli_state *cli, uint16 fnum,
550 POLICY_HND *pol, uint32 size,
551 struct acct_info **sam,
557 SAMR_Q_ENUM_DOM_GROUPS q_e;
558 BOOL valid_pol = False;
560 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
562 if (pol == NULL || num_sam_groups == NULL) return False;
564 /* create and send a MSRPC command with api SAMR_ENUM_DOM_GROUPS */
566 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
567 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
569 /* store the parameters */
570 make_samr_q_enum_dom_groups(&q_e, pol, size);
572 /* turn parameters into data stream */
573 samr_io_q_enum_dom_groups("", &q_e, &data, 0);
575 /* send the data on \PIPE\ */
576 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_GROUPS, &data, &rdata))
578 SAMR_R_ENUM_DOM_GROUPS r_e;
581 samr_io_r_enum_dom_groups("", &r_e, &rdata, 0);
583 p = rdata.offset != 0;
584 if (p && r_e.status != 0)
586 /* report error code */
587 DEBUG(4,("SAMR_R_ENUM_DOM_GROUPS: %s\n", get_nt_error_msg(r_e.status)));
596 *num_sam_groups = r_e.num_entries2;
597 if (*num_sam_groups > MAX_SAM_ENTRIES)
599 *num_sam_groups = MAX_SAM_ENTRIES;
600 DEBUG(2,("samr_enum_dom_groups: sam group entries limited to %d\n",
604 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_groups));
611 for (i = 0; i < *num_sam_groups; i++)
613 (*sam)[i].rid = r_e.sam[i].rid;
614 (*sam)[i].acct_name[0] = 0;
615 (*sam)[i].acct_desc[0] = 0;
616 if (r_e.sam[i].hdr_name.buffer)
618 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
621 DEBUG(5,("samr_enum_dom_groups: idx: %4d rid: %8x acct: %s\n",
622 i, (*sam)[i].rid, (*sam)[i].acct_name));
628 prs_mem_free(&data );
629 prs_mem_free(&rdata );
634 /****************************************************************************
635 do a SAMR enumerate aliases
636 ****************************************************************************/
637 BOOL samr_enum_dom_aliases(struct cli_state *cli, uint16 fnum,
638 POLICY_HND *pol, uint32 size,
639 struct acct_info **sam,
640 int *num_sam_aliases)
645 SAMR_Q_ENUM_DOM_ALIASES q_e;
646 BOOL valid_pol = False;
648 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
650 if (pol == NULL || num_sam_aliases == NULL) return False;
652 /* create and send a MSRPC command with api SAMR_ENUM_DOM_ALIASES */
654 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
655 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
657 /* store the parameters */
658 make_samr_q_enum_dom_aliases(&q_e, pol, size);
660 /* turn parameters into data stream */
661 samr_io_q_enum_dom_aliases("", &q_e, &data, 0);
663 /* send the data on \PIPE\ */
664 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_ALIASES, &data, &rdata))
666 SAMR_R_ENUM_DOM_ALIASES r_e;
669 samr_io_r_enum_dom_aliases("", &r_e, &rdata, 0);
671 p = rdata.offset != 0;
672 if (p && r_e.status != 0)
674 /* report error code */
675 DEBUG(4,("SAMR_R_ENUM_DOM_ALIASES: %s\n", get_nt_error_msg(r_e.status)));
684 *num_sam_aliases = r_e.num_entries2;
685 if (*num_sam_aliases > MAX_SAM_ENTRIES)
687 *num_sam_aliases = MAX_SAM_ENTRIES;
688 DEBUG(2,("samr_enum_dom_aliases: sam user entries limited to %d\n",
692 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_aliases));
696 *num_sam_aliases = 0;
699 for (i = 0; i < *num_sam_aliases; i++)
701 (*sam)[i].rid = r_e.sam[i].rid;
702 (*sam)[i].acct_name[0] = 0;
703 (*sam)[i].acct_desc[0] = 0;
704 if (r_e.sam[i].hdr_name.buffer)
706 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
709 DEBUG(5,("samr_enum_dom_aliases: idx: %4d rid: %8x acct: %s\n",
710 i, (*sam)[i].rid, (*sam)[i].acct_name));
716 prs_mem_free(&data );
717 prs_mem_free(&rdata );
722 /****************************************************************************
723 do a SAMR enumerate users
724 ****************************************************************************/
725 BOOL samr_enum_dom_users(struct cli_state *cli, uint16 fnum,
726 POLICY_HND *pol, uint32 start_idx,
727 uint16 acb_mask, uint16 unk_1, uint32 size,
728 struct acct_info **sam,
734 SAMR_Q_ENUM_DOM_USERS q_e;
735 BOOL valid_pol = False;
737 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
739 if (pol == NULL || num_sam_users == NULL) return False;
741 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
743 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
744 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
746 /* store the parameters */
747 make_samr_q_enum_dom_users(&q_e, pol, start_idx, acb_mask, unk_1, size);
749 /* turn parameters into data stream */
750 samr_io_q_enum_dom_users("", &q_e, &data, 0);
752 /* send the data on \PIPE\ */
753 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_USERS, &data, &rdata))
755 SAMR_R_ENUM_DOM_USERS r_e;
758 samr_io_r_enum_dom_users("", &r_e, &rdata, 0);
760 p = rdata.offset != 0;
761 if (p && r_e.status != 0)
763 /* report error code */
764 DEBUG(4,("SAMR_R_ENUM_DOM_USERS: %s\n", get_nt_error_msg(r_e.status)));
773 *num_sam_users = r_e.num_entries2;
774 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_users));
781 for (i = 0; i < *num_sam_users; i++)
783 (*sam)[i].rid = r_e.sam[i].rid;
784 (*sam)[i].acct_name[0] = 0;
785 (*sam)[i].acct_desc[0] = 0;
786 if (r_e.sam[i].hdr_name.buffer)
788 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_acct_name[name_idx], sizeof((*sam)[i].acct_name)-1);
791 DEBUG(5,("samr_enum_dom_users: idx: %4d rid: %8x acct: %s\n",
792 i, (*sam)[i].rid, (*sam)[i].acct_name));
801 if (r_e.uni_acct_name != NULL)
803 free(r_e.uni_acct_name);
807 prs_mem_free(&data );
808 prs_mem_free(&rdata );
813 /****************************************************************************
815 ****************************************************************************/
816 BOOL samr_connect(struct cli_state *cli, uint16 fnum,
817 char *srv_name, uint32 unknown_0,
818 POLICY_HND *connect_pol)
824 BOOL valid_pol = False;
826 DEBUG(4,("SAMR Open Policy server:%s undoc value:%x\n",
827 srv_name, unknown_0));
829 if (srv_name == NULL || connect_pol == NULL) return False;
831 /* create and send a MSRPC command with api SAMR_CONNECT */
833 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
834 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
836 /* store the parameters */
837 make_samr_q_connect(&q_o, srv_name, unknown_0);
839 /* turn parameters into data stream */
840 samr_io_q_connect("", &q_o, &data, 0);
842 /* send the data on \PIPE\ */
843 if (rpc_api_pipe_req(cli, fnum, SAMR_CONNECT, &data, &rdata))
848 samr_io_r_connect("", &r_o, &rdata, 0);
849 p = rdata.offset != 0;
851 if (p && r_o.status != 0)
853 /* report error code */
854 DEBUG(4,("SAMR_R_CONNECT: %s\n", get_nt_error_msg(r_o.status)));
860 memcpy(connect_pol, &r_o.connect_pol, sizeof(r_o.connect_pol));
865 prs_mem_free(&data );
866 prs_mem_free(&rdata );
871 /****************************************************************************
873 ****************************************************************************/
874 BOOL samr_open_user(struct cli_state *cli, uint16 fnum,
875 POLICY_HND *pol, uint32 unk_0, uint32 rid,
876 POLICY_HND *user_pol)
881 SAMR_Q_OPEN_USER q_o;
882 BOOL valid_pol = False;
884 DEBUG(4,("SAMR Open User. unk_0: %08x RID:%x\n",
887 if (pol == NULL || user_pol == NULL) return False;
889 /* create and send a MSRPC command with api SAMR_OPEN_USER */
891 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
892 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
894 /* store the parameters */
895 make_samr_q_open_user(&q_o, pol, unk_0, rid);
897 /* turn parameters into data stream */
898 samr_io_q_open_user("", &q_o, &data, 0);
900 /* send the data on \PIPE\ */
901 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_USER, &data, &rdata))
903 SAMR_R_OPEN_USER r_o;
906 samr_io_r_open_user("", &r_o, &rdata, 0);
907 p = rdata.offset != 0;
909 if (p && r_o.status != 0)
911 /* report error code */
912 DEBUG(4,("SAMR_R_OPEN_USER: %s\n", get_nt_error_msg(r_o.status)));
918 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
923 prs_mem_free(&data );
924 prs_mem_free(&rdata );
929 /****************************************************************************
931 ****************************************************************************/
932 BOOL samr_open_alias(struct cli_state *cli, uint16 fnum,
933 POLICY_HND *domain_pol,
934 uint32 flags, uint32 rid,
935 POLICY_HND *alias_pol)
940 SAMR_Q_OPEN_ALIAS q_o;
941 BOOL valid_pol = False;
943 DEBUG(4,("SAMR Open Alias. RID:%x\n", rid));
945 if (alias_pol == NULL || domain_pol == NULL) return False;
947 /* create and send a MSRPC command with api SAMR_OPEN_ALIAS */
949 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
950 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
952 /* store the parameters */
953 make_samr_q_open_alias(&q_o, domain_pol, flags, rid);
955 /* turn parameters into data stream */
956 samr_io_q_open_alias("", &q_o, &data, 0);
958 /* send the data on \PIPE\ */
959 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_ALIAS, &data, &rdata))
961 SAMR_R_OPEN_ALIAS r_o;
964 samr_io_r_open_alias("", &r_o, &rdata, 0);
965 p = rdata.offset != 0;
967 if (p && r_o.status != 0)
969 /* report error code */
970 DEBUG(4,("SAMR_R_OPEN_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
976 memcpy(alias_pol, &r_o.pol, sizeof(r_o.pol));
981 prs_mem_free(&data );
982 prs_mem_free(&rdata );
987 /****************************************************************************
988 do a SAMR Delete Alias Member
989 ****************************************************************************/
990 BOOL samr_del_aliasmem(struct cli_state *cli, uint16 fnum,
991 POLICY_HND *alias_pol, DOM_SID *sid)
996 SAMR_Q_DEL_ALIASMEM q_o;
997 BOOL valid_pol = False;
999 if (alias_pol == NULL || sid == NULL) return False;
1001 /* create and send a MSRPC command with api SAMR_DEL_ALIASMEM */
1003 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1004 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1006 DEBUG(4,("SAMR Delete Alias Member.\n"));
1008 /* store the parameters */
1009 make_samr_q_del_aliasmem(&q_o, alias_pol, sid);
1011 /* turn parameters into data stream */
1012 samr_io_q_del_aliasmem("", &q_o, &data, 0);
1014 /* send the data on \PIPE\ */
1015 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_ALIASMEM, &data, &rdata))
1017 SAMR_R_DEL_ALIASMEM r_o;
1020 samr_io_r_del_aliasmem("", &r_o, &rdata, 0);
1021 p = rdata.offset != 0;
1023 if (p && r_o.status != 0)
1025 /* report error code */
1026 DEBUG(4,("SAMR_R_DEL_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1036 prs_mem_free(&data );
1037 prs_mem_free(&rdata );
1042 /****************************************************************************
1043 do a SAMR Add Alias Member
1044 ****************************************************************************/
1045 BOOL samr_add_aliasmem(struct cli_state *cli, uint16 fnum,
1046 POLICY_HND *alias_pol, DOM_SID *sid)
1051 SAMR_Q_ADD_ALIASMEM q_o;
1052 BOOL valid_pol = False;
1054 if (alias_pol == NULL || sid == NULL) return False;
1056 /* create and send a MSRPC command with api SAMR_ADD_ALIASMEM */
1058 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1059 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1061 DEBUG(4,("SAMR Add Alias Member.\n"));
1063 /* store the parameters */
1064 make_samr_q_add_aliasmem(&q_o, alias_pol, sid);
1066 /* turn parameters into data stream */
1067 samr_io_q_add_aliasmem("", &q_o, &data, 0);
1069 /* send the data on \PIPE\ */
1070 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_ALIASMEM, &data, &rdata))
1072 SAMR_R_ADD_ALIASMEM r_o;
1075 samr_io_r_add_aliasmem("", &r_o, &rdata, 0);
1076 p = rdata.offset != 0;
1078 if (p && r_o.status != 0)
1080 /* report error code */
1081 DEBUG(4,("SAMR_R_ADD_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1091 prs_mem_free(&data );
1092 prs_mem_free(&rdata );
1097 /****************************************************************************
1098 do a SAMR Delete Domain Alias
1099 ****************************************************************************/
1100 BOOL samr_delete_dom_alias(struct cli_state *cli, uint16 fnum,
1101 POLICY_HND *alias_pol)
1106 SAMR_Q_DELETE_DOM_ALIAS q_o;
1107 BOOL valid_pol = False;
1109 if (alias_pol == NULL) return False;
1111 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_ALIAS */
1113 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1114 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1116 DEBUG(4,("SAMR Delete Domain Alias.\n"));
1118 /* store the parameters */
1119 make_samr_q_delete_dom_alias(&q_o, alias_pol);
1121 /* turn parameters into data stream */
1122 samr_io_q_delete_dom_alias("", &q_o, &data, 0);
1124 /* send the data on \PIPE\ */
1125 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_ALIAS, &data, &rdata))
1127 SAMR_R_DELETE_DOM_ALIAS r_o;
1130 samr_io_r_delete_dom_alias("", &r_o, &rdata, 0);
1131 p = rdata.offset != 0;
1133 if (p && r_o.status != 0)
1135 /* report error code */
1136 DEBUG(4,("SAMR_R_DELETE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1146 prs_mem_free(&data );
1147 prs_mem_free(&rdata );
1152 /****************************************************************************
1153 do a SAMR Create Domain User
1154 ****************************************************************************/
1155 BOOL samr_create_dom_user(struct cli_state *cli, uint16 fnum,
1156 POLICY_HND *domain_pol, const char *acct_name,
1157 uint32 unk_0, uint32 unk_1,
1158 POLICY_HND *user_pol, uint32 *rid)
1163 SAMR_Q_CREATE_USER q_o;
1164 BOOL valid_pol = False;
1166 if (user_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1168 /* create and send a MSRPC command with api SAMR_CREATE_USER */
1170 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1171 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1173 DEBUG(4,("SAMR Create Domain User. Name:%s\n", acct_name));
1175 /* store the parameters */
1176 make_samr_q_create_user(&q_o, domain_pol, acct_name, unk_0, unk_1);
1178 /* turn parameters into data stream */
1179 samr_io_q_create_user("", &q_o, &data, 0);
1181 /* send the data on \PIPE\ */
1182 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_USER, &data, &rdata))
1184 SAMR_R_CREATE_USER r_o;
1187 samr_io_r_create_user("", &r_o, &rdata, 0);
1188 p = rdata.offset != 0;
1190 if (p && r_o.status != 0)
1192 /* report error code */
1193 DEBUG(4,("SAMR_R_CREATE_USER: %s\n", get_nt_error_msg(r_o.status)));
1199 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
1200 *rid = r_o.user_rid;
1205 prs_mem_free(&data );
1206 prs_mem_free(&rdata );
1211 /****************************************************************************
1212 do a SAMR Create Domain Alias
1213 ****************************************************************************/
1214 BOOL samr_create_dom_alias(struct cli_state *cli, uint16 fnum,
1215 POLICY_HND *domain_pol, const char *acct_name,
1216 POLICY_HND *alias_pol, uint32 *rid)
1221 SAMR_Q_CREATE_DOM_ALIAS q_o;
1222 BOOL valid_pol = False;
1224 if (alias_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1226 /* create and send a MSRPC command with api SAMR_CREATE_DOM_ALIAS */
1228 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1229 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1231 DEBUG(4,("SAMR Create Domain Alias. Name:%s\n", acct_name));
1233 /* store the parameters */
1234 make_samr_q_create_dom_alias(&q_o, domain_pol, acct_name);
1236 /* turn parameters into data stream */
1237 samr_io_q_create_dom_alias("", &q_o, &data, 0);
1239 /* send the data on \PIPE\ */
1240 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_ALIAS, &data, &rdata))
1242 SAMR_R_CREATE_DOM_ALIAS r_o;
1245 samr_io_r_create_dom_alias("", &r_o, &rdata, 0);
1246 p = rdata.offset != 0;
1248 if (p && r_o.status != 0)
1250 /* report error code */
1251 DEBUG(4,("SAMR_R_CREATE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1257 memcpy(alias_pol, &r_o.alias_pol, sizeof(r_o.alias_pol));
1263 prs_mem_free(&data );
1264 prs_mem_free(&rdata );
1270 /****************************************************************************
1271 do a SAMR Get Alias Info
1272 ****************************************************************************/
1273 BOOL samr_get_aliasinfo(struct cli_state *cli, uint16 fnum,
1274 POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1279 SAMR_Q_GET_ALIASINFO q_o;
1280 BOOL valid_pol = False;
1282 if (alias_pol == NULL || ctr == NULL) return False;
1284 /* create and send a MSRPC command with api SAMR_GET_ALIASINFO */
1286 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1287 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1289 DEBUG(4,("SAMR Get Alias Info\n"));
1291 /* store the parameters */
1292 make_samr_q_get_aliasinfo(&q_o, alias_pol, ctr);
1294 /* turn parameters into data stream */
1295 samr_io_q_get_aliasinfo("", &q_o, &data, 0);
1297 /* send the data on \PIPE\ */
1298 if (rpc_api_pipe_req(cli, fnum, SAMR_GET_ALIASINFO, &data, &rdata))
1300 SAMR_R_GET_ALIASINFO r_o;
1303 samr_io_r_get_aliasinfo("", &r_o, &rdata, 0);
1304 p = rdata.offset != 0;
1306 if (p && r_o.status != 0)
1308 /* report error code */
1309 DEBUG(4,("SAMR_R_GET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1319 prs_mem_free(&data );
1320 prs_mem_free(&rdata );
1326 /****************************************************************************
1327 do a SAMR Set Alias Info
1328 ****************************************************************************/
1329 BOOL samr_set_aliasinfo(struct cli_state *cli, uint16 fnum,
1330 POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1335 SAMR_Q_SET_ALIASINFO q_o;
1336 BOOL valid_pol = False;
1338 if (alias_pol == NULL || ctr == NULL) return False;
1340 /* create and send a MSRPC command with api SAMR_SET_ALIASINFO */
1342 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1343 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1345 DEBUG(4,("SAMR Set Alias Info\n"));
1347 /* store the parameters */
1348 make_samr_q_set_aliasinfo(&q_o, alias_pol, ctr);
1350 /* turn parameters into data stream */
1351 samr_io_q_set_aliasinfo("", &q_o, &data, 0);
1353 /* send the data on \PIPE\ */
1354 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_ALIASINFO, &data, &rdata))
1356 SAMR_R_SET_ALIASINFO r_o;
1359 samr_io_r_set_aliasinfo("", &r_o, &rdata, 0);
1360 p = rdata.offset != 0;
1362 if (p && r_o.status != 0)
1364 /* report error code */
1365 DEBUG(4,("SAMR_R_SET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1375 prs_mem_free(&data );
1376 prs_mem_free(&rdata );
1381 /****************************************************************************
1382 do a SAMR Open Group
1383 ****************************************************************************/
1384 BOOL samr_open_group(struct cli_state *cli, uint16 fnum,
1385 POLICY_HND *domain_pol,
1386 uint32 flags, uint32 rid,
1387 POLICY_HND *group_pol)
1392 SAMR_Q_OPEN_GROUP q_o;
1393 BOOL valid_pol = False;
1395 DEBUG(4,("SAMR Open Group. RID:%x\n", rid));
1397 if (group_pol == NULL || domain_pol == NULL) return False;
1399 /* create and send a MSRPC command with api SAMR_OPEN_GROUP */
1401 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1402 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1404 /* store the parameters */
1405 make_samr_q_open_group(&q_o, domain_pol, flags, rid);
1407 /* turn parameters into data stream */
1408 samr_io_q_open_group("", &q_o, &data, 0);
1410 /* send the data on \PIPE\ */
1411 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_GROUP, &data, &rdata))
1413 SAMR_R_OPEN_GROUP r_o;
1416 samr_io_r_open_group("", &r_o, &rdata, 0);
1417 p = rdata.offset != 0;
1419 if (p && r_o.status != 0)
1421 /* report error code */
1422 DEBUG(4,("SAMR_R_OPEN_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1428 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1433 prs_mem_free(&data );
1434 prs_mem_free(&rdata );
1439 /****************************************************************************
1440 do a SAMR Delete Group Member
1441 ****************************************************************************/
1442 BOOL samr_del_groupmem(struct cli_state *cli, uint16 fnum,
1443 POLICY_HND *group_pol, uint32 rid)
1448 SAMR_Q_DEL_GROUPMEM q_o;
1449 BOOL valid_pol = False;
1451 if (group_pol == NULL) return False;
1453 /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */
1455 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1456 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1458 DEBUG(4,("SAMR Delete Group Member.\n"));
1460 /* store the parameters */
1461 make_samr_q_del_groupmem(&q_o, group_pol, rid);
1463 /* turn parameters into data stream */
1464 samr_io_q_del_groupmem("", &q_o, &data, 0);
1466 /* send the data on \PIPE\ */
1467 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_GROUPMEM, &data, &rdata))
1469 SAMR_R_DEL_GROUPMEM r_o;
1472 samr_io_r_del_groupmem("", &r_o, &rdata, 0);
1473 p = rdata.offset != 0;
1475 if (p && r_o.status != 0)
1477 /* report error code */
1478 DEBUG(4,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1488 prs_mem_free(&data );
1489 prs_mem_free(&rdata );
1494 /****************************************************************************
1495 do a SAMR Add Group Member
1496 ****************************************************************************/
1497 BOOL samr_add_groupmem(struct cli_state *cli, uint16 fnum,
1498 POLICY_HND *group_pol, uint32 rid)
1503 SAMR_Q_ADD_GROUPMEM q_o;
1504 BOOL valid_pol = False;
1506 if (group_pol == NULL) return False;
1508 /* create and send a MSRPC command with api SAMR_ADD_GROUPMEM */
1510 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1511 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1513 DEBUG(4,("SAMR Add Group Member.\n"));
1515 /* store the parameters */
1516 make_samr_q_add_groupmem(&q_o, group_pol, rid);
1518 /* turn parameters into data stream */
1519 samr_io_q_add_groupmem("", &q_o, &data, 0);
1521 /* send the data on \PIPE\ */
1522 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_GROUPMEM, &data, &rdata))
1524 SAMR_R_ADD_GROUPMEM r_o;
1527 samr_io_r_add_groupmem("", &r_o, &rdata, 0);
1528 p = rdata.offset != 0;
1530 if (p && r_o.status != 0)
1532 /* report error code */
1533 DEBUG(4,("SAMR_R_ADD_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1543 prs_mem_free(&data );
1544 prs_mem_free(&rdata );
1549 /****************************************************************************
1550 do a SAMR Delete Domain Group
1551 ****************************************************************************/
1552 BOOL samr_delete_dom_group(struct cli_state *cli, uint16 fnum, POLICY_HND *group_pol)
1557 SAMR_Q_DELETE_DOM_GROUP q_o;
1558 BOOL valid_pol = False;
1560 if (group_pol == NULL) return False;
1562 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */
1564 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1565 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1567 DEBUG(4,("SAMR Delete Domain Group.\n"));
1569 /* store the parameters */
1570 make_samr_q_delete_dom_group(&q_o, group_pol);
1572 /* turn parameters into data stream */
1573 samr_io_q_delete_dom_group("", &q_o, &data, 0);
1575 /* send the data on \PIPE\ */
1576 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_GROUP, &data, &rdata))
1578 SAMR_R_DELETE_DOM_GROUP r_o;
1581 samr_io_r_delete_dom_group("", &r_o, &rdata, 0);
1582 p = rdata.offset != 0;
1584 if (p && r_o.status != 0)
1586 /* report error code */
1587 DEBUG(4,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1597 prs_mem_free(&data );
1598 prs_mem_free(&rdata );
1603 /****************************************************************************
1604 do a SAMR Create Domain Group
1605 ****************************************************************************/
1606 BOOL samr_create_dom_group(struct cli_state *cli, uint16 fnum,
1607 POLICY_HND *domain_pol, const char *acct_name,
1608 POLICY_HND *group_pol, uint32 *rid)
1613 SAMR_Q_CREATE_DOM_GROUP q_o;
1614 BOOL valid_pol = False;
1616 if (group_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1618 /* create and send a MSRPC command with api SAMR_CREATE_DOM_GROUP */
1620 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1621 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1623 DEBUG(4,("SAMR Create Domain Group. Name:%s\n", acct_name));
1625 /* store the parameters */
1626 make_samr_q_create_dom_group(&q_o, domain_pol, acct_name);
1628 /* turn parameters into data stream */
1629 samr_io_q_create_dom_group("", &q_o, &data, 0);
1631 /* send the data on \PIPE\ */
1632 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_GROUP, &data, &rdata))
1634 SAMR_R_CREATE_DOM_GROUP r_o;
1637 samr_io_r_create_dom_group("", &r_o, &rdata, 0);
1638 p = rdata.offset != 0;
1640 if (p && r_o.status != 0)
1642 /* report error code */
1643 DEBUG(4,("SAMR_R_CREATE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1649 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1655 prs_mem_free(&data );
1656 prs_mem_free(&rdata );
1661 /****************************************************************************
1662 do a SAMR Set Group Info
1663 ****************************************************************************/
1664 BOOL samr_set_groupinfo(struct cli_state *cli, uint16 fnum,
1665 POLICY_HND *group_pol, GROUP_INFO_CTR *ctr)
1670 SAMR_Q_SET_GROUPINFO q_o;
1671 BOOL valid_pol = False;
1673 if (group_pol == NULL || ctr == NULL) return False;
1675 /* create and send a MSRPC command with api SAMR_SET_GROUPINFO */
1677 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1678 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1680 DEBUG(4,("SAMR Set Group Info\n"));
1682 /* store the parameters */
1683 make_samr_q_set_groupinfo(&q_o, group_pol, ctr);
1685 /* turn parameters into data stream */
1686 samr_io_q_set_groupinfo("", &q_o, &data, 0);
1688 /* send the data on \PIPE\ */
1689 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_GROUPINFO, &data, &rdata))
1691 SAMR_R_SET_GROUPINFO r_o;
1694 samr_io_r_set_groupinfo("", &r_o, &rdata, 0);
1695 p = rdata.offset != 0;
1697 if (p && r_o.status != 0)
1699 /* report error code */
1700 DEBUG(4,("SAMR_R_SET_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
1710 prs_mem_free(&data );
1711 prs_mem_free(&rdata );
1716 /****************************************************************************
1717 do a SAMR Open Domain
1718 ****************************************************************************/
1719 BOOL samr_open_domain(struct cli_state *cli, uint16 fnum,
1720 POLICY_HND *connect_pol, uint32 ace_perms,
1722 POLICY_HND *domain_pol)
1728 SAMR_Q_OPEN_DOMAIN q_o;
1729 BOOL valid_pol = False;
1731 if (DEBUGLEVEL >= 4)
1733 sid_to_string(sid_str, sid);
1734 DEBUG(4,("SAMR Open Domain. SID:%s Permissions:%x\n",
1735 sid_str, ace_perms));
1738 if (connect_pol == NULL || sid == NULL || domain_pol == NULL) return False;
1740 /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
1742 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1743 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1745 /* store the parameters */
1746 make_samr_q_open_domain(&q_o, connect_pol, ace_perms, sid);
1748 /* turn parameters into data stream */
1749 samr_io_q_open_domain("", &q_o, &data, 0);
1751 /* send the data on \PIPE\ */
1752 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_DOMAIN, &data, &rdata))
1754 SAMR_R_OPEN_DOMAIN r_o;
1757 samr_io_r_open_domain("", &r_o, &rdata, 0);
1758 p = rdata.offset != 0;
1760 if (p && r_o.status != 0)
1762 /* report error code */
1763 DEBUG(4,("SAMR_R_OPEN_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1769 memcpy(domain_pol, &r_o.domain_pol, sizeof(r_o.domain_pol));
1774 prs_mem_free(&data );
1775 prs_mem_free(&rdata );
1780 /****************************************************************************
1781 do a SAMR Query Lookup Domain
1782 ****************************************************************************/
1783 BOOL samr_query_lookup_domain(struct cli_state *cli, uint16 fnum,
1784 POLICY_HND *pol, const char *dom_name,
1790 SAMR_Q_LOOKUP_DOMAIN q_o;
1791 BOOL valid_query = False;
1793 if (pol == NULL || dom_name == NULL || dom_sid == NULL) return False;
1795 /* create and send a MSRPC command with api SAMR_LOOKUP_DOMAIN */
1797 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1798 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1800 DEBUG(4,("SAMR Query Lookup Domain.\n"));
1802 /* store the parameters */
1803 make_samr_q_lookup_domain(&q_o, pol, dom_name);
1805 /* turn parameters into data stream */
1806 samr_io_q_lookup_domain("", &q_o, &data, 0);
1808 /* send the data on \PIPE\ */
1809 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_DOMAIN, &data, &rdata))
1811 SAMR_R_LOOKUP_DOMAIN r_o;
1814 samr_io_r_lookup_domain("", &r_o, &rdata, 0);
1815 p = rdata.offset != 0;
1817 if (p && r_o.status != 0)
1819 /* report error code */
1820 DEBUG(4,("SAMR_R_LOOKUP_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1824 if (p && r_o.ptr_sid != 0)
1826 sid_copy(dom_sid, &r_o.dom_sid.sid);
1831 prs_mem_free(&data );
1832 prs_mem_free(&rdata );
1837 /****************************************************************************
1838 do a SAMR Query Lookup Names
1839 ****************************************************************************/
1840 BOOL samr_query_lookup_names(struct cli_state *cli, uint16 fnum,
1841 POLICY_HND *pol, uint32 flags,
1842 uint32 num_names, char **names,
1844 uint32 rid[MAX_LOOKUP_SIDS],
1845 uint32 type[MAX_LOOKUP_SIDS])
1850 SAMR_Q_LOOKUP_NAMES q_o;
1851 BOOL valid_query = False;
1853 if (pol == NULL || flags == 0 || num_names == 0 || names == NULL ||
1854 num_rids == NULL || rid == NULL || type == NULL ) return False;
1856 /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */
1858 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1859 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1861 DEBUG(4,("SAMR Query Lookup NAMES.\n"));
1863 /* store the parameters */
1864 make_samr_q_lookup_names(&q_o, pol, flags, num_names, names);
1866 /* turn parameters into data stream */
1867 samr_io_q_lookup_names("", &q_o, &data, 0);
1869 /* send the data on \PIPE\ */
1870 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_NAMES, &data, &rdata))
1872 SAMR_R_LOOKUP_NAMES r_o;
1875 samr_io_r_lookup_names("", &r_o, &rdata, 0);
1876 p = rdata.offset != 0;
1878 if (p && r_o.status != 0)
1880 /* report error code */
1881 DEBUG(4,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status)));
1887 if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 &&
1888 r_o.num_types1 == r_o.num_rids1)
1893 *num_rids = r_o.num_rids1;
1895 for (i = 0; i < r_o.num_rids1; i++)
1897 rid[i] = r_o.rid[i];
1899 for (i = 0; i < r_o.num_types1; i++)
1901 type[i] = r_o.type[i];
1904 else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0)
1916 prs_mem_free(&data );
1917 prs_mem_free(&rdata );
1922 /****************************************************************************
1923 do a SAMR Query Lookup RIDS
1924 ****************************************************************************/
1925 BOOL samr_query_lookup_rids(struct cli_state *cli, uint16 fnum,
1926 POLICY_HND *pol, uint32 flags,
1927 uint32 num_rids, uint32 *rids,
1935 SAMR_Q_LOOKUP_RIDS q_o;
1936 BOOL valid_query = False;
1938 if (pol == NULL || flags == 0 || num_rids == 0 || rids == NULL ||
1939 num_names == NULL || names == NULL || type == NULL ) return False;
1941 /* create and send a MSRPC command with api SAMR_LOOKUP_RIDS */
1943 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1944 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1946 DEBUG(4,("SAMR Query Lookup RIDs.\n"));
1948 /* store the parameters */
1949 make_samr_q_lookup_rids(&q_o, pol, flags, num_rids, rids);
1951 /* turn parameters into data stream */
1952 samr_io_q_lookup_rids("", &q_o, &data, 0);
1954 /* send the data on \PIPE\ */
1955 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_RIDS, &data, &rdata))
1957 SAMR_R_LOOKUP_RIDS r_o;
1961 samr_io_r_lookup_rids("", &r_o, &rdata, 0);
1962 p = rdata.offset != 0;
1964 if (p && r_o.status != 0)
1966 /* report error code */
1967 DEBUG(4,("SAMR_R_LOOKUP_RIDS: %s\n", get_nt_error_msg(r_o.status)));
1973 if (r_o.ptr_names != 0 && r_o.ptr_types != 0 &&
1974 r_o.num_types1 == r_o.num_names1)
1979 *num_names = r_o.num_names1;
1981 (*names) = malloc((*num_names) * sizeof(**names));
1982 for (i = 0; (*names) != NULL && i < r_o.num_names1; i++)
1985 unistr2_to_ascii(tmp, &r_o.uni_name[i], sizeof(tmp)-1);
1986 (*names)[i] = strdup(tmp);
1989 (*type) = malloc((*num_names) * sizeof(**type));
1990 for (i = 0; (*type) != NULL && i < r_o.num_types1; i++)
1992 (*type)[i] = r_o.type[i];
1995 else if (r_o.ptr_names == 0 && r_o.ptr_types == 0)
2008 samr_free_r_lookup_rids(&r_o);
2011 prs_mem_free(&data );
2012 prs_mem_free(&rdata );
2017 /****************************************************************************
2018 do a SAMR Query Alias Members
2019 ****************************************************************************/
2020 BOOL samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
2021 POLICY_HND *alias_pol,
2022 uint32 *num_mem, DOM_SID2 *sid)
2027 SAMR_Q_QUERY_ALIASMEM q_o;
2028 BOOL valid_query = False;
2030 DEBUG(4,("SAMR Query Alias Members.\n"));
2032 if (alias_pol == NULL || sid == NULL || num_mem == NULL) return False;
2034 /* create and send a MSRPC command with api SAMR_QUERY_ALIASMEM */
2036 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2037 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2039 /* store the parameters */
2040 make_samr_q_query_aliasmem(&q_o, alias_pol);
2042 /* turn parameters into data stream */
2043 samr_io_q_query_aliasmem("", &q_o, &data, 0);
2045 /* send the data on \PIPE\ */
2046 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_ALIASMEM, &data, &rdata))
2048 SAMR_R_QUERY_ALIASMEM r_o;
2054 samr_io_r_query_aliasmem("", &r_o, &rdata, 0);
2055 p = rdata.offset != 0;
2057 if (p && r_o.status != 0)
2059 /* report error code */
2060 DEBUG(4,("SAMR_R_QUERY_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
2064 if (p && r_o.ptr != 0)
2067 *num_mem = r_o.num_sids;
2072 prs_mem_free(&data );
2073 prs_mem_free(&rdata );
2078 /****************************************************************************
2079 do a SAMR Query User Aliases
2080 ****************************************************************************/
2081 BOOL samr_query_useraliases(struct cli_state *cli, uint16 fnum,
2082 POLICY_HND *pol, uint32 *ptr_sid, DOM_SID2 *sid,
2083 uint32 *num_aliases, uint32 **rid)
2088 SAMR_Q_QUERY_USERALIASES q_o;
2089 BOOL valid_query = False;
2092 DEBUG(4,("SAMR Query User Aliases.\n"));
2094 if (pol == NULL || sid == NULL || rid == NULL || num_aliases == 0) return False;
2096 /* create and send a MSRPC command with api SAMR_QUERY_USERALIASES */
2098 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2099 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2101 /* store the parameters */
2102 make_samr_q_query_useraliases(&q_o, pol, ptr_sid, sid);
2104 /* turn parameters into data stream */
2105 samr_io_q_query_useraliases("", &q_o, &data, 0);
2107 /* send the data on \PIPE\ */
2108 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERALIASES, &data, &rdata))
2110 SAMR_R_QUERY_USERALIASES r_o;
2115 samr_io_r_query_useraliases("", &r_o, &rdata, 0);
2117 p = rdata.offset != 0;
2119 if (p && r_o.status != 0)
2121 /* report error code */
2122 DEBUG(4,("SAMR_R_QUERY_USERALIASES: %s\n", get_nt_error_msg(r_o.status)));
2126 if (p && r_o.ptr != 0)
2129 *num_aliases = r_o.num_entries;
2134 prs_mem_free(&data );
2135 prs_mem_free(&rdata );
2140 /****************************************************************************
2141 do a SAMR Query Group Members
2142 ****************************************************************************/
2143 BOOL samr_query_groupmem(struct cli_state *cli, uint16 fnum,
2144 POLICY_HND *group_pol,
2145 uint32 *num_mem, uint32 **rid, uint32 **attr)
2150 SAMR_Q_QUERY_GROUPMEM q_o;
2151 BOOL valid_query = False;
2153 DEBUG(4,("SAMR Query Group Members.\n"));
2155 if (group_pol == NULL || rid == NULL || attr == NULL || num_mem == NULL) return False;
2157 /* create and send a MSRPC command with api SAMR_QUERY_GROUPMEM */
2159 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2160 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2162 /* store the parameters */
2163 make_samr_q_query_groupmem(&q_o, group_pol);
2165 /* turn parameters into data stream */
2166 samr_io_q_query_groupmem("", &q_o, &data, 0);
2168 /* send the data on \PIPE\ */
2169 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPMEM, &data, &rdata))
2171 SAMR_R_QUERY_GROUPMEM r_o;
2177 samr_io_r_query_groupmem("", &r_o, &rdata, 0);
2180 p = rdata.offset != 0;
2182 if (p && r_o.status != 0)
2184 /* report error code */
2185 DEBUG(4,("SAMR_R_QUERY_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
2189 if (p && r_o.ptr != 0 &&
2190 r_o.ptr_rids != 0 && r_o.ptr_attrs != 0 &&
2191 r_o.num_rids == r_o.num_attrs)
2194 *num_mem = r_o.num_rids;
2199 prs_mem_free(&data );
2200 prs_mem_free(&rdata );
2205 /****************************************************************************
2206 do a SAMR Query User Groups
2207 ****************************************************************************/
2208 BOOL samr_query_usergroups(struct cli_state *cli, uint16 fnum,
2209 POLICY_HND *pol, uint32 *num_groups,
2215 SAMR_Q_QUERY_USERGROUPS q_o;
2216 BOOL valid_query = False;
2218 DEBUG(4,("SAMR Query User Groups.\n"));
2220 if (pol == NULL || gid == NULL || num_groups == 0) return False;
2222 /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
2224 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2225 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2227 /* store the parameters */
2228 make_samr_q_query_usergroups(&q_o, pol);
2230 /* turn parameters into data stream */
2231 samr_io_q_query_usergroups("", &q_o, &data, 0);
2233 /* send the data on \PIPE\ */
2234 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERGROUPS, &data, &rdata))
2236 SAMR_R_QUERY_USERGROUPS r_o;
2242 samr_io_r_query_usergroups("", &r_o, &rdata, 0);
2244 p = rdata.offset != 0;
2246 if (p && r_o.status != 0)
2248 /* report error code */
2249 DEBUG(4,("SAMR_R_QUERY_USERGROUPS: %s\n", get_nt_error_msg(r_o.status)));
2253 if (p && r_o.ptr_0 != 0)
2256 *num_groups = r_o.num_entries;
2261 prs_mem_free(&data );
2262 prs_mem_free(&rdata );
2267 /****************************************************************************
2268 do a SAMR Query Group Info
2269 ****************************************************************************/
2270 BOOL samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
2272 uint16 switch_value, GROUP_INFO_CTR* ctr)
2277 SAMR_Q_QUERY_GROUPINFO q_o;
2278 BOOL valid_query = False;
2280 DEBUG(4,("SAMR Query Group Info. level: %d\n", switch_value));
2282 if (pol == NULL || ctr == NULL || switch_value == 0) return False;
2284 /* create and send a MSRPC command with api SAMR_QUERY_GROUPINFO */
2286 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2287 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2289 /* store the parameters */
2290 make_samr_q_query_groupinfo(&q_o, pol, switch_value);
2292 /* turn parameters into data stream */
2293 samr_io_q_query_groupinfo("", &q_o, &data, 0);
2295 /* send the data on \PIPE\ */
2296 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPINFO, &data, &rdata))
2298 SAMR_R_QUERY_GROUPINFO r_o;
2304 samr_io_r_query_groupinfo("", &r_o, &rdata, 0);
2305 p = rdata.offset != 0;
2307 if (p && r_o.status != 0)
2309 /* report error code */
2310 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
2314 if (p && r_o.ctr->switch_value1 != switch_value)
2316 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: received incorrect level %d\n",
2317 r_o.ctr->switch_value1));
2320 if (p && r_o.ptr != 0)
2326 prs_mem_free(&data );
2327 prs_mem_free(&rdata );
2332 /****************************************************************************
2333 do a SAMR Query User Info
2334 ****************************************************************************/
2335 BOOL samr_query_userinfo(struct cli_state *cli, uint16 fnum,
2336 POLICY_HND *pol, uint16 switch_value, void* usr)
2341 SAMR_Q_QUERY_USERINFO q_o;
2342 BOOL valid_query = False;
2344 DEBUG(4,("SAMR Query User Info. level: %d\n", switch_value));
2346 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2348 /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
2350 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2351 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2353 /* store the parameters */
2354 make_samr_q_query_userinfo(&q_o, pol, switch_value);
2356 /* turn parameters into data stream */
2357 samr_io_q_query_userinfo("", &q_o, &data, 0);
2359 /* send the data on \PIPE\ */
2360 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERINFO, &data, &rdata))
2362 SAMR_R_QUERY_USERINFO r_o;
2368 samr_io_r_query_userinfo("", &r_o, &rdata, 0);
2369 p = rdata.offset != 0;
2371 if (p && r_o.status != 0)
2373 /* report error code */
2374 DEBUG(4,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2378 if (p && r_o.switch_value != switch_value)
2380 DEBUG(4,("SAMR_R_QUERY_USERINFO: received incorrect level %d\n",
2384 if (p && r_o.ptr != 0)
2390 prs_mem_free(&data );
2391 prs_mem_free(&rdata );
2396 /****************************************************************************
2398 ****************************************************************************/
2399 BOOL samr_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
2404 SAMR_Q_CLOSE_HND q_c;
2405 BOOL valid_close = False;
2407 DEBUG(4,("SAMR Close\n"));
2409 if (hnd == NULL) return False;
2411 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2412 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2414 /* create and send a MSRPC command with api SAMR_CLOSE_HND */
2416 /* store the parameters */
2417 make_samr_q_close_hnd(&q_c, hnd);
2419 /* turn parameters into data stream */
2420 samr_io_q_close_hnd("", &q_c, &data, 0);
2422 /* send the data on \PIPE\ */
2423 if (rpc_api_pipe_req(cli, fnum, SAMR_CLOSE_HND, &data, &rdata))
2425 SAMR_R_CLOSE_HND r_c;
2428 samr_io_r_close_hnd("", &r_c, &rdata, 0);
2429 p = rdata.offset != 0;
2431 if (p && r_c.status != 0)
2433 /* report error code */
2434 DEBUG(4,("SAMR_CLOSE_HND: %s\n", get_nt_error_msg(r_c.status)));
2440 /* check that the returned policy handle is all zeros */
2444 for (i = 0; i < sizeof(r_c.pol.data); i++)
2446 if (r_c.pol.data[i] != 0)
2448 valid_close = False;
2454 DEBUG(4,("SAMR_CLOSE_HND: non-zero handle returned\n"));
2459 prs_mem_free(&data );
2460 prs_mem_free(&rdata );
2465 /****************************************************************************
2466 do a SAMR query display info
2467 ****************************************************************************/
2468 BOOL samr_query_dispinfo(struct cli_state *cli, uint16 fnum,
2469 POLICY_HND *pol_open_domain, uint16 level,
2470 uint32 *num_entries,
2471 SAM_DISPINFO_CTR *ctr)
2476 SAMR_Q_QUERY_DISPINFO q_o;
2477 BOOL valid_query = False;
2479 DEBUG(4,("SAMR Query Display Info. level: %d\n", level));
2481 if (pol_open_domain == NULL || num_entries == NULL || ctr == NULL ||
2487 /* create and send a MSRPC command with api SAMR_QUERY_DISPINFO */
2489 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2490 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2492 /* store the parameters */
2493 make_samr_q_query_dispinfo(&q_o, pol_open_domain, level, 0, 0xffffffff);
2495 /* turn parameters into data stream */
2496 samr_io_q_query_dispinfo("", &q_o, &data, 0);
2498 /* send the data on \PIPE\ */
2499 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_DISPINFO, &data, &rdata))
2501 SAMR_R_QUERY_DISPINFO r_o;
2507 samr_io_r_query_dispinfo("", &r_o, &rdata, 0);
2508 p = rdata.offset != 0;
2510 if (p && r_o.status != 0)
2512 /* report error code */
2513 DEBUG(4,("SAMR_R_QUERY_DISPINFO: %s\n", get_nt_error_msg(r_o.status)));
2517 if (p && r_o.switch_level != level)
2519 DEBUG(4,("SAMR_R_QUERY_DISPINFO: received incorrect level %d\n",
2523 if (p && r_o.ptr_entries != 0)
2529 prs_mem_free(&data );
2530 prs_mem_free(&rdata );