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(0,("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_UNKNOWN_38, &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(0,("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)
498 SAMR_Q_QUERY_DOMAIN_INFO q_e;
499 BOOL valid_un8 = False;
501 DEBUG(4,("SAMR Unknown 8 switch:%d\n", switch_value));
503 if (domain_pol == NULL) return False;
505 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
507 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
508 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
510 /* store the parameters */
511 make_samr_q_query_dom_info(&q_e, domain_pol, switch_value);
513 /* turn parameters into data stream */
514 samr_io_q_query_dom_info("", &q_e, &data, 0);
516 /* send the data on \PIPE\ */
517 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_DOMAIN_INFO, &data, &rdata))
519 SAMR_R_QUERY_DOMAIN_INFO r_e;
522 samr_io_r_query_dom_info("", &r_e, &rdata, 0);
524 p = rdata.offset != 0;
525 if (p && r_e.status != 0)
527 /* report error code */
528 DEBUG(0,("SAMR_R_QUERY_DOMAIN_INFO: %s\n", get_nt_error_msg(r_e.status)));
538 prs_mem_free(&data );
539 prs_mem_free(&rdata );
544 /****************************************************************************
545 do a SAMR enumerate groups
546 ****************************************************************************/
547 BOOL samr_enum_dom_groups(struct cli_state *cli, uint16 fnum,
548 POLICY_HND *pol, uint32 size,
549 struct acct_info **sam,
555 SAMR_Q_ENUM_DOM_GROUPS q_e;
556 BOOL valid_pol = False;
558 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
560 if (pol == NULL || num_sam_groups == NULL) return False;
562 /* create and send a MSRPC command with api SAMR_ENUM_DOM_GROUPS */
564 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
565 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
567 /* store the parameters */
568 make_samr_q_enum_dom_groups(&q_e, pol, size);
570 /* turn parameters into data stream */
571 samr_io_q_enum_dom_groups("", &q_e, &data, 0);
573 /* send the data on \PIPE\ */
574 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_GROUPS, &data, &rdata))
576 SAMR_R_ENUM_DOM_GROUPS r_e;
579 samr_io_r_enum_dom_groups("", &r_e, &rdata, 0);
581 p = rdata.offset != 0;
582 if (p && r_e.status != 0)
584 /* report error code */
585 DEBUG(0,("SAMR_R_ENUM_DOM_GROUPS: %s\n", get_nt_error_msg(r_e.status)));
594 *num_sam_groups = r_e.num_entries2;
595 if (*num_sam_groups > MAX_SAM_ENTRIES)
597 *num_sam_groups = MAX_SAM_ENTRIES;
598 DEBUG(2,("samr_enum_dom_groups: sam group entries limited to %d\n",
602 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_groups));
609 for (i = 0; i < *num_sam_groups; i++)
611 (*sam)[i].rid = r_e.sam[i].rid;
612 (*sam)[i].acct_name[0] = 0;
613 (*sam)[i].acct_desc[0] = 0;
614 if (r_e.sam[i].hdr_name.buffer)
616 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
619 DEBUG(5,("samr_enum_dom_groups: idx: %4d rid: %8x acct: %s\n",
620 i, (*sam)[i].rid, (*sam)[i].acct_name));
626 prs_mem_free(&data );
627 prs_mem_free(&rdata );
632 /****************************************************************************
633 do a SAMR enumerate aliases
634 ****************************************************************************/
635 BOOL samr_enum_dom_aliases(struct cli_state *cli, uint16 fnum,
636 POLICY_HND *pol, uint32 size,
637 struct acct_info **sam,
638 int *num_sam_aliases)
643 SAMR_Q_ENUM_DOM_ALIASES q_e;
644 BOOL valid_pol = False;
646 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
648 if (pol == NULL || num_sam_aliases == NULL) return False;
650 /* create and send a MSRPC command with api SAMR_ENUM_DOM_ALIASES */
652 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
653 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
655 /* store the parameters */
656 make_samr_q_enum_dom_aliases(&q_e, pol, size);
658 /* turn parameters into data stream */
659 samr_io_q_enum_dom_aliases("", &q_e, &data, 0);
661 /* send the data on \PIPE\ */
662 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_ALIASES, &data, &rdata))
664 SAMR_R_ENUM_DOM_ALIASES r_e;
667 samr_io_r_enum_dom_aliases("", &r_e, &rdata, 0);
669 p = rdata.offset != 0;
670 if (p && r_e.status != 0)
672 /* report error code */
673 DEBUG(0,("SAMR_R_ENUM_DOM_ALIASES: %s\n", get_nt_error_msg(r_e.status)));
682 *num_sam_aliases = r_e.num_entries2;
683 if (*num_sam_aliases > MAX_SAM_ENTRIES)
685 *num_sam_aliases = MAX_SAM_ENTRIES;
686 DEBUG(2,("samr_enum_dom_aliases: sam user entries limited to %d\n",
690 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_aliases));
694 *num_sam_aliases = 0;
697 for (i = 0; i < *num_sam_aliases; i++)
699 (*sam)[i].rid = r_e.sam[i].rid;
700 (*sam)[i].acct_name[0] = 0;
701 (*sam)[i].acct_desc[0] = 0;
702 if (r_e.sam[i].hdr_name.buffer)
704 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
707 DEBUG(5,("samr_enum_dom_aliases: idx: %4d rid: %8x acct: %s\n",
708 i, (*sam)[i].rid, (*sam)[i].acct_name));
714 prs_mem_free(&data );
715 prs_mem_free(&rdata );
720 /****************************************************************************
721 do a SAMR enumerate users
722 ****************************************************************************/
723 BOOL samr_enum_dom_users(struct cli_state *cli, uint16 fnum,
724 POLICY_HND *pol, uint32 start_idx,
725 uint16 acb_mask, uint16 unk_1, uint32 size,
726 struct acct_info **sam,
732 SAMR_Q_ENUM_DOM_USERS q_e;
733 BOOL valid_pol = False;
735 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
737 if (pol == NULL || num_sam_users == NULL) return False;
739 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
741 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
742 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
744 /* store the parameters */
745 make_samr_q_enum_dom_users(&q_e, pol, start_idx, acb_mask, unk_1, size);
747 /* turn parameters into data stream */
748 samr_io_q_enum_dom_users("", &q_e, &data, 0);
750 /* send the data on \PIPE\ */
751 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_USERS, &data, &rdata))
753 SAMR_R_ENUM_DOM_USERS r_e;
756 samr_io_r_enum_dom_users("", &r_e, &rdata, 0);
758 p = rdata.offset != 0;
759 if (p && r_e.status != 0)
761 /* report error code */
762 DEBUG(0,("SAMR_R_ENUM_DOM_USERS: %s\n", get_nt_error_msg(r_e.status)));
771 *num_sam_users = r_e.num_entries2;
772 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_users));
779 for (i = 0; i < *num_sam_users; i++)
781 (*sam)[i].rid = r_e.sam[i].rid;
782 (*sam)[i].acct_name[0] = 0;
783 (*sam)[i].acct_desc[0] = 0;
784 if (r_e.sam[i].hdr_name.buffer)
786 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_acct_name[name_idx], sizeof((*sam)[i].acct_name)-1);
789 DEBUG(5,("samr_enum_dom_users: idx: %4d rid: %8x acct: %s\n",
790 i, (*sam)[i].rid, (*sam)[i].acct_name));
799 if (r_e.uni_acct_name != NULL)
801 free(r_e.uni_acct_name);
805 prs_mem_free(&data );
806 prs_mem_free(&rdata );
811 /****************************************************************************
813 ****************************************************************************/
814 BOOL samr_connect(struct cli_state *cli, uint16 fnum,
815 char *srv_name, uint32 unknown_0,
816 POLICY_HND *connect_pol)
822 BOOL valid_pol = False;
824 DEBUG(4,("SAMR Open Policy server:%s undoc value:%x\n",
825 srv_name, unknown_0));
827 if (srv_name == NULL || connect_pol == NULL) return False;
829 /* create and send a MSRPC command with api SAMR_CONNECT */
831 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
832 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
834 /* store the parameters */
835 make_samr_q_connect(&q_o, srv_name, unknown_0);
837 /* turn parameters into data stream */
838 samr_io_q_connect("", &q_o, &data, 0);
840 /* send the data on \PIPE\ */
841 if (rpc_api_pipe_req(cli, fnum, SAMR_CONNECT, &data, &rdata))
846 samr_io_r_connect("", &r_o, &rdata, 0);
847 p = rdata.offset != 0;
849 if (p && r_o.status != 0)
851 /* report error code */
852 DEBUG(0,("SAMR_R_CONNECT: %s\n", get_nt_error_msg(r_o.status)));
858 memcpy(connect_pol, &r_o.connect_pol, sizeof(r_o.connect_pol));
863 prs_mem_free(&data );
864 prs_mem_free(&rdata );
869 /****************************************************************************
871 ****************************************************************************/
872 BOOL samr_open_user(struct cli_state *cli, uint16 fnum,
873 POLICY_HND *pol, uint32 unk_0, uint32 rid,
874 POLICY_HND *user_pol)
879 SAMR_Q_OPEN_USER q_o;
880 BOOL valid_pol = False;
882 DEBUG(4,("SAMR Open User. unk_0: %08x RID:%x\n",
885 if (pol == NULL || user_pol == NULL) return False;
887 /* create and send a MSRPC command with api SAMR_OPEN_USER */
889 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
890 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
892 /* store the parameters */
893 make_samr_q_open_user(&q_o, pol, unk_0, rid);
895 /* turn parameters into data stream */
896 samr_io_q_open_user("", &q_o, &data, 0);
898 /* send the data on \PIPE\ */
899 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_USER, &data, &rdata))
901 SAMR_R_OPEN_USER r_o;
904 samr_io_r_open_user("", &r_o, &rdata, 0);
905 p = rdata.offset != 0;
907 if (p && r_o.status != 0)
909 /* report error code */
910 DEBUG(0,("SAMR_R_OPEN_USER: %s\n", get_nt_error_msg(r_o.status)));
916 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
921 prs_mem_free(&data );
922 prs_mem_free(&rdata );
927 /****************************************************************************
929 ****************************************************************************/
930 BOOL samr_open_alias(struct cli_state *cli, uint16 fnum,
931 POLICY_HND *domain_pol,
932 uint32 flags, uint32 rid,
933 POLICY_HND *alias_pol)
938 SAMR_Q_OPEN_ALIAS q_o;
939 BOOL valid_pol = False;
941 DEBUG(4,("SAMR Open Alias. RID:%x\n", rid));
943 if (alias_pol == NULL || domain_pol == NULL) return False;
945 /* create and send a MSRPC command with api SAMR_OPEN_ALIAS */
947 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
948 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
950 /* store the parameters */
951 make_samr_q_open_alias(&q_o, domain_pol, flags, rid);
953 /* turn parameters into data stream */
954 samr_io_q_open_alias("", &q_o, &data, 0);
956 /* send the data on \PIPE\ */
957 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_ALIAS, &data, &rdata))
959 SAMR_R_OPEN_ALIAS r_o;
962 samr_io_r_open_alias("", &r_o, &rdata, 0);
963 p = rdata.offset != 0;
965 if (p && r_o.status != 0)
967 /* report error code */
968 DEBUG(0,("SAMR_R_OPEN_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
974 memcpy(alias_pol, &r_o.pol, sizeof(r_o.pol));
979 prs_mem_free(&data );
980 prs_mem_free(&rdata );
985 /****************************************************************************
986 do a SAMR Delete Alias Member
987 ****************************************************************************/
988 BOOL samr_del_aliasmem(struct cli_state *cli, uint16 fnum,
989 POLICY_HND *alias_pol, DOM_SID *sid)
994 SAMR_Q_DEL_ALIASMEM q_o;
995 BOOL valid_pol = False;
997 if (alias_pol == NULL || sid == NULL) return False;
999 /* create and send a MSRPC command with api SAMR_DEL_ALIASMEM */
1001 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1002 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1004 DEBUG(4,("SAMR Delete Alias Member.\n"));
1006 /* store the parameters */
1007 make_samr_q_del_aliasmem(&q_o, alias_pol, sid);
1009 /* turn parameters into data stream */
1010 samr_io_q_del_aliasmem("", &q_o, &data, 0);
1012 /* send the data on \PIPE\ */
1013 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_ALIASMEM, &data, &rdata))
1015 SAMR_R_DEL_ALIASMEM r_o;
1018 samr_io_r_del_aliasmem("", &r_o, &rdata, 0);
1019 p = rdata.offset != 0;
1021 if (p && r_o.status != 0)
1023 /* report error code */
1024 DEBUG(0,("SAMR_R_DEL_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1034 prs_mem_free(&data );
1035 prs_mem_free(&rdata );
1040 /****************************************************************************
1041 do a SAMR Add Alias Member
1042 ****************************************************************************/
1043 BOOL samr_add_aliasmem(struct cli_state *cli, uint16 fnum,
1044 POLICY_HND *alias_pol, DOM_SID *sid)
1049 SAMR_Q_ADD_ALIASMEM q_o;
1050 BOOL valid_pol = False;
1052 if (alias_pol == NULL || sid == NULL) return False;
1054 /* create and send a MSRPC command with api SAMR_ADD_ALIASMEM */
1056 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1057 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1059 DEBUG(4,("SAMR Add Alias Member.\n"));
1061 /* store the parameters */
1062 make_samr_q_add_aliasmem(&q_o, alias_pol, sid);
1064 /* turn parameters into data stream */
1065 samr_io_q_add_aliasmem("", &q_o, &data, 0);
1067 /* send the data on \PIPE\ */
1068 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_ALIASMEM, &data, &rdata))
1070 SAMR_R_ADD_ALIASMEM r_o;
1073 samr_io_r_add_aliasmem("", &r_o, &rdata, 0);
1074 p = rdata.offset != 0;
1076 if (p && r_o.status != 0)
1078 /* report error code */
1079 DEBUG(0,("SAMR_R_ADD_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1089 prs_mem_free(&data );
1090 prs_mem_free(&rdata );
1095 /****************************************************************************
1096 do a SAMR Delete Domain Alias
1097 ****************************************************************************/
1098 BOOL samr_delete_dom_alias(struct cli_state *cli, uint16 fnum,
1099 POLICY_HND *alias_pol)
1104 SAMR_Q_DELETE_DOM_ALIAS q_o;
1105 BOOL valid_pol = False;
1107 if (alias_pol == NULL) return False;
1109 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_ALIAS */
1111 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1112 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1114 DEBUG(4,("SAMR Delete Domain Alias.\n"));
1116 /* store the parameters */
1117 make_samr_q_delete_dom_alias(&q_o, alias_pol);
1119 /* turn parameters into data stream */
1120 samr_io_q_delete_dom_alias("", &q_o, &data, 0);
1122 /* send the data on \PIPE\ */
1123 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_ALIAS, &data, &rdata))
1125 SAMR_R_DELETE_DOM_ALIAS r_o;
1128 samr_io_r_delete_dom_alias("", &r_o, &rdata, 0);
1129 p = rdata.offset != 0;
1131 if (p && r_o.status != 0)
1133 /* report error code */
1134 DEBUG(0,("SAMR_R_DELETE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1144 prs_mem_free(&data );
1145 prs_mem_free(&rdata );
1150 /****************************************************************************
1151 do a SAMR Create Domain User
1152 ****************************************************************************/
1153 BOOL samr_create_dom_user(struct cli_state *cli, uint16 fnum,
1154 POLICY_HND *domain_pol, const char *acct_name,
1155 uint32 unk_0, uint32 unk_1,
1156 POLICY_HND *user_pol, uint32 *rid)
1161 SAMR_Q_CREATE_USER q_o;
1162 BOOL valid_pol = False;
1164 if (user_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1166 /* create and send a MSRPC command with api SAMR_CREATE_USER */
1168 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1169 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1171 DEBUG(4,("SAMR Create Domain User. Name:%s\n", acct_name));
1173 /* store the parameters */
1174 make_samr_q_create_user(&q_o, domain_pol, acct_name, unk_0, unk_1);
1176 /* turn parameters into data stream */
1177 samr_io_q_create_user("", &q_o, &data, 0);
1179 /* send the data on \PIPE\ */
1180 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_USER, &data, &rdata))
1182 SAMR_R_CREATE_USER r_o;
1185 samr_io_r_create_user("", &r_o, &rdata, 0);
1186 p = rdata.offset != 0;
1188 if (p && r_o.status != 0)
1190 /* report error code */
1191 DEBUG(0,("SAMR_R_CREATE_USER: %s\n", get_nt_error_msg(r_o.status)));
1197 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
1198 *rid = r_o.user_rid;
1203 prs_mem_free(&data );
1204 prs_mem_free(&rdata );
1209 /****************************************************************************
1210 do a SAMR Create Domain Alias
1211 ****************************************************************************/
1212 BOOL samr_create_dom_alias(struct cli_state *cli, uint16 fnum,
1213 POLICY_HND *domain_pol, const char *acct_name,
1214 POLICY_HND *alias_pol, uint32 *rid)
1219 SAMR_Q_CREATE_DOM_ALIAS q_o;
1220 BOOL valid_pol = False;
1222 if (alias_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1224 /* create and send a MSRPC command with api SAMR_CREATE_DOM_ALIAS */
1226 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1227 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1229 DEBUG(4,("SAMR Create Domain Alias. Name:%s\n", acct_name));
1231 /* store the parameters */
1232 make_samr_q_create_dom_alias(&q_o, domain_pol, acct_name);
1234 /* turn parameters into data stream */
1235 samr_io_q_create_dom_alias("", &q_o, &data, 0);
1237 /* send the data on \PIPE\ */
1238 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_ALIAS, &data, &rdata))
1240 SAMR_R_CREATE_DOM_ALIAS r_o;
1243 samr_io_r_create_dom_alias("", &r_o, &rdata, 0);
1244 p = rdata.offset != 0;
1246 if (p && r_o.status != 0)
1248 /* report error code */
1249 DEBUG(0,("SAMR_R_CREATE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1255 memcpy(alias_pol, &r_o.alias_pol, sizeof(r_o.alias_pol));
1261 prs_mem_free(&data );
1262 prs_mem_free(&rdata );
1267 /****************************************************************************
1268 do a SAMR Set Alias Info
1269 ****************************************************************************/
1270 BOOL samr_set_aliasinfo(struct cli_state *cli, uint16 fnum,
1271 POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1276 SAMR_Q_SET_ALIASINFO q_o;
1277 BOOL valid_pol = False;
1279 if (alias_pol == NULL || ctr == NULL) return False;
1281 /* create and send a MSRPC command with api SAMR_SET_ALIASINFO */
1283 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1284 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1286 DEBUG(4,("SAMR Set Alias Info\n"));
1288 /* store the parameters */
1289 make_samr_q_set_aliasinfo(&q_o, alias_pol, ctr);
1291 /* turn parameters into data stream */
1292 samr_io_q_set_aliasinfo("", &q_o, &data, 0);
1294 /* send the data on \PIPE\ */
1295 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_ALIASINFO, &data, &rdata))
1297 SAMR_R_SET_ALIASINFO r_o;
1300 samr_io_r_set_aliasinfo("", &r_o, &rdata, 0);
1301 p = rdata.offset != 0;
1303 if (p && r_o.status != 0)
1305 /* report error code */
1306 DEBUG(0,("SAMR_R_SET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1316 prs_mem_free(&data );
1317 prs_mem_free(&rdata );
1322 /****************************************************************************
1323 do a SAMR Open Group
1324 ****************************************************************************/
1325 BOOL samr_open_group(struct cli_state *cli, uint16 fnum,
1326 POLICY_HND *domain_pol,
1327 uint32 flags, uint32 rid,
1328 POLICY_HND *group_pol)
1333 SAMR_Q_OPEN_GROUP q_o;
1334 BOOL valid_pol = False;
1336 DEBUG(4,("SAMR Open Group. RID:%x\n", rid));
1338 if (group_pol == NULL || domain_pol == NULL) return False;
1340 /* create and send a MSRPC command with api SAMR_OPEN_GROUP */
1342 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1343 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1345 /* store the parameters */
1346 make_samr_q_open_group(&q_o, domain_pol, flags, rid);
1348 /* turn parameters into data stream */
1349 samr_io_q_open_group("", &q_o, &data, 0);
1351 /* send the data on \PIPE\ */
1352 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_GROUP, &data, &rdata))
1354 SAMR_R_OPEN_GROUP r_o;
1357 samr_io_r_open_group("", &r_o, &rdata, 0);
1358 p = rdata.offset != 0;
1360 if (p && r_o.status != 0)
1362 /* report error code */
1363 DEBUG(0,("SAMR_R_OPEN_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1369 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1374 prs_mem_free(&data );
1375 prs_mem_free(&rdata );
1380 /****************************************************************************
1381 do a SAMR Delete Group Member
1382 ****************************************************************************/
1383 BOOL samr_del_groupmem(struct cli_state *cli, uint16 fnum,
1384 POLICY_HND *group_pol, uint32 rid)
1389 SAMR_Q_DEL_GROUPMEM q_o;
1390 BOOL valid_pol = False;
1392 if (group_pol == NULL) return False;
1394 /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */
1396 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1397 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1399 DEBUG(4,("SAMR Delete Group Member.\n"));
1401 /* store the parameters */
1402 make_samr_q_del_groupmem(&q_o, group_pol, rid);
1404 /* turn parameters into data stream */
1405 samr_io_q_del_groupmem("", &q_o, &data, 0);
1407 /* send the data on \PIPE\ */
1408 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_GROUPMEM, &data, &rdata))
1410 SAMR_R_DEL_GROUPMEM r_o;
1413 samr_io_r_del_groupmem("", &r_o, &rdata, 0);
1414 p = rdata.offset != 0;
1416 if (p && r_o.status != 0)
1418 /* report error code */
1419 DEBUG(0,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1429 prs_mem_free(&data );
1430 prs_mem_free(&rdata );
1435 /****************************************************************************
1436 do a SAMR Add Group Member
1437 ****************************************************************************/
1438 BOOL samr_add_groupmem(struct cli_state *cli, uint16 fnum,
1439 POLICY_HND *group_pol, uint32 rid)
1444 SAMR_Q_ADD_GROUPMEM q_o;
1445 BOOL valid_pol = False;
1447 if (group_pol == NULL) return False;
1449 /* create and send a MSRPC command with api SAMR_ADD_GROUPMEM */
1451 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1452 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1454 DEBUG(4,("SAMR Add Group Member.\n"));
1456 /* store the parameters */
1457 make_samr_q_add_groupmem(&q_o, group_pol, rid);
1459 /* turn parameters into data stream */
1460 samr_io_q_add_groupmem("", &q_o, &data, 0);
1462 /* send the data on \PIPE\ */
1463 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_GROUPMEM, &data, &rdata))
1465 SAMR_R_ADD_GROUPMEM r_o;
1468 samr_io_r_add_groupmem("", &r_o, &rdata, 0);
1469 p = rdata.offset != 0;
1471 if (p && r_o.status != 0)
1473 /* report error code */
1474 DEBUG(0,("SAMR_R_ADD_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1484 prs_mem_free(&data );
1485 prs_mem_free(&rdata );
1490 /****************************************************************************
1491 do a SAMR Delete Domain Group
1492 ****************************************************************************/
1493 BOOL samr_delete_dom_group(struct cli_state *cli, uint16 fnum, POLICY_HND *group_pol)
1498 SAMR_Q_DELETE_DOM_GROUP q_o;
1499 BOOL valid_pol = False;
1501 if (group_pol == NULL) return False;
1503 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */
1505 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1506 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1508 DEBUG(4,("SAMR Delete Domain Group.\n"));
1510 /* store the parameters */
1511 make_samr_q_delete_dom_group(&q_o, group_pol);
1513 /* turn parameters into data stream */
1514 samr_io_q_delete_dom_group("", &q_o, &data, 0);
1516 /* send the data on \PIPE\ */
1517 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_GROUP, &data, &rdata))
1519 SAMR_R_DELETE_DOM_GROUP r_o;
1522 samr_io_r_delete_dom_group("", &r_o, &rdata, 0);
1523 p = rdata.offset != 0;
1525 if (p && r_o.status != 0)
1527 /* report error code */
1528 DEBUG(0,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1538 prs_mem_free(&data );
1539 prs_mem_free(&rdata );
1544 /****************************************************************************
1545 do a SAMR Create Domain Group
1546 ****************************************************************************/
1547 BOOL samr_create_dom_group(struct cli_state *cli, uint16 fnum,
1548 POLICY_HND *domain_pol, const char *acct_name,
1549 POLICY_HND *group_pol, uint32 *rid)
1554 SAMR_Q_CREATE_DOM_GROUP q_o;
1555 BOOL valid_pol = False;
1557 if (group_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1559 /* create and send a MSRPC command with api SAMR_CREATE_DOM_GROUP */
1561 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1562 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1564 DEBUG(4,("SAMR Create Domain Group. Name:%s\n", acct_name));
1566 /* store the parameters */
1567 make_samr_q_create_dom_group(&q_o, domain_pol, acct_name);
1569 /* turn parameters into data stream */
1570 samr_io_q_create_dom_group("", &q_o, &data, 0);
1572 /* send the data on \PIPE\ */
1573 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_GROUP, &data, &rdata))
1575 SAMR_R_CREATE_DOM_GROUP r_o;
1578 samr_io_r_create_dom_group("", &r_o, &rdata, 0);
1579 p = rdata.offset != 0;
1581 if (p && r_o.status != 0)
1583 /* report error code */
1584 DEBUG(0,("SAMR_R_CREATE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1590 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1596 prs_mem_free(&data );
1597 prs_mem_free(&rdata );
1602 /****************************************************************************
1603 do a SAMR Set Group Info
1604 ****************************************************************************/
1605 BOOL samr_set_groupinfo(struct cli_state *cli, uint16 fnum,
1606 POLICY_HND *group_pol, GROUP_INFO_CTR *ctr)
1611 SAMR_Q_SET_GROUPINFO q_o;
1612 BOOL valid_pol = False;
1614 if (group_pol == NULL || ctr == NULL) return False;
1616 /* create and send a MSRPC command with api SAMR_SET_GROUPINFO */
1618 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1619 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1621 DEBUG(4,("SAMR Set Group Info\n"));
1623 /* store the parameters */
1624 make_samr_q_set_groupinfo(&q_o, group_pol, ctr);
1626 /* turn parameters into data stream */
1627 samr_io_q_set_groupinfo("", &q_o, &data, 0);
1629 /* send the data on \PIPE\ */
1630 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_GROUPINFO, &data, &rdata))
1632 SAMR_R_SET_GROUPINFO r_o;
1635 samr_io_r_set_groupinfo("", &r_o, &rdata, 0);
1636 p = rdata.offset != 0;
1638 if (p && r_o.status != 0)
1640 /* report error code */
1641 DEBUG(0,("SAMR_R_SET_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
1651 prs_mem_free(&data );
1652 prs_mem_free(&rdata );
1657 /****************************************************************************
1658 do a SAMR Open Domain
1659 ****************************************************************************/
1660 BOOL samr_open_domain(struct cli_state *cli, uint16 fnum,
1661 POLICY_HND *connect_pol, uint32 ace_perms,
1663 POLICY_HND *domain_pol)
1669 SAMR_Q_OPEN_DOMAIN q_o;
1670 BOOL valid_pol = False;
1674 sid_to_string(sid_str, sid);
1675 DEBUG(4,("SAMR Open Domain. SID:%s Permissions:%x\n",
1676 sid_str, ace_perms));
1679 if (connect_pol == NULL || sid == NULL || domain_pol == NULL) return False;
1681 /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
1683 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1684 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1686 /* store the parameters */
1687 make_samr_q_open_domain(&q_o, connect_pol, ace_perms, sid);
1689 /* turn parameters into data stream */
1690 samr_io_q_open_domain("", &q_o, &data, 0);
1692 /* send the data on \PIPE\ */
1693 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_DOMAIN, &data, &rdata))
1695 SAMR_R_OPEN_DOMAIN r_o;
1698 samr_io_r_open_domain("", &r_o, &rdata, 0);
1699 p = rdata.offset != 0;
1701 if (p && r_o.status != 0)
1703 /* report error code */
1704 DEBUG(0,("SAMR_R_OPEN_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1710 memcpy(domain_pol, &r_o.domain_pol, sizeof(r_o.domain_pol));
1715 prs_mem_free(&data );
1716 prs_mem_free(&rdata );
1721 /****************************************************************************
1722 do a SAMR Query Lookup Domain
1723 ****************************************************************************/
1724 BOOL samr_query_lookup_domain(struct cli_state *cli, uint16 fnum,
1725 POLICY_HND *pol, const char *dom_name,
1731 SAMR_Q_LOOKUP_DOMAIN q_o;
1732 BOOL valid_query = False;
1734 if (pol == NULL || dom_name == NULL || dom_sid == NULL) return False;
1736 /* create and send a MSRPC command with api SAMR_LOOKUP_DOMAIN */
1738 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1739 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1741 DEBUG(4,("SAMR Query Lookup Domain.\n"));
1743 /* store the parameters */
1744 make_samr_q_lookup_domain(&q_o, pol, dom_name);
1746 /* turn parameters into data stream */
1747 samr_io_q_lookup_domain("", &q_o, &data, 0);
1749 /* send the data on \PIPE\ */
1750 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_DOMAIN, &data, &rdata))
1752 SAMR_R_LOOKUP_DOMAIN r_o;
1755 samr_io_r_lookup_domain("", &r_o, &rdata, 0);
1756 p = rdata.offset != 0;
1758 if (p && r_o.status != 0)
1760 /* report error code */
1761 DEBUG(0,("SAMR_R_LOOKUP_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1765 if (p && r_o.ptr_sid != 0)
1767 sid_copy(dom_sid, &r_o.dom_sid.sid);
1772 prs_mem_free(&data );
1773 prs_mem_free(&rdata );
1778 /****************************************************************************
1779 do a SAMR Query Lookup Names
1780 ****************************************************************************/
1781 BOOL samr_query_lookup_names(struct cli_state *cli, uint16 fnum,
1782 POLICY_HND *pol, uint32 flags,
1783 uint32 num_names, const char **names,
1785 uint32 rid[MAX_LOOKUP_SIDS],
1786 uint32 type[MAX_LOOKUP_SIDS])
1791 SAMR_Q_LOOKUP_NAMES q_o;
1792 BOOL valid_query = False;
1794 if (pol == NULL || flags == 0 || num_names == 0 || names == NULL ||
1795 num_rids == NULL || rid == NULL || type == NULL ) return False;
1797 /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */
1799 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1800 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1802 DEBUG(4,("SAMR Query Lookup NAMES.\n"));
1804 /* store the parameters */
1805 make_samr_q_lookup_names(&q_o, pol, flags, num_names, names);
1807 /* turn parameters into data stream */
1808 samr_io_q_lookup_names("", &q_o, &data, 0);
1810 /* send the data on \PIPE\ */
1811 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_NAMES, &data, &rdata))
1813 SAMR_R_LOOKUP_NAMES r_o;
1816 samr_io_r_lookup_names("", &r_o, &rdata, 0);
1817 p = rdata.offset != 0;
1819 if (p && r_o.status != 0)
1821 /* report error code */
1822 DEBUG(0,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status)));
1828 if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 &&
1829 r_o.num_types1 == r_o.num_rids1)
1834 *num_rids = r_o.num_rids1;
1836 for (i = 0; i < r_o.num_rids1; i++)
1838 rid[i] = r_o.rid[i];
1840 for (i = 0; i < r_o.num_types1; i++)
1842 type[i] = r_o.type[i];
1845 else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0)
1857 prs_mem_free(&data );
1858 prs_mem_free(&rdata );
1863 /****************************************************************************
1864 do a SAMR Query Lookup RIDS
1865 ****************************************************************************/
1866 BOOL samr_query_lookup_rids(struct cli_state *cli, uint16 fnum,
1867 POLICY_HND *pol, uint32 flags,
1868 uint32 num_rids, uint32 *rids,
1870 fstring names[MAX_LOOKUP_SIDS],
1871 uint32 type [MAX_LOOKUP_SIDS])
1876 SAMR_Q_LOOKUP_RIDS q_o;
1877 BOOL valid_query = False;
1879 if (pol == NULL || flags == 0 || num_rids == 0 || rids == NULL ||
1880 num_names == NULL || names == NULL || type == NULL ) return False;
1882 /* create and send a MSRPC command with api SAMR_LOOKUP_RIDS */
1884 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1885 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1887 DEBUG(4,("SAMR Query Lookup RIDs.\n"));
1889 /* store the parameters */
1890 make_samr_q_lookup_rids(&q_o, pol, flags, num_rids, rids);
1892 /* turn parameters into data stream */
1893 samr_io_q_lookup_rids("", &q_o, &data, 0);
1895 /* send the data on \PIPE\ */
1896 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_RIDS, &data, &rdata))
1898 SAMR_R_LOOKUP_RIDS r_o;
1901 samr_io_r_lookup_rids("", &r_o, &rdata, 0);
1902 p = rdata.offset != 0;
1904 if (p && r_o.status != 0)
1906 /* report error code */
1907 DEBUG(0,("SAMR_R_LOOKUP_RIDS: %s\n", get_nt_error_msg(r_o.status)));
1913 if (r_o.ptr_names != 0 && r_o.ptr_types != 0 &&
1914 r_o.num_types1 == r_o.num_names1)
1919 *num_names = r_o.num_names1;
1921 for (i = 0; i < r_o.num_names1; i++)
1923 unistr2_to_ascii(names[i], &r_o.uni_name[i], sizeof(fstring)-1);
1925 for (i = 0; i < r_o.num_types1; i++)
1927 type[i] = r_o.type[i];
1930 else if (r_o.ptr_names == 0 && r_o.ptr_types == 0)
1942 prs_mem_free(&data );
1943 prs_mem_free(&rdata );
1948 /****************************************************************************
1949 do a SAMR Query Alias Members
1950 ****************************************************************************/
1951 BOOL samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
1952 POLICY_HND *alias_pol,
1953 uint32 *num_mem, DOM_SID2 *sid)
1958 SAMR_Q_QUERY_ALIASMEM q_o;
1959 BOOL valid_query = False;
1961 DEBUG(4,("SAMR Query Alias Members.\n"));
1963 if (alias_pol == NULL || sid == NULL || num_mem == NULL) return False;
1965 /* create and send a MSRPC command with api SAMR_QUERY_ALIASMEM */
1967 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1968 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1970 /* store the parameters */
1971 make_samr_q_query_aliasmem(&q_o, alias_pol);
1973 /* turn parameters into data stream */
1974 samr_io_q_query_aliasmem("", &q_o, &data, 0);
1976 /* send the data on \PIPE\ */
1977 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_ALIASMEM, &data, &rdata))
1979 SAMR_R_QUERY_ALIASMEM r_o;
1985 samr_io_r_query_aliasmem("", &r_o, &rdata, 0);
1986 p = rdata.offset != 0;
1988 if (p && r_o.status != 0)
1990 /* report error code */
1991 DEBUG(0,("SAMR_R_QUERY_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1995 if (p && r_o.ptr != 0)
1998 *num_mem = r_o.num_sids;
2003 prs_mem_free(&data );
2004 prs_mem_free(&rdata );
2009 /****************************************************************************
2010 do a SAMR Query User Aliases
2011 ****************************************************************************/
2012 BOOL samr_query_useraliases(struct cli_state *cli, uint16 fnum,
2013 POLICY_HND *pol, DOM_SID *sid,
2014 uint32 *num_aliases, uint32 *rid)
2019 SAMR_Q_QUERY_USERALIASES q_o;
2020 BOOL valid_query = False;
2022 DEBUG(4,("SAMR Query User Aliases.\n"));
2024 if (pol == NULL || sid == NULL || rid == NULL || num_aliases == 0) return False;
2026 /* create and send a MSRPC command with api SAMR_QUERY_USERALIASES */
2028 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2029 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2031 /* store the parameters */
2032 make_samr_q_query_useraliases(&q_o, pol, sid);
2034 /* turn parameters into data stream */
2035 samr_io_q_query_useraliases("", &q_o, &data, 0);
2037 /* send the data on \PIPE\ */
2038 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERALIASES, &data, &rdata))
2040 SAMR_R_QUERY_USERALIASES r_o;
2046 samr_io_r_query_useraliases("", &r_o, &rdata, 0);
2047 p = rdata.offset != 0;
2049 if (p && r_o.status != 0)
2051 /* report error code */
2052 DEBUG(0,("SAMR_R_QUERY_USERALIASES: %s\n", get_nt_error_msg(r_o.status)));
2056 if (p && r_o.ptr != 0)
2059 *num_aliases = r_o.num_entries;
2064 prs_mem_free(&data );
2065 prs_mem_free(&rdata );
2070 /****************************************************************************
2071 do a SAMR Query Group Members
2072 ****************************************************************************/
2073 BOOL samr_query_groupmem(struct cli_state *cli, uint16 fnum,
2074 POLICY_HND *group_pol,
2075 uint32 *num_mem, uint32 *rid, uint32 *attr)
2080 SAMR_Q_QUERY_GROUPMEM q_o;
2081 BOOL valid_query = False;
2083 DEBUG(4,("SAMR Query Group Members.\n"));
2085 if (group_pol == NULL || rid == NULL || attr == NULL || num_mem == NULL) return False;
2087 /* create and send a MSRPC command with api SAMR_QUERY_GROUPMEM */
2089 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2090 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2092 /* store the parameters */
2093 make_samr_q_query_groupmem(&q_o, group_pol);
2095 /* turn parameters into data stream */
2096 samr_io_q_query_groupmem("", &q_o, &data, 0);
2098 /* send the data on \PIPE\ */
2099 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPMEM, &data, &rdata))
2101 SAMR_R_QUERY_GROUPMEM r_o;
2108 samr_io_r_query_groupmem("", &r_o, &rdata, 0);
2109 p = rdata.offset != 0;
2111 if (p && r_o.status != 0)
2113 /* report error code */
2114 DEBUG(0,("SAMR_R_QUERY_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
2118 if (p && r_o.ptr != 0 &&
2119 r_o.ptr_rids != 0 && r_o.ptr_attrs != 0 &&
2120 r_o.num_rids == r_o.num_attrs)
2123 *num_mem = r_o.num_rids;
2128 prs_mem_free(&data );
2129 prs_mem_free(&rdata );
2134 /****************************************************************************
2135 do a SAMR Query User Groups
2136 ****************************************************************************/
2137 BOOL samr_query_usergroups(struct cli_state *cli, uint16 fnum,
2138 POLICY_HND *pol, uint32 *num_groups, DOM_GID *gid)
2143 SAMR_Q_QUERY_USERGROUPS q_o;
2144 BOOL valid_query = False;
2146 DEBUG(4,("SAMR Query User Groups.\n"));
2148 if (pol == NULL || gid == NULL || num_groups == 0) return False;
2150 /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
2152 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2153 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2155 /* store the parameters */
2156 make_samr_q_query_usergroups(&q_o, pol);
2158 /* turn parameters into data stream */
2159 samr_io_q_query_usergroups("", &q_o, &data, 0);
2161 /* send the data on \PIPE\ */
2162 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERGROUPS, &data, &rdata))
2164 SAMR_R_QUERY_USERGROUPS r_o;
2170 samr_io_r_query_usergroups("", &r_o, &rdata, 0);
2171 p = rdata.offset != 0;
2173 if (p && r_o.status != 0)
2175 /* report error code */
2176 DEBUG(0,("SAMR_R_QUERY_USERGROUPS: %s\n", get_nt_error_msg(r_o.status)));
2180 if (p && r_o.ptr_0 != 0)
2183 *num_groups = r_o.num_entries;
2188 prs_mem_free(&data );
2189 prs_mem_free(&rdata );
2194 /****************************************************************************
2195 do a SAMR Query Group Info
2196 ****************************************************************************/
2197 BOOL samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
2199 uint16 switch_value, GROUP_INFO_CTR* ctr)
2204 SAMR_Q_QUERY_GROUPINFO q_o;
2205 BOOL valid_query = False;
2207 DEBUG(4,("SAMR Query Group Info. level: %d\n", switch_value));
2209 if (pol == NULL || ctr == NULL || switch_value == 0) return False;
2211 /* create and send a MSRPC command with api SAMR_QUERY_GROUPINFO */
2213 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2214 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2216 /* store the parameters */
2217 make_samr_q_query_groupinfo(&q_o, pol, switch_value);
2219 /* turn parameters into data stream */
2220 samr_io_q_query_groupinfo("", &q_o, &data, 0);
2222 /* send the data on \PIPE\ */
2223 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPINFO, &data, &rdata))
2225 SAMR_R_QUERY_GROUPINFO r_o;
2231 samr_io_r_query_groupinfo("", &r_o, &rdata, 0);
2232 p = rdata.offset != 0;
2234 if (p && r_o.status != 0)
2236 /* report error code */
2237 DEBUG(0,("SAMR_R_QUERY_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
2241 if (p && r_o.ctr->switch_value1 != switch_value)
2243 DEBUG(0,("SAMR_R_QUERY_GROUPINFO: received incorrect level %d\n",
2244 r_o.ctr->switch_value1));
2247 if (p && r_o.ptr != 0)
2253 prs_mem_free(&data );
2254 prs_mem_free(&rdata );
2259 /****************************************************************************
2260 do a SAMR Query User Info
2261 ****************************************************************************/
2262 BOOL samr_query_userinfo(struct cli_state *cli, uint16 fnum,
2263 POLICY_HND *pol, uint16 switch_value, void* usr)
2268 SAMR_Q_QUERY_USERINFO q_o;
2269 BOOL valid_query = False;
2271 DEBUG(4,("SAMR Query User Info. level: %d\n", switch_value));
2273 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2275 /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
2277 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2278 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2280 /* store the parameters */
2281 make_samr_q_query_userinfo(&q_o, pol, switch_value);
2283 /* turn parameters into data stream */
2284 samr_io_q_query_userinfo("", &q_o, &data, 0);
2286 /* send the data on \PIPE\ */
2287 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERINFO, &data, &rdata))
2289 SAMR_R_QUERY_USERINFO r_o;
2295 samr_io_r_query_userinfo("", &r_o, &rdata, 0);
2296 p = rdata.offset != 0;
2298 if (p && r_o.status != 0)
2300 /* report error code */
2301 DEBUG(0,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2305 if (p && r_o.switch_value != switch_value)
2307 DEBUG(0,("SAMR_R_QUERY_USERINFO: received incorrect level %d\n",
2311 if (p && r_o.ptr != 0)
2317 prs_mem_free(&data );
2318 prs_mem_free(&rdata );
2323 /****************************************************************************
2325 ****************************************************************************/
2326 BOOL samr_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
2331 SAMR_Q_CLOSE_HND q_c;
2332 BOOL valid_close = False;
2334 DEBUG(4,("SAMR Close\n"));
2336 if (hnd == NULL) return False;
2338 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2339 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2341 /* create and send a MSRPC command with api SAMR_CLOSE_HND */
2343 /* store the parameters */
2344 make_samr_q_close_hnd(&q_c, hnd);
2346 /* turn parameters into data stream */
2347 samr_io_q_close_hnd("", &q_c, &data, 0);
2349 /* send the data on \PIPE\ */
2350 if (rpc_api_pipe_req(cli, fnum, SAMR_CLOSE_HND, &data, &rdata))
2352 SAMR_R_CLOSE_HND r_c;
2355 samr_io_r_close_hnd("", &r_c, &rdata, 0);
2356 p = rdata.offset != 0;
2358 if (p && r_c.status != 0)
2360 /* report error code */
2361 DEBUG(0,("SAMR_CLOSE_HND: %s\n", get_nt_error_msg(r_c.status)));
2367 /* check that the returned policy handle is all zeros */
2371 for (i = 0; i < sizeof(r_c.pol.data); i++)
2373 if (r_c.pol.data[i] != 0)
2375 valid_close = False;
2381 DEBUG(0,("SAMR_CLOSE_HND: non-zero handle returned\n"));
2386 prs_mem_free(&data );
2387 prs_mem_free(&rdata );