2 Unix SMB/Netbios implementation.
4 NT Domain Authentication SMB / MSRPC client
5 Copyright (C) Andrew Tridgell 1994-1997
6 Copyright (C) Luke Kenneth Casson Leighton 1996-1997
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32 extern int DEBUGLEVEL;
36 /****************************************************************************
37 do a SAMR create domain user
38 ****************************************************************************/
39 BOOL create_samr_domain_user(struct cli_state *cli, uint16 fnum,
40 POLICY_HND *pol_open_domain,
41 const char *acct_name, uint16 acb_info,
44 POLICY_HND pol_open_user;
47 if (pol_open_domain == NULL || acct_name == NULL) return False;
49 /* send create user */
50 if (!samr_create_dom_user(cli, fnum,
52 acct_name, acb_info, 0xe005000b,
58 DEBUG(5,("create_samr_domain_user: name: %s rid 0x%x\n",
61 return samr_close(cli, fnum, &pol_open_user) && ret;
64 /****************************************************************************
65 do a SAMR create domain alias
66 ****************************************************************************/
67 BOOL create_samr_domain_alias(struct cli_state *cli, uint16 fnum,
68 POLICY_HND *pol_open_domain,
69 const char *acct_name, const char *acct_desc,
72 POLICY_HND pol_open_alias;
76 if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False;
78 /* send create alias */
79 if (!samr_create_dom_alias(cli, fnum,
82 &pol_open_alias, rid))
87 DEBUG(5,("create_samr_domain_alias: name: %s rid 0x%x\n",
90 ctr.switch_value1 = 3;
91 make_samr_alias_info3(&ctr.alias.info3, acct_desc);
93 /* send set alias info */
94 if (!samr_set_aliasinfo(cli, fnum,
98 DEBUG(5,("create_samr_domain_alias: error in samr_set_aliasinfo\n"));
102 return samr_close(cli, fnum,&pol_open_alias) && ret;
105 /****************************************************************************
106 do a SAMR create domain group
107 ****************************************************************************/
108 BOOL create_samr_domain_group(struct cli_state *cli, uint16 fnum,
109 POLICY_HND *pol_open_domain,
110 const char *acct_name, const char *acct_desc,
113 POLICY_HND pol_open_group;
117 if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False;
119 /* send create group*/
120 if (!samr_create_dom_group(cli, fnum,
123 &pol_open_group, rid))
128 DEBUG(5,("create_samr_domain_group: name: %s rid 0x%x\n",
131 ctr.switch_value1 = 4;
132 ctr.switch_value2 = 4;
133 make_samr_group_info4(&ctr.group.info4, acct_desc);
135 /* send user groups query */
136 if (!samr_set_groupinfo(cli, fnum,
140 DEBUG(5,("create_samr_domain_group: error in samr_set_groupinfo\n"));
144 return samr_close(cli, fnum,&pol_open_group) && ret;
147 /****************************************************************************
148 do a SAMR query user groups
149 ****************************************************************************/
150 BOOL get_samr_query_usergroups(struct cli_state *cli, uint16 fnum,
151 POLICY_HND *pol_open_domain, uint32 user_rid,
152 uint32 *num_groups, DOM_GID **gid)
154 POLICY_HND pol_open_user;
157 if (pol_open_domain == NULL || num_groups == NULL || gid == NULL) return False;
159 /* send open domain (on user sid) */
160 if (!samr_open_user(cli, fnum,
168 /* send user groups query */
169 if (!samr_query_usergroups(cli, fnum,
173 DEBUG(5,("samr_query_usergroups: error in query user groups\n"));
177 return samr_close(cli, fnum,&pol_open_user) && ret;
180 /****************************************************************************
181 do a SAMR delete group
182 ****************************************************************************/
183 BOOL delete_samr_dom_group(struct cli_state *cli, uint16 fnum,
184 POLICY_HND *pol_open_domain,
187 POLICY_HND pol_open_group;
189 if (pol_open_domain == NULL) return False;
191 /* send open domain (on group rid) */
192 if (!samr_open_group(cli, fnum,pol_open_domain,
193 0x00000010, group_rid,
199 /* send group delete */
200 if (!samr_delete_dom_group(cli, fnum,&pol_open_group))
203 DEBUG(5,("delete_samr_dom_group: error in delete domain group\n"));
204 samr_close(cli, fnum,&pol_open_group);
212 /****************************************************************************
213 do a SAMR query group members
214 ****************************************************************************/
215 BOOL get_samr_query_groupmem(struct cli_state *cli, uint16 fnum,
216 POLICY_HND *pol_open_domain,
217 uint32 group_rid, uint32 *num_mem,
218 uint32 **rid, uint32 **attr)
220 POLICY_HND pol_open_group;
223 if (pol_open_domain == NULL || num_mem == NULL || rid == NULL || attr == NULL) return False;
225 /* send open domain (on group sid) */
226 if (!samr_open_group(cli, fnum,pol_open_domain,
227 0x00000010, group_rid,
233 /* send group info query */
234 if (!samr_query_groupmem(cli, fnum,&pol_open_group, num_mem, rid, attr))
237 DEBUG(5,("samr_query_group: error in query group members\n"));
241 return samr_close(cli, fnum,&pol_open_group) && ret;
244 /****************************************************************************
245 do a SAMR delete alias
246 ****************************************************************************/
247 BOOL delete_samr_dom_alias(struct cli_state *cli, uint16 fnum,
248 POLICY_HND *pol_open_domain,
251 POLICY_HND pol_open_alias;
253 if (pol_open_domain == NULL) return False;
255 /* send open domain (on alias rid) */
256 if (!samr_open_alias(cli, fnum,pol_open_domain,
257 0x000f001f, alias_rid, &pol_open_alias))
262 /* send alias delete */
263 if (!samr_delete_dom_alias(cli, fnum,&pol_open_alias))
266 DEBUG(5,("delete_samr_dom_alias: error in delete domain alias\n"));
267 samr_close(cli, fnum,&pol_open_alias);
275 /****************************************************************************
276 do a SAMR query alias members
277 ****************************************************************************/
278 BOOL get_samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
279 POLICY_HND *pol_open_domain,
280 uint32 alias_rid, uint32 *num_mem, DOM_SID2 *sid)
282 POLICY_HND pol_open_alias;
285 if (pol_open_domain == NULL || num_mem == NULL || sid == NULL) return False;
287 /* send open domain (on alias sid) */
288 if (!samr_open_alias(cli, fnum, pol_open_domain,
289 0x000f001f, alias_rid,
295 /* send alias info query */
296 if (!samr_query_aliasmem(cli, fnum, &pol_open_alias, num_mem, sid))
299 DEBUG(5,("samr_query_alias: error in query alias members\n"));
303 return samr_close(cli, fnum,&pol_open_alias) && ret;
306 /****************************************************************************
307 do a SAMR query user info
308 ****************************************************************************/
309 BOOL get_samr_query_userinfo(struct cli_state *cli, uint16 fnum,
310 POLICY_HND *pol_open_domain,
312 uint32 user_rid, SAM_USER_INFO_21 *usr)
314 POLICY_HND pol_open_user;
317 if (pol_open_domain == NULL || usr == NULL) return False;
319 bzero(usr, sizeof(*usr));
321 /* send open domain (on user sid) */
322 if (!samr_open_user(cli, fnum,
330 /* send user info query */
331 if (!samr_query_userinfo(cli, fnum,
333 info_level, (void*)usr))
335 DEBUG(5,("samr_query_userinfo: error in query user info, level 0x%x\n",
340 return samr_close(cli, fnum,&pol_open_user) && ret;
343 /****************************************************************************
344 do a SAMR query group info
345 ****************************************************************************/
346 BOOL get_samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
347 POLICY_HND *pol_open_domain,
349 uint32 group_rid, GROUP_INFO_CTR *ctr)
351 POLICY_HND pol_open_group;
354 if (pol_open_domain == NULL || ctr == NULL) return False;
356 bzero(ctr, sizeof(*ctr));
358 /* send open domain (on group sid) */
359 if (!samr_open_group(cli, fnum,
361 0x02000000, group_rid, &pol_open_group))
366 /* send group info query */
367 if (!samr_query_groupinfo(cli, fnum,
371 DEBUG(5,("samr_query_groupinfo: error in query group info, level 0x%x\n",
376 return samr_close(cli, fnum,&pol_open_group) && ret;
379 /****************************************************************************
380 do a SAMR query alias info
381 ****************************************************************************/
382 BOOL get_samr_query_aliasinfo(struct cli_state *cli, uint16 fnum,
383 POLICY_HND *pol_open_domain,
385 uint32 alias_rid, ALIAS_INFO_CTR *ctr)
387 POLICY_HND pol_open_alias;
390 if (pol_open_domain == NULL || ctr == NULL) return False;
392 bzero(ctr, sizeof(*ctr));
394 /* send open domain (on alias sid) */
395 if (!samr_open_alias(cli, fnum,
397 0x02000000, alias_rid, &pol_open_alias))
402 /* send alias info query */
403 if (!samr_query_aliasinfo(cli, fnum,
407 DEBUG(5,("samr_query_aliasinfo: error in query alias info, level 0x%x\n",
412 return samr_close(cli, fnum,&pol_open_alias) && ret;
415 /****************************************************************************
416 do a SAMR change user password command
417 ****************************************************************************/
418 BOOL samr_chgpasswd_user(struct cli_state *cli, uint16 fnum,
419 char *srv_name, char *user_name,
420 char nt_newpass[516], uchar nt_oldhash[16],
421 char lm_newpass[516], uchar lm_oldhash[16])
426 SAMR_Q_CHGPASSWD_USER q_e;
427 BOOL valid_pwc = False;
429 /* create and send a MSRPC command with api SAMR_CHGPASSWD_USER */
431 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
432 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
434 DEBUG(4,("SAMR Change User Password. server:%s username:%s\n",
435 srv_name, user_name));
437 make_samr_q_chgpasswd_user(&q_e, srv_name, user_name,
438 nt_newpass, nt_oldhash,
439 lm_newpass, lm_oldhash);
441 /* turn parameters into data stream */
442 samr_io_q_chgpasswd_user("", &q_e, &data, 0);
444 /* send the data on \PIPE\ */
445 if (rpc_api_pipe_req(cli, fnum, SAMR_CHGPASSWD_USER, &data, &rdata))
447 SAMR_R_CHGPASSWD_USER r_e;
450 samr_io_r_chgpasswd_user("", &r_e, &rdata, 0);
452 p = rdata.offset != 0;
453 if (p && r_e.status != 0)
455 /* report error code */
456 DEBUG(4,("SAMR_R_CHGPASSWD_USER: %s\n", get_nt_error_msg(r_e.status)));
466 prs_mem_free(&data );
467 prs_mem_free(&rdata );
473 /****************************************************************************
474 do a SAMR unknown 0x38 command
475 ****************************************************************************/
476 BOOL samr_unknown_38(struct cli_state *cli, uint16 fnum, char *srv_name)
481 SAMR_Q_UNKNOWN_38 q_e;
482 BOOL valid_un8 = False;
484 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
486 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
487 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
489 DEBUG(4,("SAMR Unknown 38 server:%s\n", srv_name));
491 make_samr_q_unknown_38(&q_e, srv_name);
493 /* turn parameters into data stream */
494 samr_io_q_unknown_38("", &q_e, &data, 0);
496 /* send the data on \PIPE\ */
497 if (rpc_api_pipe_req(cli, fnum, SAMR_GET_DOM_PWINFO, &data, &rdata))
499 SAMR_R_UNKNOWN_38 r_e;
502 samr_io_r_unknown_38("", &r_e, &rdata, 0);
504 p = rdata.offset != 0;
506 if (p && r_e.status != 0)
508 /* report error code */
509 DEBUG(4,("SAMR_R_UNKNOWN_38: %s\n", get_nt_error_msg(r_e.status)));
519 prs_mem_free(&data );
520 prs_mem_free(&rdata );
525 /****************************************************************************
526 do a SAMR unknown 0x8 command
527 ****************************************************************************/
528 BOOL samr_query_dom_info(struct cli_state *cli, uint16 fnum,
529 POLICY_HND *domain_pol, uint16 switch_value,
535 SAMR_Q_QUERY_DOMAIN_INFO q_e;
536 BOOL valid_un8 = False;
538 DEBUG(4,("SAMR Unknown 8 switch:%d\n", switch_value));
540 if (domain_pol == NULL) return False;
542 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
544 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
545 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
547 /* store the parameters */
548 make_samr_q_query_dom_info(&q_e, domain_pol, switch_value);
550 /* turn parameters into data stream */
551 samr_io_q_query_dom_info("", &q_e, &data, 0);
553 /* send the data on \PIPE\ */
554 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_DOMAIN_INFO, &data, &rdata))
556 SAMR_R_QUERY_DOMAIN_INFO r_e;
560 samr_io_r_query_dom_info("", &r_e, &rdata, 0);
562 p = rdata.offset != 0;
563 if (p && r_e.status != 0)
565 /* report error code */
566 DEBUG(4,("SAMR_R_QUERY_DOMAIN_INFO: %s\n", get_nt_error_msg(r_e.status)));
576 prs_mem_free(&data );
577 prs_mem_free(&rdata );
582 /****************************************************************************
583 do a SAMR enumerate groups
584 ****************************************************************************/
585 uint32 samr_enum_dom_groups(struct cli_state *cli, uint16 fnum,
587 uint32 *start_idx, uint32 size,
588 struct acct_info **sam,
589 uint32 *num_sam_groups)
595 SAMR_Q_ENUM_DOM_GROUPS q_e;
597 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
599 if (pol == NULL || num_sam_groups == NULL)
601 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
604 /* create and send a MSRPC command with api SAMR_ENUM_DOM_GROUPS */
606 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
607 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
609 /* store the parameters */
610 make_samr_q_enum_dom_groups(&q_e, pol, *start_idx, size);
612 /* turn parameters into data stream */
613 samr_io_q_enum_dom_groups("", &q_e, &data, 0);
615 /* send the data on \PIPE\ */
616 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_GROUPS, &data, &rdata))
618 SAMR_R_ENUM_DOM_GROUPS r_e;
621 samr_io_r_enum_dom_groups("", &r_e, &rdata, 0);
624 p = rdata.offset != 0;
625 if (p && r_e.status != 0)
627 /* report error code */
628 DEBUG(4,("SAMR_R_ENUM_DOM_GROUPS: %s\n", get_nt_error_msg(r_e.status)));
629 p = (r_e.status == STATUS_MORE_ENTRIES);
634 uint32 i = (*num_sam_groups);
638 (*num_sam_groups) += r_e.num_entries2;
639 (*sam) = (struct acct_info*) Realloc((*sam),
640 sizeof(struct acct_info) * (*num_sam_groups));
644 (*num_sam_groups) = 0;
648 for (j = 0; i < (*num_sam_groups) && j < r_e.num_entries2; j++, i++)
650 (*sam)[i].rid = r_e.sam[j].rid;
651 (*sam)[i].acct_name[0] = 0;
652 (*sam)[i].acct_desc[0] = 0;
653 if (r_e.sam[j].hdr_name.buffer)
655 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
658 DEBUG(5,("samr_enum_dom_groups: idx: %4d rid: %8x acct: %s\n",
659 i, (*sam)[i].rid, (*sam)[i].acct_name));
661 (*start_idx) = r_e.next_idx;
663 else if (status == 0x0)
665 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
670 prs_mem_free(&data );
671 prs_mem_free(&rdata );
676 /****************************************************************************
677 do a SAMR enumerate aliases
678 ****************************************************************************/
679 uint32 samr_enum_dom_aliases(struct cli_state *cli, uint16 fnum,
681 uint32 *start_idx, uint32 size,
682 struct acct_info **sam,
683 uint32 *num_sam_aliases)
689 SAMR_Q_ENUM_DOM_ALIASES q_e;
691 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
693 if (pol == NULL || num_sam_aliases == NULL)
695 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
698 /* create and send a MSRPC command with api SAMR_ENUM_DOM_ALIASES */
700 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
701 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
703 /* store the parameters */
704 make_samr_q_enum_dom_aliases(&q_e, pol, *start_idx, size);
706 /* turn parameters into data stream */
707 samr_io_q_enum_dom_aliases("", &q_e, &data, 0);
709 /* send the data on \PIPE\ */
710 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_ALIASES, &data, &rdata))
712 SAMR_R_ENUM_DOM_ALIASES r_e;
715 samr_io_r_enum_dom_aliases("", &r_e, &rdata, 0);
717 p = rdata.offset != 0;
718 if (p && r_e.status != 0)
720 /* report error code */
721 DEBUG(4,("SAMR_R_ENUM_DOM_ALIASES: %s\n", get_nt_error_msg(r_e.status)));
722 p = (r_e.status == STATUS_MORE_ENTRIES);
727 uint32 i = (*num_sam_aliases);
731 (*num_sam_aliases) += r_e.num_entries2;
732 (*sam) = (struct acct_info*) Realloc((*sam),
733 sizeof(struct acct_info) * (*num_sam_aliases));
737 (*num_sam_aliases) = 0;
741 for (j = 0; i < (*num_sam_aliases) && j < r_e.num_entries2; j++, i++)
743 (*sam)[i].rid = r_e.sam[j].rid;
744 (*sam)[i].acct_name[0] = 0;
745 (*sam)[i].acct_desc[0] = 0;
746 if (r_e.sam[j].hdr_name.buffer)
748 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
751 DEBUG(5,("samr_enum_dom_aliases: idx: %4d rid: %8x acct: %s\n",
752 i, (*sam)[i].rid, (*sam)[i].acct_name));
754 (*start_idx) = r_e.next_idx;
758 prs_mem_free(&data );
759 prs_mem_free(&rdata );
764 /****************************************************************************
765 do a SAMR enumerate users
766 ****************************************************************************/
767 uint32 samr_enum_dom_users(struct cli_state *cli, uint16 fnum,
768 POLICY_HND *pol, uint32 *start_idx,
769 uint16 acb_mask, uint16 unk_1, uint32 size,
770 struct acct_info **sam,
771 uint32 *num_sam_users)
777 SAMR_Q_ENUM_DOM_USERS q_e;
779 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
781 if (pol == NULL || num_sam_users == NULL)
783 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
786 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
788 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
789 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
791 /* store the parameters */
792 make_samr_q_enum_dom_users(&q_e, pol, *start_idx,
793 acb_mask, unk_1, size);
795 /* turn parameters into data stream */
796 samr_io_q_enum_dom_users("", &q_e, &data, 0);
798 /* send the data on \PIPE\ */
799 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_USERS, &data, &rdata))
801 SAMR_R_ENUM_DOM_USERS r_e;
804 samr_io_r_enum_dom_users("", &r_e, &rdata, 0);
807 p = rdata.offset != 0;
809 if (p && r_e.status != 0)
811 /* report error code */
812 DEBUG(4,("SAMR_R_ENUM_DOM_USERS: %s\n", get_nt_error_msg(r_e.status)));
813 p = (r_e.status == STATUS_MORE_ENTRIES);
818 uint32 i = (*num_sam_users);
822 (*num_sam_users) += r_e.num_entries2;
823 (*sam) = (struct acct_info*) Realloc((*sam),
824 sizeof(struct acct_info) * (*num_sam_users));
828 (*num_sam_users) = 0;
832 for (j = 0; i < (*num_sam_users) && j < r_e.num_entries2; j++, i++)
834 (*sam)[i].rid = r_e.sam[j].rid;
835 (*sam)[i].acct_name[0] = 0;
836 (*sam)[i].acct_desc[0] = 0;
837 if (r_e.sam[j].hdr_name.buffer)
839 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_acct_name[name_idx], sizeof((*sam)[i].acct_name)-1);
842 DEBUG(5,("samr_enum_dom_users: idx: %4d rid: %8x acct: %s\n",
843 i, (*sam)[i].rid, (*sam)[i].acct_name));
845 (*start_idx) = r_e.next_idx;
847 else if (status == 0x0)
849 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
856 if (r_e.uni_acct_name != NULL)
858 free(r_e.uni_acct_name);
863 status = NT_STATUS_ACCESS_DENIED | 0xC0000000;
866 prs_mem_free(&data );
867 prs_mem_free(&rdata );
872 /****************************************************************************
874 ****************************************************************************/
875 BOOL samr_connect(struct cli_state *cli, uint16 fnum,
876 char *srv_name, uint32 unknown_0,
877 POLICY_HND *connect_pol)
883 BOOL valid_pol = False;
885 DEBUG(4,("SAMR Open Policy server:%s undoc value:%x\n",
886 srv_name, unknown_0));
888 if (srv_name == NULL || connect_pol == NULL) return False;
890 /* create and send a MSRPC command with api SAMR_CONNECT */
892 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
893 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
895 /* store the parameters */
896 make_samr_q_connect(&q_o, srv_name, unknown_0);
898 /* turn parameters into data stream */
899 samr_io_q_connect("", &q_o, &data, 0);
901 /* send the data on \PIPE\ */
902 if (rpc_api_pipe_req(cli, fnum, SAMR_CONNECT, &data, &rdata))
907 samr_io_r_connect("", &r_o, &rdata, 0);
908 p = rdata.offset != 0;
910 if (p && r_o.status != 0)
912 /* report error code */
913 DEBUG(4,("SAMR_R_CONNECT: %s\n", get_nt_error_msg(r_o.status)));
919 memcpy(connect_pol, &r_o.connect_pol, sizeof(r_o.connect_pol));
924 prs_mem_free(&data );
925 prs_mem_free(&rdata );
930 /****************************************************************************
932 ****************************************************************************/
933 BOOL samr_open_user(struct cli_state *cli, uint16 fnum,
934 POLICY_HND *pol, uint32 unk_0, uint32 rid,
935 POLICY_HND *user_pol)
940 SAMR_Q_OPEN_USER q_o;
941 BOOL valid_pol = False;
943 DEBUG(4,("SAMR Open User. unk_0: %08x RID:%x\n",
946 if (pol == NULL || user_pol == NULL) return False;
948 /* create and send a MSRPC command with api SAMR_OPEN_USER */
950 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
951 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
953 /* store the parameters */
954 make_samr_q_open_user(&q_o, pol, unk_0, rid);
956 /* turn parameters into data stream */
957 samr_io_q_open_user("", &q_o, &data, 0);
959 /* send the data on \PIPE\ */
960 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_USER, &data, &rdata))
962 SAMR_R_OPEN_USER r_o;
965 samr_io_r_open_user("", &r_o, &rdata, 0);
966 p = rdata.offset != 0;
968 if (p && r_o.status != 0)
970 /* report error code */
971 DEBUG(4,("SAMR_R_OPEN_USER: %s\n", get_nt_error_msg(r_o.status)));
977 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
982 prs_mem_free(&data );
983 prs_mem_free(&rdata );
988 /****************************************************************************
990 ****************************************************************************/
991 BOOL samr_open_alias(struct cli_state *cli, uint16 fnum,
992 POLICY_HND *domain_pol,
993 uint32 flags, uint32 rid,
994 POLICY_HND *alias_pol)
999 SAMR_Q_OPEN_ALIAS q_o;
1000 BOOL valid_pol = False;
1002 DEBUG(4,("SAMR Open Alias. RID:%x\n", rid));
1004 if (alias_pol == NULL || domain_pol == NULL) return False;
1006 /* create and send a MSRPC command with api SAMR_OPEN_ALIAS */
1008 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1009 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1011 /* store the parameters */
1012 make_samr_q_open_alias(&q_o, domain_pol, flags, rid);
1014 /* turn parameters into data stream */
1015 samr_io_q_open_alias("", &q_o, &data, 0);
1017 /* send the data on \PIPE\ */
1018 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_ALIAS, &data, &rdata))
1020 SAMR_R_OPEN_ALIAS r_o;
1023 samr_io_r_open_alias("", &r_o, &rdata, 0);
1024 p = rdata.offset != 0;
1026 if (p && r_o.status != 0)
1028 /* report error code */
1029 DEBUG(4,("SAMR_R_OPEN_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1035 memcpy(alias_pol, &r_o.pol, sizeof(r_o.pol));
1040 prs_mem_free(&data );
1041 prs_mem_free(&rdata );
1046 /****************************************************************************
1047 do a SAMR Delete Alias Member
1048 ****************************************************************************/
1049 BOOL samr_del_aliasmem(struct cli_state *cli, uint16 fnum,
1050 POLICY_HND *alias_pol, DOM_SID *sid)
1055 SAMR_Q_DEL_ALIASMEM q_o;
1056 BOOL valid_pol = False;
1058 if (alias_pol == NULL || sid == NULL) return False;
1060 /* create and send a MSRPC command with api SAMR_DEL_ALIASMEM */
1062 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1063 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1065 DEBUG(4,("SAMR Delete Alias Member.\n"));
1067 /* store the parameters */
1068 make_samr_q_del_aliasmem(&q_o, alias_pol, sid);
1070 /* turn parameters into data stream */
1071 samr_io_q_del_aliasmem("", &q_o, &data, 0);
1073 /* send the data on \PIPE\ */
1074 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_ALIASMEM, &data, &rdata))
1076 SAMR_R_DEL_ALIASMEM r_o;
1079 samr_io_r_del_aliasmem("", &r_o, &rdata, 0);
1080 p = rdata.offset != 0;
1082 if (p && r_o.status != 0)
1084 /* report error code */
1085 DEBUG(4,("SAMR_R_DEL_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1095 prs_mem_free(&data );
1096 prs_mem_free(&rdata );
1101 /****************************************************************************
1102 do a SAMR Add Alias Member
1103 ****************************************************************************/
1104 BOOL samr_add_aliasmem(struct cli_state *cli, uint16 fnum,
1105 POLICY_HND *alias_pol, DOM_SID *sid)
1110 SAMR_Q_ADD_ALIASMEM q_o;
1111 BOOL valid_pol = False;
1113 if (alias_pol == NULL || sid == NULL) return False;
1115 /* create and send a MSRPC command with api SAMR_ADD_ALIASMEM */
1117 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1118 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1120 DEBUG(4,("SAMR Add Alias Member.\n"));
1122 /* store the parameters */
1123 make_samr_q_add_aliasmem(&q_o, alias_pol, sid);
1125 /* turn parameters into data stream */
1126 samr_io_q_add_aliasmem("", &q_o, &data, 0);
1128 /* send the data on \PIPE\ */
1129 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_ALIASMEM, &data, &rdata))
1131 SAMR_R_ADD_ALIASMEM r_o;
1134 samr_io_r_add_aliasmem("", &r_o, &rdata, 0);
1135 p = rdata.offset != 0;
1137 if (p && r_o.status != 0)
1139 /* report error code */
1140 DEBUG(4,("SAMR_R_ADD_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1150 prs_mem_free(&data );
1151 prs_mem_free(&rdata );
1156 /****************************************************************************
1157 do a SAMR Delete Domain Alias
1158 ****************************************************************************/
1159 BOOL samr_delete_dom_alias(struct cli_state *cli, uint16 fnum,
1160 POLICY_HND *alias_pol)
1165 SAMR_Q_DELETE_DOM_ALIAS q_o;
1166 BOOL valid_pol = False;
1168 if (alias_pol == NULL) return False;
1170 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_ALIAS */
1172 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1173 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1175 DEBUG(4,("SAMR Delete Domain Alias.\n"));
1177 /* store the parameters */
1178 make_samr_q_delete_dom_alias(&q_o, alias_pol);
1180 /* turn parameters into data stream */
1181 samr_io_q_delete_dom_alias("", &q_o, &data, 0);
1183 /* send the data on \PIPE\ */
1184 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_ALIAS, &data, &rdata))
1186 SAMR_R_DELETE_DOM_ALIAS r_o;
1189 samr_io_r_delete_dom_alias("", &r_o, &rdata, 0);
1190 p = rdata.offset != 0;
1192 if (p && r_o.status != 0)
1194 /* report error code */
1195 DEBUG(4,("SAMR_R_DELETE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1205 prs_mem_free(&data );
1206 prs_mem_free(&rdata );
1211 /****************************************************************************
1212 do a SAMR Create Domain User
1213 ****************************************************************************/
1214 BOOL samr_create_dom_user(struct cli_state *cli, uint16 fnum,
1215 POLICY_HND *domain_pol, const char *acct_name,
1216 uint32 unk_0, uint32 unk_1,
1217 POLICY_HND *user_pol, uint32 *rid)
1222 SAMR_Q_CREATE_USER q_o;
1223 BOOL valid_pol = False;
1225 if (user_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1227 /* create and send a MSRPC command with api SAMR_CREATE_USER */
1229 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1230 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1232 DEBUG(4,("SAMR Create Domain User. Name:%s\n", acct_name));
1234 /* store the parameters */
1235 make_samr_q_create_user(&q_o, domain_pol, acct_name, unk_0, unk_1);
1237 /* turn parameters into data stream */
1238 samr_io_q_create_user("", &q_o, &data, 0);
1240 /* send the data on \PIPE\ */
1241 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_USER, &data, &rdata))
1243 SAMR_R_CREATE_USER r_o;
1246 samr_io_r_create_user("", &r_o, &rdata, 0);
1247 p = rdata.offset != 0;
1249 if (p && r_o.status != 0)
1251 /* report error code */
1252 DEBUG(4,("SAMR_R_CREATE_USER: %s\n", get_nt_error_msg(r_o.status)));
1258 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
1259 *rid = r_o.user_rid;
1264 prs_mem_free(&data );
1265 prs_mem_free(&rdata );
1270 /****************************************************************************
1271 do a SAMR Create Domain Alias
1272 ****************************************************************************/
1273 BOOL samr_create_dom_alias(struct cli_state *cli, uint16 fnum,
1274 POLICY_HND *domain_pol, const char *acct_name,
1275 POLICY_HND *alias_pol, uint32 *rid)
1280 SAMR_Q_CREATE_DOM_ALIAS q_o;
1281 BOOL valid_pol = False;
1283 if (alias_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1285 /* create and send a MSRPC command with api SAMR_CREATE_DOM_ALIAS */
1287 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1288 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1290 DEBUG(4,("SAMR Create Domain Alias. Name:%s\n", acct_name));
1292 /* store the parameters */
1293 make_samr_q_create_dom_alias(&q_o, domain_pol, acct_name);
1295 /* turn parameters into data stream */
1296 samr_io_q_create_dom_alias("", &q_o, &data, 0);
1298 /* send the data on \PIPE\ */
1299 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_ALIAS, &data, &rdata))
1301 SAMR_R_CREATE_DOM_ALIAS r_o;
1304 samr_io_r_create_dom_alias("", &r_o, &rdata, 0);
1305 p = rdata.offset != 0;
1307 if (p && r_o.status != 0)
1309 /* report error code */
1310 DEBUG(4,("SAMR_R_CREATE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1316 memcpy(alias_pol, &r_o.alias_pol, sizeof(r_o.alias_pol));
1322 prs_mem_free(&data );
1323 prs_mem_free(&rdata );
1328 /****************************************************************************
1329 do a SAMR Get Alias Info
1330 ****************************************************************************/
1331 BOOL samr_query_aliasinfo(struct cli_state *cli, uint16 fnum,
1332 POLICY_HND *alias_pol, uint16 switch_value,
1333 ALIAS_INFO_CTR *ctr)
1338 SAMR_Q_QUERY_ALIASINFO q_o;
1339 BOOL valid_pol = False;
1341 if (alias_pol == NULL || ctr == NULL) return False;
1343 /* create and send a MSRPC command with api SAMR_GET_ALIASINFO */
1345 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1346 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1348 DEBUG(4,("SAMR Get Alias Info\n"));
1350 /* store the parameters */
1351 make_samr_q_query_aliasinfo(&q_o, alias_pol, switch_value);
1353 /* turn parameters into data stream */
1354 samr_io_q_query_aliasinfo("", &q_o, &data, 0);
1356 /* send the data on \PIPE\ */
1357 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_ALIASINFO, &data, &rdata))
1359 SAMR_R_QUERY_ALIASINFO r_o;
1362 /* get alias info */
1365 samr_io_r_query_aliasinfo("", &r_o, &rdata, 0);
1366 p = rdata.offset != 0;
1368 if (p && r_o.status != 0)
1370 /* report error code */
1371 DEBUG(4,("SAMR_R_QUERY_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1381 prs_mem_free(&data );
1382 prs_mem_free(&rdata );
1387 /****************************************************************************
1388 do a SAMR Set Alias Info
1389 ****************************************************************************/
1390 BOOL samr_set_aliasinfo(struct cli_state *cli, uint16 fnum,
1391 POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1396 SAMR_Q_SET_ALIASINFO q_o;
1397 BOOL valid_pol = False;
1399 if (alias_pol == NULL || ctr == NULL) return False;
1401 /* create and send a MSRPC command with api SAMR_SET_ALIASINFO */
1403 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1404 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1406 DEBUG(4,("SAMR Set Alias Info\n"));
1408 /* store the parameters */
1409 make_samr_q_set_aliasinfo(&q_o, alias_pol, ctr);
1411 /* turn parameters into data stream */
1412 samr_io_q_set_aliasinfo("", &q_o, &data, 0);
1414 /* send the data on \PIPE\ */
1415 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_ALIASINFO, &data, &rdata))
1417 SAMR_R_SET_ALIASINFO r_o;
1420 samr_io_r_set_aliasinfo("", &r_o, &rdata, 0);
1421 p = rdata.offset != 0;
1423 if (p && r_o.status != 0)
1425 /* report error code */
1426 DEBUG(4,("SAMR_R_SET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1436 prs_mem_free(&data );
1437 prs_mem_free(&rdata );
1442 /****************************************************************************
1443 do a SAMR Open Group
1444 ****************************************************************************/
1445 BOOL samr_open_group(struct cli_state *cli, uint16 fnum,
1446 POLICY_HND *domain_pol,
1447 uint32 flags, uint32 rid,
1448 POLICY_HND *group_pol)
1453 SAMR_Q_OPEN_GROUP q_o;
1454 BOOL valid_pol = False;
1456 DEBUG(4,("SAMR Open Group. RID:%x\n", rid));
1458 if (group_pol == NULL || domain_pol == NULL) return False;
1460 /* create and send a MSRPC command with api SAMR_OPEN_GROUP */
1462 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1463 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1465 /* store the parameters */
1466 make_samr_q_open_group(&q_o, domain_pol, flags, rid);
1468 /* turn parameters into data stream */
1469 samr_io_q_open_group("", &q_o, &data, 0);
1471 /* send the data on \PIPE\ */
1472 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_GROUP, &data, &rdata))
1474 SAMR_R_OPEN_GROUP r_o;
1477 samr_io_r_open_group("", &r_o, &rdata, 0);
1478 p = rdata.offset != 0;
1480 if (p && r_o.status != 0)
1482 /* report error code */
1483 DEBUG(4,("SAMR_R_OPEN_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1489 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1494 prs_mem_free(&data );
1495 prs_mem_free(&rdata );
1500 /****************************************************************************
1501 do a SAMR Delete Group Member
1502 ****************************************************************************/
1503 BOOL samr_del_groupmem(struct cli_state *cli, uint16 fnum,
1504 POLICY_HND *group_pol, uint32 rid)
1509 SAMR_Q_DEL_GROUPMEM q_o;
1510 BOOL valid_pol = False;
1512 if (group_pol == NULL) return False;
1514 /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */
1516 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1517 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1519 DEBUG(4,("SAMR Delete Group Member.\n"));
1521 /* store the parameters */
1522 make_samr_q_del_groupmem(&q_o, group_pol, rid);
1524 /* turn parameters into data stream */
1525 samr_io_q_del_groupmem("", &q_o, &data, 0);
1527 /* send the data on \PIPE\ */
1528 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_GROUPMEM, &data, &rdata))
1530 SAMR_R_DEL_GROUPMEM r_o;
1533 samr_io_r_del_groupmem("", &r_o, &rdata, 0);
1534 p = rdata.offset != 0;
1536 if (p && r_o.status != 0)
1538 /* report error code */
1539 DEBUG(4,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1549 prs_mem_free(&data );
1550 prs_mem_free(&rdata );
1555 /****************************************************************************
1556 do a SAMR Add Group Member
1557 ****************************************************************************/
1558 BOOL samr_add_groupmem(struct cli_state *cli, uint16 fnum,
1559 POLICY_HND *group_pol, uint32 rid)
1564 SAMR_Q_ADD_GROUPMEM q_o;
1565 BOOL valid_pol = False;
1567 if (group_pol == NULL) return False;
1569 /* create and send a MSRPC command with api SAMR_ADD_GROUPMEM */
1571 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1572 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1574 DEBUG(4,("SAMR Add Group Member.\n"));
1576 /* store the parameters */
1577 make_samr_q_add_groupmem(&q_o, group_pol, rid);
1579 /* turn parameters into data stream */
1580 samr_io_q_add_groupmem("", &q_o, &data, 0);
1582 /* send the data on \PIPE\ */
1583 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_GROUPMEM, &data, &rdata))
1585 SAMR_R_ADD_GROUPMEM r_o;
1588 samr_io_r_add_groupmem("", &r_o, &rdata, 0);
1589 p = rdata.offset != 0;
1591 if (p && r_o.status != 0)
1593 /* report error code */
1594 DEBUG(4,("SAMR_R_ADD_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1604 prs_mem_free(&data );
1605 prs_mem_free(&rdata );
1610 /****************************************************************************
1611 do a SAMR Delete Domain Group
1612 ****************************************************************************/
1613 BOOL samr_delete_dom_group(struct cli_state *cli, uint16 fnum, POLICY_HND *group_pol)
1618 SAMR_Q_DELETE_DOM_GROUP q_o;
1619 BOOL valid_pol = False;
1621 if (group_pol == NULL) return False;
1623 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */
1625 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1626 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1628 DEBUG(4,("SAMR Delete Domain Group.\n"));
1630 /* store the parameters */
1631 make_samr_q_delete_dom_group(&q_o, group_pol);
1633 /* turn parameters into data stream */
1634 samr_io_q_delete_dom_group("", &q_o, &data, 0);
1636 /* send the data on \PIPE\ */
1637 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_GROUP, &data, &rdata))
1639 SAMR_R_DELETE_DOM_GROUP r_o;
1642 samr_io_r_delete_dom_group("", &r_o, &rdata, 0);
1643 p = rdata.offset != 0;
1645 if (p && r_o.status != 0)
1647 /* report error code */
1648 DEBUG(4,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1658 prs_mem_free(&data );
1659 prs_mem_free(&rdata );
1664 /****************************************************************************
1665 do a SAMR Create Domain Group
1666 ****************************************************************************/
1667 BOOL samr_create_dom_group(struct cli_state *cli, uint16 fnum,
1668 POLICY_HND *domain_pol, const char *acct_name,
1669 POLICY_HND *group_pol, uint32 *rid)
1674 SAMR_Q_CREATE_DOM_GROUP q_o;
1675 BOOL valid_pol = False;
1677 if (group_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1679 /* create and send a MSRPC command with api SAMR_CREATE_DOM_GROUP */
1681 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1682 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1684 DEBUG(4,("SAMR Create Domain Group. Name:%s\n", acct_name));
1686 /* store the parameters */
1687 make_samr_q_create_dom_group(&q_o, domain_pol, acct_name);
1689 /* turn parameters into data stream */
1690 samr_io_q_create_dom_group("", &q_o, &data, 0);
1692 /* send the data on \PIPE\ */
1693 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_GROUP, &data, &rdata))
1695 SAMR_R_CREATE_DOM_GROUP r_o;
1698 samr_io_r_create_dom_group("", &r_o, &rdata, 0);
1699 p = rdata.offset != 0;
1701 if (p && r_o.status != 0)
1703 /* report error code */
1704 DEBUG(4,("SAMR_R_CREATE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1710 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1716 prs_mem_free(&data );
1717 prs_mem_free(&rdata );
1722 /****************************************************************************
1723 do a SAMR Set Group Info
1724 ****************************************************************************/
1725 BOOL samr_set_groupinfo(struct cli_state *cli, uint16 fnum,
1726 POLICY_HND *group_pol, GROUP_INFO_CTR *ctr)
1731 SAMR_Q_SET_GROUPINFO q_o;
1732 BOOL valid_pol = False;
1734 if (group_pol == NULL || ctr == NULL) return False;
1736 /* create and send a MSRPC command with api SAMR_SET_GROUPINFO */
1738 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1739 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1741 DEBUG(4,("SAMR Set Group Info\n"));
1743 /* store the parameters */
1744 make_samr_q_set_groupinfo(&q_o, group_pol, ctr);
1746 /* turn parameters into data stream */
1747 samr_io_q_set_groupinfo("", &q_o, &data, 0);
1749 /* send the data on \PIPE\ */
1750 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_GROUPINFO, &data, &rdata))
1752 SAMR_R_SET_GROUPINFO r_o;
1755 samr_io_r_set_groupinfo("", &r_o, &rdata, 0);
1756 p = rdata.offset != 0;
1758 if (p && r_o.status != 0)
1760 /* report error code */
1761 DEBUG(4,("SAMR_R_SET_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
1771 prs_mem_free(&data );
1772 prs_mem_free(&rdata );
1777 /****************************************************************************
1778 do a SAMR Open Domain
1779 ****************************************************************************/
1780 BOOL samr_open_domain(struct cli_state *cli, uint16 fnum,
1781 POLICY_HND *connect_pol, uint32 ace_perms,
1783 POLICY_HND *domain_pol)
1789 SAMR_Q_OPEN_DOMAIN q_o;
1790 BOOL valid_pol = False;
1792 if (DEBUGLEVEL >= 4)
1794 sid_to_string(sid_str, sid);
1795 DEBUG(4,("SAMR Open Domain. SID:%s Permissions:%x\n",
1796 sid_str, ace_perms));
1799 if (connect_pol == NULL || sid == NULL || domain_pol == NULL) return False;
1801 /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
1803 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1804 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1806 /* store the parameters */
1807 make_samr_q_open_domain(&q_o, connect_pol, ace_perms, sid);
1809 /* turn parameters into data stream */
1810 samr_io_q_open_domain("", &q_o, &data, 0);
1812 /* send the data on \PIPE\ */
1813 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_DOMAIN, &data, &rdata))
1815 SAMR_R_OPEN_DOMAIN r_o;
1818 samr_io_r_open_domain("", &r_o, &rdata, 0);
1819 p = rdata.offset != 0;
1821 if (p && r_o.status != 0)
1823 /* report error code */
1824 DEBUG(4,("SAMR_R_OPEN_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1830 memcpy(domain_pol, &r_o.domain_pol, sizeof(r_o.domain_pol));
1835 prs_mem_free(&data );
1836 prs_mem_free(&rdata );
1841 /****************************************************************************
1842 do a SAMR Query Lookup Domain
1843 ****************************************************************************/
1844 BOOL samr_query_lookup_domain(struct cli_state *cli, uint16 fnum,
1845 POLICY_HND *pol, const char *dom_name,
1851 SAMR_Q_LOOKUP_DOMAIN q_o;
1852 BOOL valid_query = False;
1854 if (pol == NULL || dom_name == NULL || dom_sid == NULL) return False;
1856 /* create and send a MSRPC command with api SAMR_LOOKUP_DOMAIN */
1858 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1859 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1861 DEBUG(4,("SAMR Query Lookup Domain.\n"));
1863 /* store the parameters */
1864 make_samr_q_lookup_domain(&q_o, pol, dom_name);
1866 /* turn parameters into data stream */
1867 samr_io_q_lookup_domain("", &q_o, &data, 0);
1869 /* send the data on \PIPE\ */
1870 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_DOMAIN, &data, &rdata))
1872 SAMR_R_LOOKUP_DOMAIN r_o;
1875 samr_io_r_lookup_domain("", &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_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1885 if (p && r_o.ptr_sid != 0)
1887 sid_copy(dom_sid, &r_o.dom_sid.sid);
1892 prs_mem_free(&data );
1893 prs_mem_free(&rdata );
1898 /****************************************************************************
1899 do a SAMR Query Lookup Names
1900 ****************************************************************************/
1901 BOOL samr_query_lookup_names(struct cli_state *cli, uint16 fnum,
1902 POLICY_HND *pol, uint32 flags,
1903 uint32 num_names, char **names,
1905 uint32 rid[MAX_LOOKUP_SIDS],
1906 uint32 type[MAX_LOOKUP_SIDS])
1911 SAMR_Q_LOOKUP_NAMES q_o;
1912 BOOL valid_query = False;
1914 if (pol == NULL || flags == 0 || num_names == 0 || names == NULL ||
1915 num_rids == NULL || rid == NULL || type == NULL ) return False;
1917 /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */
1919 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1920 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1922 DEBUG(4,("SAMR Query Lookup NAMES.\n"));
1924 /* store the parameters */
1925 make_samr_q_lookup_names(&q_o, pol, flags, num_names, names);
1927 /* turn parameters into data stream */
1928 samr_io_q_lookup_names("", &q_o, &data, 0);
1930 /* send the data on \PIPE\ */
1931 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_NAMES, &data, &rdata))
1933 SAMR_R_LOOKUP_NAMES r_o;
1936 samr_io_r_lookup_names("", &r_o, &rdata, 0);
1937 p = rdata.offset != 0;
1939 if (p && r_o.status != 0)
1941 /* report error code */
1942 DEBUG(4,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status)));
1943 p = r_o.status == 0x107;
1948 if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 &&
1949 r_o.num_types1 == r_o.num_rids1)
1954 *num_rids = r_o.num_rids1;
1956 for (i = 0; i < r_o.num_rids1; i++)
1958 rid[i] = r_o.rid[i];
1960 for (i = 0; i < r_o.num_types1; i++)
1962 type[i] = r_o.type[i];
1965 else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0)
1977 prs_mem_free(&data );
1978 prs_mem_free(&rdata );
1983 /****************************************************************************
1984 do a SAMR Query Lookup RIDS
1985 ****************************************************************************/
1986 BOOL samr_query_lookup_rids(struct cli_state *cli, uint16 fnum,
1987 POLICY_HND *pol, uint32 flags,
1988 uint32 num_rids, uint32 *rids,
1996 SAMR_Q_LOOKUP_RIDS q_o;
1997 BOOL valid_query = False;
1999 if (pol == NULL || flags == 0 || num_rids == 0 || rids == NULL ||
2000 num_names == NULL || names == NULL || type == NULL ) return False;
2002 /* create and send a MSRPC command with api SAMR_LOOKUP_RIDS */
2004 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2005 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2007 DEBUG(4,("SAMR Query Lookup RIDs.\n"));
2009 /* store the parameters */
2010 make_samr_q_lookup_rids(&q_o, pol, flags, num_rids, rids);
2012 /* turn parameters into data stream */
2013 samr_io_q_lookup_rids("", &q_o, &data, 0);
2015 /* send the data on \PIPE\ */
2016 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_RIDS, &data, &rdata))
2018 SAMR_R_LOOKUP_RIDS r_o;
2022 samr_io_r_lookup_rids("", &r_o, &rdata, 0);
2023 p = rdata.offset != 0;
2025 if (p && r_o.status != 0)
2027 /* report error code */
2028 DEBUG(4,("SAMR_R_LOOKUP_RIDS: %s\n", get_nt_error_msg(r_o.status)));
2034 if (r_o.ptr_names != 0 && r_o.ptr_types != 0 &&
2035 r_o.num_types1 == r_o.num_names1)
2043 for (i = 0; i < r_o.num_names1; i++)
2046 unistr2_to_ascii(tmp, &r_o.uni_name[i], sizeof(tmp)-1);
2047 add_chars_to_array(num_names, names, tmp);
2050 if ((*num_names) != 0)
2052 (*type) = (uint32*)malloc((*num_names) * sizeof(**type));
2055 for (i = 0; (*type) != NULL && i < r_o.num_types1; i++)
2057 (*type)[i] = r_o.type[i];
2060 else if (r_o.ptr_names == 0 && r_o.ptr_types == 0)
2073 samr_free_r_lookup_rids(&r_o);
2076 prs_mem_free(&data );
2077 prs_mem_free(&rdata );
2082 /****************************************************************************
2083 do a SAMR Query Alias Members
2084 ****************************************************************************/
2085 BOOL samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
2086 POLICY_HND *alias_pol,
2087 uint32 *num_mem, DOM_SID2 *sid)
2092 SAMR_Q_QUERY_ALIASMEM q_o;
2093 BOOL valid_query = False;
2095 DEBUG(4,("SAMR Query Alias Members.\n"));
2097 if (alias_pol == NULL || sid == NULL || num_mem == NULL) return False;
2099 /* create and send a MSRPC command with api SAMR_QUERY_ALIASMEM */
2101 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2102 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2104 /* store the parameters */
2105 make_samr_q_query_aliasmem(&q_o, alias_pol);
2107 /* turn parameters into data stream */
2108 samr_io_q_query_aliasmem("", &q_o, &data, 0);
2110 /* send the data on \PIPE\ */
2111 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_ALIASMEM, &data, &rdata))
2113 SAMR_R_QUERY_ALIASMEM r_o;
2119 samr_io_r_query_aliasmem("", &r_o, &rdata, 0);
2120 p = rdata.offset != 0;
2122 if (p && r_o.status != 0)
2124 /* report error code */
2125 DEBUG(4,("SAMR_R_QUERY_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
2129 if (p && r_o.ptr != 0)
2132 *num_mem = r_o.num_sids;
2137 prs_mem_free(&data );
2138 prs_mem_free(&rdata );
2143 /****************************************************************************
2144 do a SAMR Query User Aliases
2145 ****************************************************************************/
2146 BOOL samr_query_useraliases(struct cli_state *cli, uint16 fnum,
2147 POLICY_HND *pol, uint32 *ptr_sid, DOM_SID2 *sid,
2148 uint32 *num_aliases, uint32 **rid)
2153 SAMR_Q_QUERY_USERALIASES q_o;
2154 BOOL valid_query = False;
2157 DEBUG(4,("SAMR Query User Aliases.\n"));
2159 if (pol == NULL || sid == NULL || rid == NULL || num_aliases == 0) return False;
2161 /* create and send a MSRPC command with api SAMR_QUERY_USERALIASES */
2163 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2164 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2166 /* store the parameters */
2167 make_samr_q_query_useraliases(&q_o, pol, ptr_sid, sid);
2169 /* turn parameters into data stream */
2170 samr_io_q_query_useraliases("", &q_o, &data, 0);
2172 /* send the data on \PIPE\ */
2173 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERALIASES, &data, &rdata))
2175 SAMR_R_QUERY_USERALIASES r_o;
2180 samr_io_r_query_useraliases("", &r_o, &rdata, 0);
2182 p = rdata.offset != 0;
2184 if (p && r_o.status != 0)
2186 /* report error code */
2187 DEBUG(4,("SAMR_R_QUERY_USERALIASES: %s\n", get_nt_error_msg(r_o.status)));
2191 if (p && r_o.ptr != 0)
2194 *num_aliases = r_o.num_entries;
2199 prs_mem_free(&data );
2200 prs_mem_free(&rdata );
2205 /****************************************************************************
2206 do a SAMR Query Group Members
2207 ****************************************************************************/
2208 BOOL samr_query_groupmem(struct cli_state *cli, uint16 fnum,
2209 POLICY_HND *group_pol,
2210 uint32 *num_mem, uint32 **rid, uint32 **attr)
2215 SAMR_Q_QUERY_GROUPMEM q_o;
2216 BOOL valid_query = False;
2218 DEBUG(4,("SAMR Query Group Members.\n"));
2220 if (group_pol == NULL || rid == NULL || attr == NULL || num_mem == NULL) return False;
2222 /* create and send a MSRPC command with api SAMR_QUERY_GROUPMEM */
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_groupmem(&q_o, group_pol);
2230 /* turn parameters into data stream */
2231 samr_io_q_query_groupmem("", &q_o, &data, 0);
2233 /* send the data on \PIPE\ */
2234 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPMEM, &data, &rdata))
2236 SAMR_R_QUERY_GROUPMEM r_o;
2242 samr_io_r_query_groupmem("", &r_o, &rdata, 0);
2245 p = rdata.offset != 0;
2247 if (p && r_o.status != 0)
2249 /* report error code */
2250 DEBUG(4,("SAMR_R_QUERY_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
2254 if (p && r_o.ptr != 0 &&
2255 r_o.ptr_rids != 0 && r_o.ptr_attrs != 0 &&
2256 r_o.num_rids == r_o.num_attrs)
2259 *num_mem = r_o.num_rids;
2264 prs_mem_free(&data );
2265 prs_mem_free(&rdata );
2270 /****************************************************************************
2271 do a SAMR Query User Groups
2272 ****************************************************************************/
2273 BOOL samr_query_usergroups(struct cli_state *cli, uint16 fnum,
2274 POLICY_HND *pol, uint32 *num_groups,
2280 SAMR_Q_QUERY_USERGROUPS q_o;
2281 BOOL valid_query = False;
2283 DEBUG(4,("SAMR Query User Groups.\n"));
2285 if (pol == NULL || gid == NULL || num_groups == 0) return False;
2287 /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
2289 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2290 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2292 /* store the parameters */
2293 make_samr_q_query_usergroups(&q_o, pol);
2295 /* turn parameters into data stream */
2296 samr_io_q_query_usergroups("", &q_o, &data, 0);
2298 /* send the data on \PIPE\ */
2299 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERGROUPS, &data, &rdata))
2301 SAMR_R_QUERY_USERGROUPS r_o;
2307 samr_io_r_query_usergroups("", &r_o, &rdata, 0);
2309 p = rdata.offset != 0;
2311 if (p && r_o.status != 0)
2313 /* report error code */
2314 DEBUG(4,("SAMR_R_QUERY_USERGROUPS: %s\n", get_nt_error_msg(r_o.status)));
2318 if (p && r_o.ptr_0 != 0)
2321 *num_groups = r_o.num_entries;
2326 prs_mem_free(&data );
2327 prs_mem_free(&rdata );
2332 /****************************************************************************
2333 do a SAMR Query Group Info
2334 ****************************************************************************/
2335 BOOL samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
2337 uint16 switch_value, GROUP_INFO_CTR* ctr)
2342 SAMR_Q_QUERY_GROUPINFO q_o;
2343 BOOL valid_query = False;
2345 DEBUG(4,("SAMR Query Group Info. level: %d\n", switch_value));
2347 if (pol == NULL || ctr == NULL || switch_value == 0) return False;
2349 /* create and send a MSRPC command with api SAMR_QUERY_GROUPINFO */
2351 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2352 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2354 /* store the parameters */
2355 make_samr_q_query_groupinfo(&q_o, pol, switch_value);
2357 /* turn parameters into data stream */
2358 samr_io_q_query_groupinfo("", &q_o, &data, 0);
2360 /* send the data on \PIPE\ */
2361 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPINFO, &data, &rdata))
2363 SAMR_R_QUERY_GROUPINFO r_o;
2366 /* get group info */
2369 samr_io_r_query_groupinfo("", &r_o, &rdata, 0);
2370 p = rdata.offset != 0;
2372 if (p && r_o.status != 0)
2374 /* report error code */
2375 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
2379 if (p && r_o.ctr->switch_value1 != switch_value)
2381 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: received incorrect level %d\n",
2382 r_o.ctr->switch_value1));
2385 if (p && r_o.ptr != 0)
2391 prs_mem_free(&data );
2392 prs_mem_free(&rdata );
2397 /****************************************************************************
2398 do a SAMR Query User Info
2399 ****************************************************************************/
2400 BOOL samr_query_userinfo(struct cli_state *cli, uint16 fnum,
2401 POLICY_HND *pol, uint16 switch_value, void* usr)
2406 SAMR_Q_QUERY_USERINFO q_o;
2407 BOOL valid_query = False;
2409 DEBUG(4,("SAMR Query User Info. level: %d\n", switch_value));
2411 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2413 /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
2415 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2416 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2418 /* store the parameters */
2419 make_samr_q_query_userinfo(&q_o, pol, switch_value);
2421 /* turn parameters into data stream */
2422 samr_io_q_query_userinfo("", &q_o, &data, 0);
2424 /* send the data on \PIPE\ */
2425 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERINFO, &data, &rdata))
2427 SAMR_R_QUERY_USERINFO r_o;
2433 samr_io_r_query_userinfo("", &r_o, &rdata, 0);
2434 p = rdata.offset != 0;
2436 if (p && r_o.status != 0)
2438 /* report error code */
2439 DEBUG(4,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2443 if (p && r_o.switch_value != switch_value)
2445 DEBUG(4,("SAMR_R_QUERY_USERINFO: received incorrect level %d\n",
2449 if (p && r_o.ptr != 0)
2455 prs_mem_free(&data );
2456 prs_mem_free(&rdata );
2461 /****************************************************************************
2463 ****************************************************************************/
2464 BOOL samr_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
2469 SAMR_Q_CLOSE_HND q_c;
2470 BOOL valid_close = False;
2472 DEBUG(4,("SAMR Close\n"));
2474 if (hnd == NULL) return False;
2476 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2477 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2479 /* create and send a MSRPC command with api SAMR_CLOSE_HND */
2481 /* store the parameters */
2482 make_samr_q_close_hnd(&q_c, hnd);
2484 /* turn parameters into data stream */
2485 samr_io_q_close_hnd("", &q_c, &data, 0);
2487 /* send the data on \PIPE\ */
2488 if (rpc_api_pipe_req(cli, fnum, SAMR_CLOSE_HND, &data, &rdata))
2490 SAMR_R_CLOSE_HND r_c;
2493 samr_io_r_close_hnd("", &r_c, &rdata, 0);
2494 p = rdata.offset != 0;
2496 if (p && r_c.status != 0)
2498 /* report error code */
2499 DEBUG(4,("SAMR_CLOSE_HND: %s\n", get_nt_error_msg(r_c.status)));
2505 /* check that the returned policy handle is all zeros */
2509 for (i = 0; i < sizeof(r_c.pol.data); i++)
2511 if (r_c.pol.data[i] != 0)
2513 valid_close = False;
2519 DEBUG(4,("SAMR_CLOSE_HND: non-zero handle returned\n"));
2524 prs_mem_free(&data );
2525 prs_mem_free(&rdata );
2530 /****************************************************************************
2531 do a SAMR query display info
2532 ****************************************************************************/
2533 BOOL samr_query_dispinfo(struct cli_state *cli, uint16 fnum,
2534 POLICY_HND *pol_open_domain, uint16 level,
2535 uint32 *num_entries,
2536 SAM_DISPINFO_CTR *ctr)
2541 SAMR_Q_QUERY_DISPINFO q_o;
2542 BOOL valid_query = False;
2544 DEBUG(4,("SAMR Query Display Info. level: %d\n", level));
2546 if (pol_open_domain == NULL || num_entries == NULL || ctr == NULL ||
2552 /* create and send a MSRPC command with api SAMR_QUERY_DISPINFO */
2554 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2555 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2557 /* store the parameters */
2558 make_samr_q_query_dispinfo(&q_o, pol_open_domain, level, 0, 0xffffffff);
2560 /* turn parameters into data stream */
2561 samr_io_q_query_dispinfo("", &q_o, &data, 0);
2563 /* send the data on \PIPE\ */
2564 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_DISPINFO, &data, &rdata))
2566 SAMR_R_QUERY_DISPINFO r_o;
2572 samr_io_r_query_dispinfo("", &r_o, &rdata, 0);
2573 p = rdata.offset != 0;
2575 if (p && r_o.status != 0)
2577 /* report error code */
2578 DEBUG(4,("SAMR_R_QUERY_DISPINFO: %s\n", get_nt_error_msg(r_o.status)));
2582 if (p && r_o.switch_level != level)
2584 DEBUG(4,("SAMR_R_QUERY_DISPINFO: received incorrect level %d\n",
2588 if (p && r_o.ptr_entries != 0)
2594 prs_mem_free(&data );
2595 prs_mem_free(&rdata );