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 alias
38 ****************************************************************************/
39 BOOL create_samr_domain_alias(struct cli_state *cli, uint16 fnum,
40 POLICY_HND *pol_open_domain,
41 const char *acct_name, const char *acct_desc,
44 POLICY_HND pol_open_alias;
48 if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False;
50 /* send create alias */
51 if (!samr_create_dom_alias(cli, fnum,
54 &pol_open_alias, rid))
59 DEBUG(5,("create_samr_domain_alias: name: %s rid 0x%x\n",
62 ctr.switch_value1 = 3;
63 make_samr_alias_info3(&ctr.alias.info3, acct_desc);
65 /* send set alias info */
66 if (!samr_set_aliasinfo(cli, fnum,
70 DEBUG(5,("create_samr_domain_alias: error in samr_set_aliasinfo\n"));
74 return samr_close(cli, fnum,&pol_open_alias) && ret;
77 /****************************************************************************
78 do a SAMR create domain group
79 ****************************************************************************/
80 BOOL create_samr_domain_group(struct cli_state *cli, uint16 fnum,
81 POLICY_HND *pol_open_domain,
82 const char *acct_name, const char *acct_desc,
85 POLICY_HND pol_open_group;
89 if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False;
91 /* send create group*/
92 if (!samr_create_dom_group(cli, fnum,
95 &pol_open_group, rid))
100 DEBUG(5,("create_samr_domain_group: name: %s rid 0x%x\n",
103 ctr.switch_value1 = 4;
104 ctr.switch_value2 = 4;
105 make_samr_group_info4(&ctr.group.info4, acct_desc);
107 /* send user groups query */
108 if (!samr_set_groupinfo(cli, fnum,
112 DEBUG(5,("create_samr_domain_group: error in samr_set_groupinfo\n"));
116 return samr_close(cli, fnum,&pol_open_group) && ret;
119 /****************************************************************************
120 do a SAMR query user groups
121 ****************************************************************************/
122 BOOL get_samr_query_usergroups(struct cli_state *cli, uint16 fnum,
123 POLICY_HND *pol_open_domain, uint32 user_rid,
124 uint32 *num_groups, DOM_GID *gid)
126 POLICY_HND pol_open_user;
129 if (pol_open_domain == NULL || num_groups == NULL || gid == NULL) return False;
131 /* send open domain (on user sid) */
132 if (!samr_open_user(cli, fnum,
140 /* send user groups query */
141 if (!samr_query_usergroups(cli, fnum,
145 DEBUG(5,("samr_query_usergroups: error in query user groups\n"));
149 return samr_close(cli, fnum,&pol_open_user) && ret;
152 /****************************************************************************
153 do a SAMR delete group
154 ****************************************************************************/
155 BOOL delete_samr_dom_group(struct cli_state *cli, uint16 fnum,
156 POLICY_HND *pol_open_domain,
159 POLICY_HND pol_open_group;
161 if (pol_open_domain == NULL) return False;
163 /* send open domain (on group rid) */
164 if (!samr_open_group(cli, fnum,pol_open_domain,
165 0x00000010, group_rid,
171 /* send group delete */
172 if (!samr_delete_dom_group(cli, fnum,&pol_open_group))
175 DEBUG(5,("delete_samr_dom_group: error in delete domain group\n"));
176 samr_close(cli, fnum,&pol_open_group);
184 /****************************************************************************
185 do a SAMR query group members
186 ****************************************************************************/
187 BOOL get_samr_query_groupmem(struct cli_state *cli, uint16 fnum,
188 POLICY_HND *pol_open_domain,
189 uint32 group_rid, uint32 *num_mem,
190 uint32 *rid, uint32 *attr)
192 POLICY_HND pol_open_group;
195 if (pol_open_domain == NULL || num_mem == NULL || rid == NULL || attr == NULL) return False;
197 /* send open domain (on group sid) */
198 if (!samr_open_group(cli, fnum,pol_open_domain,
199 0x00000010, group_rid,
205 /* send group info query */
206 if (!samr_query_groupmem(cli, fnum,&pol_open_group, num_mem, rid, attr))
209 DEBUG(5,("samr_query_group: error in query group members\n"));
213 return samr_close(cli, fnum,&pol_open_group) && ret;
216 /****************************************************************************
217 do a SAMR delete alias
218 ****************************************************************************/
219 BOOL delete_samr_dom_alias(struct cli_state *cli, uint16 fnum,
220 POLICY_HND *pol_open_domain,
223 POLICY_HND pol_open_alias;
225 if (pol_open_domain == NULL) return False;
227 /* send open domain (on alias rid) */
228 if (!samr_open_alias(cli, fnum,pol_open_domain,
229 0x000f001f, alias_rid, &pol_open_alias))
234 /* send alias delete */
235 if (!samr_delete_dom_alias(cli, fnum,&pol_open_alias))
238 DEBUG(5,("delete_samr_dom_alias: error in delete domain alias\n"));
239 samr_close(cli, fnum,&pol_open_alias);
247 /****************************************************************************
248 do a SAMR query alias members
249 ****************************************************************************/
250 BOOL get_samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
251 POLICY_HND *pol_open_domain,
252 uint32 alias_rid, uint32 *num_mem, DOM_SID2 *sid)
254 POLICY_HND pol_open_alias;
257 if (pol_open_domain == NULL || num_mem == NULL || sid == NULL) return False;
259 /* send open domain (on alias sid) */
260 if (!samr_open_alias(cli, fnum, pol_open_domain,
261 0x000f001f, alias_rid,
267 /* send alias info query */
268 if (!samr_query_aliasmem(cli, fnum, &pol_open_alias, num_mem, sid))
271 DEBUG(5,("samr_query_alias: error in query alias members\n"));
275 return samr_close(cli, fnum,&pol_open_alias) && ret;
278 /****************************************************************************
279 do a SAMR query user info
280 ****************************************************************************/
281 BOOL get_samr_query_userinfo(struct cli_state *cli, uint16 fnum,
282 POLICY_HND *pol_open_domain,
284 uint32 user_rid, SAM_USER_INFO_21 *usr)
286 POLICY_HND pol_open_user;
289 if (pol_open_domain == NULL || usr == NULL) return False;
291 bzero(usr, sizeof(*usr));
293 /* send open domain (on user sid) */
294 if (!samr_open_user(cli, fnum,
302 /* send user info query */
303 if (!samr_query_userinfo(cli, fnum,
305 info_level, (void*)usr))
307 DEBUG(5,("samr_query_userinfo: error in query user info, level 0x%x\n",
312 return samr_close(cli, fnum,&pol_open_user) && ret;
315 /****************************************************************************
316 do a SAMR query group info
317 ****************************************************************************/
318 BOOL get_samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
319 POLICY_HND *pol_open_domain,
321 uint32 group_rid, GROUP_INFO_CTR *ctr)
323 POLICY_HND pol_open_group;
326 if (pol_open_domain == NULL || ctr == NULL) return False;
328 bzero(ctr, sizeof(*ctr));
330 /* send open domain (on group sid) */
331 if (!samr_open_group(cli, fnum,
333 0x00000010, group_rid, &pol_open_group))
338 /* send group info query */
339 if (!samr_query_groupinfo(cli, fnum,
343 DEBUG(5,("samr_query_groupinfo: error in query group info, level 0x%x\n",
348 return samr_close(cli, fnum,&pol_open_group) && ret;
351 /****************************************************************************
352 do a SAMR change user password command
353 ****************************************************************************/
354 BOOL samr_chgpasswd_user(struct cli_state *cli, uint16 fnum,
355 char *srv_name, char *user_name,
356 char nt_newpass[516], uchar nt_oldhash[16],
357 char lm_newpass[516], uchar lm_oldhash[16])
362 SAMR_Q_CHGPASSWD_USER q_e;
363 BOOL valid_pwc = False;
365 /* create and send a MSRPC command with api SAMR_CHGPASSWD_USER */
367 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
368 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
370 DEBUG(4,("SAMR Change User Password. server:%s username:%s\n",
371 srv_name, user_name));
373 make_samr_q_chgpasswd_user(&q_e, srv_name, user_name,
374 nt_newpass, nt_oldhash,
375 lm_newpass, lm_oldhash);
377 /* turn parameters into data stream */
378 samr_io_q_chgpasswd_user("", &q_e, &data, 0);
380 /* send the data on \PIPE\ */
381 if (rpc_api_pipe_req(cli, fnum, SAMR_CHGPASSWD_USER, &data, &rdata))
383 SAMR_R_CHGPASSWD_USER r_e;
386 samr_io_r_chgpasswd_user("", &r_e, &rdata, 0);
388 p = rdata.offset != 0;
389 if (p && r_e.status != 0)
391 /* report error code */
392 DEBUG(0,("SAMR_R_CHGPASSWD_USER: %s\n", get_nt_error_msg(r_e.status)));
402 prs_mem_free(&data );
403 prs_mem_free(&rdata );
408 /****************************************************************************
409 do a SAMR unknown 0x38 command
410 ****************************************************************************/
411 BOOL samr_unknown_38(struct cli_state *cli, uint16 fnum, char *srv_name)
416 SAMR_Q_UNKNOWN_38 q_e;
417 BOOL valid_un8 = False;
419 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
421 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
422 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
424 DEBUG(4,("SAMR Unknown 38 server:%s\n", srv_name));
426 make_samr_q_unknown_38(&q_e, srv_name);
428 /* turn parameters into data stream */
429 samr_io_q_unknown_38("", &q_e, &data, 0);
431 /* send the data on \PIPE\ */
432 if (rpc_api_pipe_req(cli, fnum, SAMR_UNKNOWN_38, &data, &rdata))
434 SAMR_R_UNKNOWN_38 r_e;
437 samr_io_r_unknown_38("", &r_e, &rdata, 0);
439 p = rdata.offset != 0;
441 if (p && r_e.status != 0)
443 /* report error code */
444 DEBUG(0,("SAMR_R_UNKNOWN_38: %s\n", get_nt_error_msg(r_e.status)));
454 prs_mem_free(&data );
455 prs_mem_free(&rdata );
460 /****************************************************************************
461 do a SAMR unknown 0x8 command
462 ****************************************************************************/
463 BOOL samr_query_dom_info(struct cli_state *cli, uint16 fnum,
464 POLICY_HND *domain_pol, uint16 switch_value)
469 SAMR_Q_QUERY_DOMAIN_INFO q_e;
470 BOOL valid_un8 = False;
472 DEBUG(4,("SAMR Unknown 8 switch:%d\n", switch_value));
474 if (domain_pol == NULL) return False;
476 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
478 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
479 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
481 /* store the parameters */
482 make_samr_q_query_dom_info(&q_e, domain_pol, switch_value);
484 /* turn parameters into data stream */
485 samr_io_q_query_dom_info("", &q_e, &data, 0);
487 /* send the data on \PIPE\ */
488 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_DOMAIN_INFO, &data, &rdata))
490 SAMR_R_QUERY_DOMAIN_INFO r_e;
493 samr_io_r_query_dom_info("", &r_e, &rdata, 0);
495 p = rdata.offset != 0;
496 if (p && r_e.status != 0)
498 /* report error code */
499 DEBUG(0,("SAMR_R_QUERY_DOMAIN_INFO: %s\n", get_nt_error_msg(r_e.status)));
509 prs_mem_free(&data );
510 prs_mem_free(&rdata );
515 /****************************************************************************
516 do a SAMR enumerate groups
517 ****************************************************************************/
518 BOOL samr_enum_dom_groups(struct cli_state *cli, uint16 fnum,
519 POLICY_HND *pol, uint32 size,
520 struct acct_info **sam,
526 SAMR_Q_ENUM_DOM_GROUPS q_e;
527 BOOL valid_pol = False;
529 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
531 if (pol == NULL || num_sam_groups == NULL) return False;
533 /* create and send a MSRPC command with api SAMR_ENUM_DOM_GROUPS */
535 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
536 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
538 /* store the parameters */
539 make_samr_q_enum_dom_groups(&q_e, pol, 3, 0, size);
541 /* turn parameters into data stream */
542 samr_io_q_enum_dom_groups("", &q_e, &data, 0);
544 /* send the data on \PIPE\ */
545 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_GROUPS, &data, &rdata))
547 SAMR_R_ENUM_DOM_GROUPS r_e;
550 samr_io_r_enum_dom_groups("", &r_e, &rdata, 0);
552 p = rdata.offset != 0;
553 if (p && r_e.status != 0)
555 /* report error code */
556 DEBUG(0,("SAMR_R_ENUM_DOM_GROUPS: %s\n", get_nt_error_msg(r_e.status)));
566 *num_sam_groups = r_e.num_entries2;
567 if (*num_sam_groups > MAX_SAM_ENTRIES)
569 *num_sam_groups = MAX_SAM_ENTRIES;
570 DEBUG(2,("samr_enum_dom_groups: sam user entries limited to %d\n",
574 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_groups));
581 for (i = 0; i < *num_sam_groups; i++)
583 (*sam)[i].rid = r_e.sam[i].rid_grp;
584 (*sam)[i].acct_name[0] = 0;
585 (*sam)[i].acct_desc[0] = 0;
586 if (r_e.sam[i].hdr_grp_name.buffer)
588 unistr2_to_ascii((*sam)[i].acct_name, &r_e.str[name_idx].uni_grp_name, sizeof((*sam)[i].acct_name)-1);
591 if (r_e.sam[i].hdr_grp_desc.buffer)
593 unistr2_to_ascii((*sam)[i].acct_desc, &r_e.str[name_idx].uni_grp_desc, sizeof((*sam)[i].acct_desc)-1);
596 DEBUG(5,("samr_enum_dom_groups: idx: %4d rid: %8x acct: %s desc: %s\n",
597 i, (*sam)[i].rid, (*sam)[i].acct_name, (*sam)[i].acct_desc));
603 prs_mem_free(&data );
604 prs_mem_free(&rdata );
609 /****************************************************************************
610 do a SAMR enumerate aliases
611 ****************************************************************************/
612 BOOL samr_enum_dom_aliases(struct cli_state *cli, uint16 fnum,
613 POLICY_HND *pol, uint32 size,
614 struct acct_info **sam,
615 int *num_sam_aliases)
620 SAMR_Q_ENUM_DOM_ALIASES q_e;
621 BOOL valid_pol = False;
623 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
625 if (pol == NULL || num_sam_aliases == NULL) return False;
627 /* create and send a MSRPC command with api SAMR_ENUM_DOM_ALIASES */
629 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
630 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
632 /* store the parameters */
633 make_samr_q_enum_dom_aliases(&q_e, pol, size);
635 /* turn parameters into data stream */
636 samr_io_q_enum_dom_aliases("", &q_e, &data, 0);
638 /* send the data on \PIPE\ */
639 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_ALIASES, &data, &rdata))
641 SAMR_R_ENUM_DOM_ALIASES r_e;
644 samr_io_r_enum_dom_aliases("", &r_e, &rdata, 0);
646 p = rdata.offset != 0;
647 if (p && r_e.status != 0)
649 /* report error code */
650 DEBUG(0,("SAMR_R_ENUM_DOM_ALIASES: %s\n", get_nt_error_msg(r_e.status)));
659 *num_sam_aliases = r_e.num_entries2;
660 if (*num_sam_aliases > MAX_SAM_ENTRIES)
662 *num_sam_aliases = MAX_SAM_ENTRIES;
663 DEBUG(2,("samr_enum_dom_aliases: sam user entries limited to %d\n",
667 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_aliases));
671 *num_sam_aliases = 0;
674 for (i = 0; i < *num_sam_aliases; i++)
676 (*sam)[i].rid = r_e.sam[i].rid;
677 (*sam)[i].acct_name[0] = 0;
678 (*sam)[i].acct_desc[0] = 0;
679 if (r_e.sam[i].hdr_name.buffer)
681 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
684 DEBUG(5,("samr_enum_dom_aliases: idx: %4d rid: %8x acct: %s\n",
685 i, (*sam)[i].rid, (*sam)[i].acct_name));
691 prs_mem_free(&data );
692 prs_mem_free(&rdata );
697 /****************************************************************************
698 do a SAMR enumerate users
699 ****************************************************************************/
700 BOOL samr_enum_dom_users(struct cli_state *cli, uint16 fnum,
701 POLICY_HND *pol, uint32 start_idx,
702 uint16 acb_mask, uint16 unk_1, uint32 size,
703 struct acct_info **sam,
709 SAMR_Q_ENUM_DOM_USERS q_e;
710 BOOL valid_pol = False;
712 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
714 if (pol == NULL || num_sam_users == NULL) return False;
716 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
718 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
719 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
721 /* store the parameters */
722 make_samr_q_enum_dom_users(&q_e, pol, start_idx, acb_mask, unk_1, size);
724 /* turn parameters into data stream */
725 samr_io_q_enum_dom_users("", &q_e, &data, 0);
727 /* send the data on \PIPE\ */
728 if (rpc_api_pipe_req(cli, fnum, SAMR_ENUM_DOM_USERS, &data, &rdata))
730 SAMR_R_ENUM_DOM_USERS r_e;
733 samr_io_r_enum_dom_users("", &r_e, &rdata, 0);
735 p = rdata.offset != 0;
736 if (p && r_e.status != 0)
738 /* report error code */
739 DEBUG(0,("SAMR_R_ENUM_DOM_USERS: %s\n", get_nt_error_msg(r_e.status)));
748 *num_sam_users = r_e.num_entries2;
749 if (*num_sam_users > MAX_SAM_ENTRIES)
751 *num_sam_users = MAX_SAM_ENTRIES;
752 DEBUG(2,("samr_enum_dom_users: sam user entries limited to %d\n",
756 *sam = (struct acct_info*) malloc(sizeof(struct acct_info) * (*num_sam_users));
763 for (i = 0; i < *num_sam_users; i++)
765 (*sam)[i].rid = r_e.sam[i].rid;
766 (*sam)[i].acct_name[0] = 0;
767 (*sam)[i].acct_desc[0] = 0;
768 if (r_e.sam[i].hdr_name.buffer)
770 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_acct_name[name_idx], sizeof((*sam)[i].acct_name)-1);
773 DEBUG(5,("samr_enum_dom_users: idx: %4d rid: %8x acct: %s\n",
774 i, (*sam)[i].rid, (*sam)[i].acct_name));
780 prs_mem_free(&data );
781 prs_mem_free(&rdata );
786 /****************************************************************************
788 ****************************************************************************/
789 BOOL samr_connect(struct cli_state *cli, uint16 fnum,
790 char *srv_name, uint32 unknown_0,
791 POLICY_HND *connect_pol)
797 BOOL valid_pol = False;
799 DEBUG(4,("SAMR Open Policy server:%s undoc value:%x\n",
800 srv_name, unknown_0));
802 if (srv_name == NULL || connect_pol == NULL) return False;
804 /* create and send a MSRPC command with api SAMR_CONNECT */
806 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
807 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
809 /* store the parameters */
810 make_samr_q_connect(&q_o, srv_name, unknown_0);
812 /* turn parameters into data stream */
813 samr_io_q_connect("", &q_o, &data, 0);
815 /* send the data on \PIPE\ */
816 if (rpc_api_pipe_req(cli, fnum, SAMR_CONNECT, &data, &rdata))
821 samr_io_r_connect("", &r_o, &rdata, 0);
822 p = rdata.offset != 0;
824 if (p && r_o.status != 0)
826 /* report error code */
827 DEBUG(0,("SAMR_R_CONNECT: %s\n", get_nt_error_msg(r_o.status)));
833 memcpy(connect_pol, &r_o.connect_pol, sizeof(r_o.connect_pol));
838 prs_mem_free(&data );
839 prs_mem_free(&rdata );
844 /****************************************************************************
846 ****************************************************************************/
847 BOOL samr_open_user(struct cli_state *cli, uint16 fnum,
848 POLICY_HND *pol, uint32 unk_0, uint32 rid,
849 POLICY_HND *user_pol)
854 SAMR_Q_OPEN_USER q_o;
855 BOOL valid_pol = False;
857 DEBUG(4,("SAMR Open User. unk_0: %08x RID:%x\n",
860 if (pol == NULL || user_pol == NULL) return False;
862 /* create and send a MSRPC command with api SAMR_OPEN_USER */
864 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
865 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
867 /* store the parameters */
868 make_samr_q_open_user(&q_o, pol, unk_0, rid);
870 /* turn parameters into data stream */
871 samr_io_q_open_user("", &q_o, &data, 0);
873 /* send the data on \PIPE\ */
874 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_USER, &data, &rdata))
876 SAMR_R_OPEN_USER r_o;
879 samr_io_r_open_user("", &r_o, &rdata, 0);
880 p = rdata.offset != 0;
882 if (p && r_o.status != 0)
884 /* report error code */
885 DEBUG(0,("SAMR_R_OPEN_USER: %s\n", get_nt_error_msg(r_o.status)));
891 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
896 prs_mem_free(&data );
897 prs_mem_free(&rdata );
902 /****************************************************************************
904 ****************************************************************************/
905 BOOL samr_open_alias(struct cli_state *cli, uint16 fnum,
906 POLICY_HND *domain_pol,
907 uint32 flags, uint32 rid,
908 POLICY_HND *alias_pol)
913 SAMR_Q_OPEN_ALIAS q_o;
914 BOOL valid_pol = False;
916 DEBUG(4,("SAMR Open Alias. RID:%x\n", rid));
918 if (alias_pol == NULL || domain_pol == NULL) return False;
920 /* create and send a MSRPC command with api SAMR_OPEN_ALIAS */
922 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
923 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
925 /* store the parameters */
926 make_samr_q_open_alias(&q_o, domain_pol, flags, rid);
928 /* turn parameters into data stream */
929 samr_io_q_open_alias("", &q_o, &data, 0);
931 /* send the data on \PIPE\ */
932 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_ALIAS, &data, &rdata))
934 SAMR_R_OPEN_ALIAS r_o;
937 samr_io_r_open_alias("", &r_o, &rdata, 0);
938 p = rdata.offset != 0;
940 if (p && r_o.status != 0)
942 /* report error code */
943 DEBUG(0,("SAMR_R_OPEN_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
949 memcpy(alias_pol, &r_o.pol, sizeof(r_o.pol));
954 prs_mem_free(&data );
955 prs_mem_free(&rdata );
960 /****************************************************************************
961 do a SAMR Delete Alias Member
962 ****************************************************************************/
963 BOOL samr_del_aliasmem(struct cli_state *cli, uint16 fnum,
964 POLICY_HND *alias_pol, DOM_SID *sid)
969 SAMR_Q_DEL_ALIASMEM q_o;
970 BOOL valid_pol = False;
972 if (alias_pol == NULL || sid == NULL) return False;
974 /* create and send a MSRPC command with api SAMR_DEL_ALIASMEM */
976 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
977 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
979 DEBUG(4,("SAMR Delete Alias Member.\n"));
981 /* store the parameters */
982 make_samr_q_del_aliasmem(&q_o, alias_pol, sid);
984 /* turn parameters into data stream */
985 samr_io_q_del_aliasmem("", &q_o, &data, 0);
987 /* send the data on \PIPE\ */
988 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_ALIASMEM, &data, &rdata))
990 SAMR_R_DEL_ALIASMEM r_o;
993 samr_io_r_del_aliasmem("", &r_o, &rdata, 0);
994 p = rdata.offset != 0;
996 if (p && r_o.status != 0)
998 /* report error code */
999 DEBUG(0,("SAMR_R_DEL_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1009 prs_mem_free(&data );
1010 prs_mem_free(&rdata );
1015 /****************************************************************************
1016 do a SAMR Add Alias Member
1017 ****************************************************************************/
1018 BOOL samr_add_aliasmem(struct cli_state *cli, uint16 fnum,
1019 POLICY_HND *alias_pol, DOM_SID *sid)
1024 SAMR_Q_ADD_ALIASMEM q_o;
1025 BOOL valid_pol = False;
1027 if (alias_pol == NULL || sid == NULL) return False;
1029 /* create and send a MSRPC command with api SAMR_ADD_ALIASMEM */
1031 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1032 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1034 DEBUG(4,("SAMR Add Alias Member.\n"));
1036 /* store the parameters */
1037 make_samr_q_add_aliasmem(&q_o, alias_pol, sid);
1039 /* turn parameters into data stream */
1040 samr_io_q_add_aliasmem("", &q_o, &data, 0);
1042 /* send the data on \PIPE\ */
1043 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_ALIASMEM, &data, &rdata))
1045 SAMR_R_ADD_ALIASMEM r_o;
1048 samr_io_r_add_aliasmem("", &r_o, &rdata, 0);
1049 p = rdata.offset != 0;
1051 if (p && r_o.status != 0)
1053 /* report error code */
1054 DEBUG(0,("SAMR_R_ADD_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1064 prs_mem_free(&data );
1065 prs_mem_free(&rdata );
1070 /****************************************************************************
1071 do a SAMR Delete Domain Alias
1072 ****************************************************************************/
1073 BOOL samr_delete_dom_alias(struct cli_state *cli, uint16 fnum,
1074 POLICY_HND *alias_pol)
1079 SAMR_Q_DELETE_DOM_ALIAS q_o;
1080 BOOL valid_pol = False;
1082 if (alias_pol == NULL) return False;
1084 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_ALIAS */
1086 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1087 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1089 DEBUG(4,("SAMR Delete Domain Alias.\n"));
1091 /* store the parameters */
1092 make_samr_q_delete_dom_alias(&q_o, alias_pol);
1094 /* turn parameters into data stream */
1095 samr_io_q_delete_dom_alias("", &q_o, &data, 0);
1097 /* send the data on \PIPE\ */
1098 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_ALIAS, &data, &rdata))
1100 SAMR_R_DELETE_DOM_ALIAS r_o;
1103 samr_io_r_delete_dom_alias("", &r_o, &rdata, 0);
1104 p = rdata.offset != 0;
1106 if (p && r_o.status != 0)
1108 /* report error code */
1109 DEBUG(0,("SAMR_R_DELETE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1119 prs_mem_free(&data );
1120 prs_mem_free(&rdata );
1125 /****************************************************************************
1126 do a SAMR Create Domain Alias
1127 ****************************************************************************/
1128 BOOL samr_create_dom_alias(struct cli_state *cli, uint16 fnum,
1129 POLICY_HND *domain_pol, const char *acct_name,
1130 POLICY_HND *alias_pol, uint32 *rid)
1135 SAMR_Q_CREATE_DOM_ALIAS q_o;
1136 BOOL valid_pol = False;
1138 if (alias_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1140 /* create and send a MSRPC command with api SAMR_CREATE_DOM_ALIAS */
1142 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1143 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1145 DEBUG(4,("SAMR Create Domain Alias. Name:%s\n", acct_name));
1147 /* store the parameters */
1148 make_samr_q_create_dom_alias(&q_o, domain_pol, acct_name);
1150 /* turn parameters into data stream */
1151 samr_io_q_create_dom_alias("", &q_o, &data, 0);
1153 /* send the data on \PIPE\ */
1154 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_ALIAS, &data, &rdata))
1156 SAMR_R_CREATE_DOM_ALIAS r_o;
1159 samr_io_r_create_dom_alias("", &r_o, &rdata, 0);
1160 p = rdata.offset != 0;
1162 if (p && r_o.status != 0)
1164 /* report error code */
1165 DEBUG(0,("SAMR_R_CREATE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1171 memcpy(alias_pol, &r_o.alias_pol, sizeof(r_o.alias_pol));
1177 prs_mem_free(&data );
1178 prs_mem_free(&rdata );
1183 /****************************************************************************
1184 do a SAMR Set Alias Info
1185 ****************************************************************************/
1186 BOOL samr_set_aliasinfo(struct cli_state *cli, uint16 fnum,
1187 POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1192 SAMR_Q_SET_ALIASINFO q_o;
1193 BOOL valid_pol = False;
1195 if (alias_pol == NULL || ctr == NULL) return False;
1197 /* create and send a MSRPC command with api SAMR_SET_ALIASINFO */
1199 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1200 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1202 DEBUG(4,("SAMR Set Alias Info\n"));
1204 /* store the parameters */
1205 make_samr_q_set_aliasinfo(&q_o, alias_pol, ctr);
1207 /* turn parameters into data stream */
1208 samr_io_q_set_aliasinfo("", &q_o, &data, 0);
1210 /* send the data on \PIPE\ */
1211 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_ALIASINFO, &data, &rdata))
1213 SAMR_R_SET_ALIASINFO r_o;
1216 samr_io_r_set_aliasinfo("", &r_o, &rdata, 0);
1217 p = rdata.offset != 0;
1219 if (p && r_o.status != 0)
1221 /* report error code */
1222 DEBUG(0,("SAMR_R_SET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1232 prs_mem_free(&data );
1233 prs_mem_free(&rdata );
1238 /****************************************************************************
1239 do a SAMR Open Group
1240 ****************************************************************************/
1241 BOOL samr_open_group(struct cli_state *cli, uint16 fnum,
1242 POLICY_HND *domain_pol,
1243 uint32 flags, uint32 rid,
1244 POLICY_HND *group_pol)
1249 SAMR_Q_OPEN_GROUP q_o;
1250 BOOL valid_pol = False;
1252 DEBUG(4,("SAMR Open Group. RID:%x\n", rid));
1254 if (group_pol == NULL || domain_pol == NULL) return False;
1256 /* create and send a MSRPC command with api SAMR_OPEN_GROUP */
1258 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1259 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1261 /* store the parameters */
1262 make_samr_q_open_group(&q_o, domain_pol, flags, rid);
1264 /* turn parameters into data stream */
1265 samr_io_q_open_group("", &q_o, &data, 0);
1267 /* send the data on \PIPE\ */
1268 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_GROUP, &data, &rdata))
1270 SAMR_R_OPEN_GROUP r_o;
1273 samr_io_r_open_group("", &r_o, &rdata, 0);
1274 p = rdata.offset != 0;
1276 if (p && r_o.status != 0)
1278 /* report error code */
1279 DEBUG(0,("SAMR_R_OPEN_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1285 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1290 prs_mem_free(&data );
1291 prs_mem_free(&rdata );
1296 /****************************************************************************
1297 do a SAMR Delete Group Member
1298 ****************************************************************************/
1299 BOOL samr_del_groupmem(struct cli_state *cli, uint16 fnum,
1300 POLICY_HND *group_pol, uint32 rid)
1305 SAMR_Q_DEL_GROUPMEM q_o;
1306 BOOL valid_pol = False;
1308 if (group_pol == NULL) return False;
1310 /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */
1312 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1313 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1315 DEBUG(4,("SAMR Delete Group Member.\n"));
1317 /* store the parameters */
1318 make_samr_q_del_groupmem(&q_o, group_pol, rid);
1320 /* turn parameters into data stream */
1321 samr_io_q_del_groupmem("", &q_o, &data, 0);
1323 /* send the data on \PIPE\ */
1324 if (rpc_api_pipe_req(cli, fnum, SAMR_DEL_GROUPMEM, &data, &rdata))
1326 SAMR_R_DEL_GROUPMEM r_o;
1329 samr_io_r_del_groupmem("", &r_o, &rdata, 0);
1330 p = rdata.offset != 0;
1332 if (p && r_o.status != 0)
1334 /* report error code */
1335 DEBUG(0,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1345 prs_mem_free(&data );
1346 prs_mem_free(&rdata );
1351 /****************************************************************************
1352 do a SAMR Add Group Member
1353 ****************************************************************************/
1354 BOOL samr_add_groupmem(struct cli_state *cli, uint16 fnum,
1355 POLICY_HND *group_pol, uint32 rid)
1360 SAMR_Q_ADD_GROUPMEM q_o;
1361 BOOL valid_pol = False;
1363 if (group_pol == NULL) return False;
1365 /* create and send a MSRPC command with api SAMR_ADD_GROUPMEM */
1367 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1368 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1370 DEBUG(4,("SAMR Add Group Member.\n"));
1372 /* store the parameters */
1373 make_samr_q_add_groupmem(&q_o, group_pol, rid);
1375 /* turn parameters into data stream */
1376 samr_io_q_add_groupmem("", &q_o, &data, 0);
1378 /* send the data on \PIPE\ */
1379 if (rpc_api_pipe_req(cli, fnum, SAMR_ADD_GROUPMEM, &data, &rdata))
1381 SAMR_R_ADD_GROUPMEM r_o;
1384 samr_io_r_add_groupmem("", &r_o, &rdata, 0);
1385 p = rdata.offset != 0;
1387 if (p && r_o.status != 0)
1389 /* report error code */
1390 DEBUG(0,("SAMR_R_ADD_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1400 prs_mem_free(&data );
1401 prs_mem_free(&rdata );
1406 /****************************************************************************
1407 do a SAMR Delete Domain Group
1408 ****************************************************************************/
1409 BOOL samr_delete_dom_group(struct cli_state *cli, uint16 fnum, POLICY_HND *group_pol)
1414 SAMR_Q_DELETE_DOM_GROUP q_o;
1415 BOOL valid_pol = False;
1417 if (group_pol == NULL) return False;
1419 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */
1421 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1422 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1424 DEBUG(4,("SAMR Delete Domain Group.\n"));
1426 /* store the parameters */
1427 make_samr_q_delete_dom_group(&q_o, group_pol);
1429 /* turn parameters into data stream */
1430 samr_io_q_delete_dom_group("", &q_o, &data, 0);
1432 /* send the data on \PIPE\ */
1433 if (rpc_api_pipe_req(cli, fnum, SAMR_DELETE_DOM_GROUP, &data, &rdata))
1435 SAMR_R_DELETE_DOM_GROUP r_o;
1438 samr_io_r_delete_dom_group("", &r_o, &rdata, 0);
1439 p = rdata.offset != 0;
1441 if (p && r_o.status != 0)
1443 /* report error code */
1444 DEBUG(0,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1454 prs_mem_free(&data );
1455 prs_mem_free(&rdata );
1460 /****************************************************************************
1461 do a SAMR Create Domain Group
1462 ****************************************************************************/
1463 BOOL samr_create_dom_group(struct cli_state *cli, uint16 fnum,
1464 POLICY_HND *domain_pol, const char *acct_name,
1465 POLICY_HND *group_pol, uint32 *rid)
1470 SAMR_Q_CREATE_DOM_GROUP q_o;
1471 BOOL valid_pol = False;
1473 if (group_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1475 /* create and send a MSRPC command with api SAMR_CREATE_DOM_GROUP */
1477 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1478 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1480 DEBUG(4,("SAMR Create Domain Group. Name:%s\n", acct_name));
1482 /* store the parameters */
1483 make_samr_q_create_dom_group(&q_o, domain_pol, acct_name);
1485 /* turn parameters into data stream */
1486 samr_io_q_create_dom_group("", &q_o, &data, 0);
1488 /* send the data on \PIPE\ */
1489 if (rpc_api_pipe_req(cli, fnum, SAMR_CREATE_DOM_GROUP, &data, &rdata))
1491 SAMR_R_CREATE_DOM_GROUP r_o;
1494 samr_io_r_create_dom_group("", &r_o, &rdata, 0);
1495 p = rdata.offset != 0;
1497 if (p && r_o.status != 0)
1499 /* report error code */
1500 DEBUG(0,("SAMR_R_CREATE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1506 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1512 prs_mem_free(&data );
1513 prs_mem_free(&rdata );
1518 /****************************************************************************
1519 do a SAMR Set Group Info
1520 ****************************************************************************/
1521 BOOL samr_set_groupinfo(struct cli_state *cli, uint16 fnum,
1522 POLICY_HND *group_pol, GROUP_INFO_CTR *ctr)
1527 SAMR_Q_SET_GROUPINFO q_o;
1528 BOOL valid_pol = False;
1530 if (group_pol == NULL || ctr == NULL) return False;
1532 /* create and send a MSRPC command with api SAMR_SET_GROUPINFO */
1534 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1535 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1537 DEBUG(4,("SAMR Set Group Info\n"));
1539 /* store the parameters */
1540 make_samr_q_set_groupinfo(&q_o, group_pol, ctr);
1542 /* turn parameters into data stream */
1543 samr_io_q_set_groupinfo("", &q_o, &data, 0);
1545 /* send the data on \PIPE\ */
1546 if (rpc_api_pipe_req(cli, fnum, SAMR_SET_GROUPINFO, &data, &rdata))
1548 SAMR_R_SET_GROUPINFO r_o;
1551 samr_io_r_set_groupinfo("", &r_o, &rdata, 0);
1552 p = rdata.offset != 0;
1554 if (p && r_o.status != 0)
1556 /* report error code */
1557 DEBUG(0,("SAMR_R_SET_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
1567 prs_mem_free(&data );
1568 prs_mem_free(&rdata );
1573 /****************************************************************************
1574 do a SAMR Open Domain
1575 ****************************************************************************/
1576 BOOL samr_open_domain(struct cli_state *cli, uint16 fnum,
1577 POLICY_HND *connect_pol, uint32 flags, DOM_SID *sid,
1578 POLICY_HND *domain_pol)
1584 SAMR_Q_OPEN_DOMAIN q_o;
1585 BOOL valid_pol = False;
1587 sid_to_string(sid_str, sid);
1588 DEBUG(4,("SAMR Open Domain. SID:%s Flags:%x\n", sid_str, flags));
1590 if (connect_pol == NULL || sid == NULL || domain_pol == NULL) return False;
1592 /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
1594 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1595 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1597 /* store the parameters */
1598 make_samr_q_open_domain(&q_o, connect_pol, flags, sid);
1600 /* turn parameters into data stream */
1601 samr_io_q_open_domain("", &q_o, &data, 0);
1603 /* send the data on \PIPE\ */
1604 if (rpc_api_pipe_req(cli, fnum, SAMR_OPEN_DOMAIN, &data, &rdata))
1606 SAMR_R_OPEN_DOMAIN r_o;
1609 samr_io_r_open_domain("", &r_o, &rdata, 0);
1610 p = rdata.offset != 0;
1612 if (p && r_o.status != 0)
1614 /* report error code */
1615 DEBUG(0,("SAMR_R_OPEN_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1621 memcpy(domain_pol, &r_o.domain_pol, sizeof(r_o.domain_pol));
1626 prs_mem_free(&data );
1627 prs_mem_free(&rdata );
1632 /****************************************************************************
1633 do a SAMR Query Lookup Names
1634 ****************************************************************************/
1635 BOOL samr_query_lookup_names(struct cli_state *cli, uint16 fnum,
1636 POLICY_HND *pol, uint32 flags,
1637 uint32 num_names, const char **names,
1639 uint32 rid[MAX_LOOKUP_SIDS],
1640 uint32 type[MAX_LOOKUP_SIDS])
1645 SAMR_Q_LOOKUP_NAMES q_o;
1646 BOOL valid_query = False;
1648 if (pol == NULL || flags == 0 || num_names == 0 || names == NULL ||
1649 num_rids == NULL || rid == NULL || type == NULL ) return False;
1651 /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */
1653 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1654 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1656 DEBUG(4,("SAMR Query Lookup NAMES.\n"));
1658 /* store the parameters */
1659 make_samr_q_lookup_names(&q_o, pol, flags, num_names, names);
1661 /* turn parameters into data stream */
1662 samr_io_q_lookup_names("", &q_o, &data, 0);
1664 /* send the data on \PIPE\ */
1665 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_NAMES, &data, &rdata))
1667 SAMR_R_LOOKUP_NAMES r_o;
1670 samr_io_r_lookup_names("", &r_o, &rdata, 0);
1671 p = rdata.offset != 0;
1673 if (p && r_o.status != 0)
1675 /* report error code */
1676 DEBUG(0,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status)));
1682 if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 &&
1683 r_o.num_types1 == r_o.num_rids1)
1688 *num_rids = r_o.num_rids1;
1690 for (i = 0; i < r_o.num_rids1; i++)
1692 rid[i] = r_o.rid[i];
1694 for (i = 0; i < r_o.num_types1; i++)
1696 type[i] = r_o.type[i];
1699 else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0)
1711 prs_mem_free(&data );
1712 prs_mem_free(&rdata );
1717 /****************************************************************************
1718 do a SAMR Query Lookup RIDS
1719 ****************************************************************************/
1720 BOOL samr_query_lookup_rids(struct cli_state *cli, uint16 fnum,
1721 POLICY_HND *pol, uint32 flags,
1722 uint32 num_rids, uint32 *rids,
1724 fstring names[MAX_LOOKUP_SIDS],
1725 uint32 type [MAX_LOOKUP_SIDS])
1730 SAMR_Q_LOOKUP_RIDS q_o;
1731 BOOL valid_query = False;
1733 if (pol == NULL || flags == 0 || num_rids == 0 || rids == NULL ||
1734 num_names == NULL || names == NULL || type == NULL ) return False;
1736 /* create and send a MSRPC command with api SAMR_LOOKUP_RIDS */
1738 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1739 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1741 DEBUG(4,("SAMR Query Lookup RIDs.\n"));
1743 /* store the parameters */
1744 make_samr_q_lookup_rids(&q_o, pol, flags, num_rids, rids);
1746 /* turn parameters into data stream */
1747 samr_io_q_lookup_rids("", &q_o, &data, 0);
1749 /* send the data on \PIPE\ */
1750 if (rpc_api_pipe_req(cli, fnum, SAMR_LOOKUP_RIDS, &data, &rdata))
1752 SAMR_R_LOOKUP_RIDS r_o;
1755 samr_io_r_lookup_rids("", &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_RIDS: %s\n", get_nt_error_msg(r_o.status)));
1767 if (r_o.ptr_names != 0 && r_o.ptr_types != 0 &&
1768 r_o.num_types1 == r_o.num_names1)
1773 *num_names = r_o.num_names1;
1775 for (i = 0; i < r_o.num_names1; i++)
1777 unistr2_to_ascii(names[i], &r_o.uni_name[i], sizeof(fstring)-1);
1779 for (i = 0; i < r_o.num_types1; i++)
1781 type[i] = r_o.type[i];
1784 else if (r_o.ptr_names == 0 && r_o.ptr_types == 0)
1796 prs_mem_free(&data );
1797 prs_mem_free(&rdata );
1802 /****************************************************************************
1803 do a SAMR Query Alias Members
1804 ****************************************************************************/
1805 BOOL samr_query_aliasmem(struct cli_state *cli, uint16 fnum,
1806 POLICY_HND *alias_pol,
1807 uint32 *num_mem, DOM_SID2 *sid)
1812 SAMR_Q_QUERY_ALIASMEM q_o;
1813 BOOL valid_query = False;
1815 DEBUG(4,("SAMR Query Alias Members.\n"));
1817 if (alias_pol == NULL || sid == NULL || num_mem == NULL) return False;
1819 /* create and send a MSRPC command with api SAMR_QUERY_ALIASMEM */
1821 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1822 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1824 /* store the parameters */
1825 make_samr_q_query_aliasmem(&q_o, alias_pol);
1827 /* turn parameters into data stream */
1828 samr_io_q_query_aliasmem("", &q_o, &data, 0);
1830 /* send the data on \PIPE\ */
1831 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_ALIASMEM, &data, &rdata))
1833 SAMR_R_QUERY_ALIASMEM r_o;
1839 samr_io_r_query_aliasmem("", &r_o, &rdata, 0);
1840 p = rdata.offset != 0;
1842 if (p && r_o.status != 0)
1844 /* report error code */
1845 DEBUG(0,("SAMR_R_QUERY_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1849 if (p && r_o.ptr != 0)
1852 *num_mem = r_o.num_sids;
1857 prs_mem_free(&data );
1858 prs_mem_free(&rdata );
1863 /****************************************************************************
1864 do a SAMR Query User Aliases
1865 ****************************************************************************/
1866 BOOL samr_query_useraliases(struct cli_state *cli, uint16 fnum,
1867 POLICY_HND *pol, DOM_SID *sid,
1868 uint32 *num_aliases, uint32 *rid)
1873 SAMR_Q_QUERY_USERALIASES q_o;
1874 BOOL valid_query = False;
1876 DEBUG(4,("SAMR Query User Aliases.\n"));
1878 if (pol == NULL || sid == NULL || rid == NULL || num_aliases == 0) return False;
1880 /* create and send a MSRPC command with api SAMR_QUERY_USERALIASES */
1882 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1883 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1885 /* store the parameters */
1886 make_samr_q_query_useraliases(&q_o, pol, sid);
1888 /* turn parameters into data stream */
1889 samr_io_q_query_useraliases("", &q_o, &data, 0);
1891 /* send the data on \PIPE\ */
1892 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERALIASES, &data, &rdata))
1894 SAMR_R_QUERY_USERALIASES r_o;
1900 samr_io_r_query_useraliases("", &r_o, &rdata, 0);
1901 p = rdata.offset != 0;
1903 if (p && r_o.status != 0)
1905 /* report error code */
1906 DEBUG(0,("SAMR_R_QUERY_USERALIASES: %s\n", get_nt_error_msg(r_o.status)));
1910 if (p && r_o.ptr != 0)
1913 *num_aliases = r_o.num_entries;
1918 prs_mem_free(&data );
1919 prs_mem_free(&rdata );
1924 /****************************************************************************
1925 do a SAMR Query Group Members
1926 ****************************************************************************/
1927 BOOL samr_query_groupmem(struct cli_state *cli, uint16 fnum,
1928 POLICY_HND *group_pol,
1929 uint32 *num_mem, uint32 *rid, uint32 *attr)
1934 SAMR_Q_QUERY_GROUPMEM q_o;
1935 BOOL valid_query = False;
1937 DEBUG(4,("SAMR Query Group Members.\n"));
1939 if (group_pol == NULL || rid == NULL || attr == NULL || num_mem == NULL) return False;
1941 /* create and send a MSRPC command with api SAMR_QUERY_GROUPMEM */
1943 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1944 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1946 /* store the parameters */
1947 make_samr_q_query_groupmem(&q_o, group_pol);
1949 /* turn parameters into data stream */
1950 samr_io_q_query_groupmem("", &q_o, &data, 0);
1952 /* send the data on \PIPE\ */
1953 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPMEM, &data, &rdata))
1955 SAMR_R_QUERY_GROUPMEM r_o;
1962 samr_io_r_query_groupmem("", &r_o, &rdata, 0);
1963 p = rdata.offset != 0;
1965 if (p && r_o.status != 0)
1967 /* report error code */
1968 DEBUG(0,("SAMR_R_QUERY_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1972 if (p && r_o.ptr != 0 &&
1973 r_o.ptr_rids != 0 && r_o.ptr_attrs != 0 &&
1974 r_o.num_rids == r_o.num_attrs)
1977 *num_mem = r_o.num_rids;
1982 prs_mem_free(&data );
1983 prs_mem_free(&rdata );
1988 /****************************************************************************
1989 do a SAMR Query User Groups
1990 ****************************************************************************/
1991 BOOL samr_query_usergroups(struct cli_state *cli, uint16 fnum,
1992 POLICY_HND *pol, uint32 *num_groups, DOM_GID *gid)
1997 SAMR_Q_QUERY_USERGROUPS q_o;
1998 BOOL valid_query = False;
2000 DEBUG(4,("SAMR Query User Groups.\n"));
2002 if (pol == NULL || gid == NULL || num_groups == 0) return False;
2004 /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
2006 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2007 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2009 /* store the parameters */
2010 make_samr_q_query_usergroups(&q_o, pol);
2012 /* turn parameters into data stream */
2013 samr_io_q_query_usergroups("", &q_o, &data, 0);
2015 /* send the data on \PIPE\ */
2016 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERGROUPS, &data, &rdata))
2018 SAMR_R_QUERY_USERGROUPS r_o;
2024 samr_io_r_query_usergroups("", &r_o, &rdata, 0);
2025 p = rdata.offset != 0;
2027 if (p && r_o.status != 0)
2029 /* report error code */
2030 DEBUG(0,("SAMR_R_QUERY_USERGROUPS: %s\n", get_nt_error_msg(r_o.status)));
2034 if (p && r_o.ptr_0 != 0)
2037 *num_groups = r_o.num_entries;
2042 prs_mem_free(&data );
2043 prs_mem_free(&rdata );
2048 /****************************************************************************
2049 do a SAMR Query Group Info
2050 ****************************************************************************/
2051 BOOL samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
2053 uint16 switch_value, GROUP_INFO_CTR* ctr)
2058 SAMR_Q_QUERY_GROUPINFO q_o;
2059 BOOL valid_query = False;
2061 DEBUG(4,("SAMR Query Group Info. level: %d\n", switch_value));
2063 if (pol == NULL || ctr == NULL || switch_value == 0) return False;
2065 /* create and send a MSRPC command with api SAMR_QUERY_GROUPINFO */
2067 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2068 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2070 /* store the parameters */
2071 make_samr_q_query_groupinfo(&q_o, pol, switch_value);
2073 /* turn parameters into data stream */
2074 samr_io_q_query_groupinfo("", &q_o, &data, 0);
2076 /* send the data on \PIPE\ */
2077 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_GROUPINFO, &data, &rdata))
2079 SAMR_R_QUERY_GROUPINFO r_o;
2085 samr_io_r_query_groupinfo("", &r_o, &rdata, 0);
2086 p = rdata.offset != 0;
2088 if (p && r_o.status != 0)
2090 /* report error code */
2091 DEBUG(0,("SAMR_R_QUERY_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
2095 if (p && r_o.ctr->switch_value1 != switch_value)
2097 DEBUG(0,("SAMR_R_QUERY_GROUPINFO: received incorrect level %d\n",
2098 r_o.ctr->switch_value1));
2101 if (p && r_o.ptr != 0)
2107 prs_mem_free(&data );
2108 prs_mem_free(&rdata );
2113 /****************************************************************************
2114 do a SAMR Query User Info
2115 ****************************************************************************/
2116 BOOL samr_query_userinfo(struct cli_state *cli, uint16 fnum,
2117 POLICY_HND *pol, uint16 switch_value, void* usr)
2122 SAMR_Q_QUERY_USERINFO q_o;
2123 BOOL valid_query = False;
2125 DEBUG(4,("SAMR Query User Info. level: %d\n", switch_value));
2127 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2129 /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
2131 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2132 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2134 /* store the parameters */
2135 make_samr_q_query_userinfo(&q_o, pol, switch_value);
2137 /* turn parameters into data stream */
2138 samr_io_q_query_userinfo("", &q_o, &data, 0);
2140 /* send the data on \PIPE\ */
2141 if (rpc_api_pipe_req(cli, fnum, SAMR_QUERY_USERINFO, &data, &rdata))
2143 SAMR_R_QUERY_USERINFO r_o;
2149 samr_io_r_query_userinfo("", &r_o, &rdata, 0);
2150 p = rdata.offset != 0;
2152 if (p && r_o.status != 0)
2154 /* report error code */
2155 DEBUG(0,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2159 if (p && r_o.switch_value != switch_value)
2161 DEBUG(0,("SAMR_R_QUERY_USERINFO: received incorrect level %d\n",
2165 if (p && r_o.ptr != 0)
2171 prs_mem_free(&data );
2172 prs_mem_free(&rdata );
2177 /****************************************************************************
2179 ****************************************************************************/
2180 BOOL samr_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
2185 SAMR_Q_CLOSE_HND q_c;
2186 BOOL valid_close = False;
2188 DEBUG(4,("SAMR Close\n"));
2190 if (hnd == NULL) return False;
2192 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2193 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2195 /* create and send a MSRPC command with api SAMR_CLOSE_HND */
2197 /* store the parameters */
2198 make_samr_q_close_hnd(&q_c, hnd);
2200 /* turn parameters into data stream */
2201 samr_io_q_close_hnd("", &q_c, &data, 0);
2203 /* send the data on \PIPE\ */
2204 if (rpc_api_pipe_req(cli, fnum, SAMR_CLOSE_HND, &data, &rdata))
2206 SAMR_R_CLOSE_HND r_c;
2209 samr_io_r_close_hnd("", &r_c, &rdata, 0);
2210 p = rdata.offset != 0;
2212 if (p && r_c.status != 0)
2214 /* report error code */
2215 DEBUG(0,("SAMR_CLOSE_HND: %s\n", get_nt_error_msg(r_c.status)));
2221 /* check that the returned policy handle is all zeros */
2225 for (i = 0; i < sizeof(r_c.pol.data); i++)
2227 if (r_c.pol.data[i] != 0)
2229 valid_close = False;
2235 DEBUG(0,("SAMR_CLOSE_HND: non-zero handle returned\n"));
2240 prs_mem_free(&data );
2241 prs_mem_free(&rdata );