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;
34 /****************************************************************************
35 do a SAMR change user password command
36 ****************************************************************************/
37 BOOL samr_chgpasswd_user( struct cli_connection *con,
38 char *srv_name, char *user_name,
39 char nt_newpass[516], uchar nt_oldhash[16],
40 char lm_newpass[516], uchar lm_oldhash[16])
45 SAMR_Q_CHGPASSWD_USER q_e;
46 BOOL valid_pwc = False;
48 /* create and send a MSRPC command with api SAMR_CHGPASSWD_USER */
50 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
51 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
53 DEBUG(4,("SAMR Change User Password. server:%s username:%s\n",
54 srv_name, user_name));
56 make_samr_q_chgpasswd_user(&q_e, srv_name, user_name,
57 nt_newpass, nt_oldhash,
58 lm_newpass, lm_oldhash);
60 /* turn parameters into data stream */
61 samr_io_q_chgpasswd_user("", &q_e, &data, 0);
63 /* send the data on \PIPE\ */
64 if (rpc_con_pipe_req(con, SAMR_CHGPASSWD_USER, &data, &rdata))
66 SAMR_R_CHGPASSWD_USER r_e;
69 samr_io_r_chgpasswd_user("", &r_e, &rdata, 0);
71 p = rdata.offset != 0;
72 if (p && r_e.status != 0)
74 /* report error code */
75 DEBUG(4,("SAMR_R_CHGPASSWD_USER: %s\n", get_nt_error_msg(r_e.status)));
86 prs_mem_free(&rdata );
88 cli_connection_unlink(con);
94 /****************************************************************************
95 do a SAMR unknown 0x38 command
96 ****************************************************************************/
97 BOOL samr_unknown_38(struct cli_connection *con, char *srv_name)
102 SAMR_Q_UNKNOWN_38 q_e;
103 BOOL valid_un8 = False;
105 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
107 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
108 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
110 DEBUG(4,("SAMR Unknown 38 server:%s\n", srv_name));
112 make_samr_q_unknown_38(&q_e, srv_name);
114 /* turn parameters into data stream */
115 samr_io_q_unknown_38("", &q_e, &data, 0);
117 /* send the data on \PIPE\ */
118 if (rpc_con_pipe_req(con, SAMR_GET_DOM_PWINFO, &data, &rdata))
120 SAMR_R_UNKNOWN_38 r_e;
123 samr_io_r_unknown_38("", &r_e, &rdata, 0);
125 p = rdata.offset != 0;
127 if (p && r_e.status != 0)
129 /* report error code */
130 DEBUG(4,("SAMR_R_UNKNOWN_38: %s\n", get_nt_error_msg(r_e.status)));
140 prs_mem_free(&data );
141 prs_mem_free(&rdata );
146 /****************************************************************************
147 do a SAMR unknown 0x8 command
148 ****************************************************************************/
149 BOOL samr_query_dom_info( POLICY_HND *domain_pol, uint16 switch_value,
155 SAMR_Q_QUERY_DOMAIN_INFO q_e;
156 BOOL valid_un8 = False;
158 DEBUG(4,("SAMR Unknown 8 switch:%d\n", switch_value));
160 if (domain_pol == NULL) return False;
162 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
164 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
165 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
167 /* store the parameters */
168 make_samr_q_query_dom_info(&q_e, domain_pol, switch_value);
170 /* turn parameters into data stream */
171 samr_io_q_query_dom_info("", &q_e, &data, 0);
173 /* send the data on \PIPE\ */
174 if (rpc_hnd_pipe_req(domain_pol, SAMR_QUERY_DOMAIN_INFO, &data, &rdata))
176 SAMR_R_QUERY_DOMAIN_INFO r_e;
180 samr_io_r_query_dom_info("", &r_e, &rdata, 0);
182 p = rdata.offset != 0;
183 if (p && r_e.status != 0)
185 /* report error code */
186 DEBUG(4,("SAMR_R_QUERY_DOMAIN_INFO: %s\n", get_nt_error_msg(r_e.status)));
196 prs_mem_free(&data );
197 prs_mem_free(&rdata );
202 /****************************************************************************
203 do a SAMR enumerate Domains
204 ****************************************************************************/
205 uint32 samr_enum_domains( POLICY_HND *pol,
206 uint32 *start_idx, uint32 size,
207 struct acct_info **sam,
208 uint32 *num_sam_domains)
214 SAMR_Q_ENUM_DOMAINS q_e;
216 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
218 if (pol == NULL || num_sam_domains == NULL || sam == NULL)
220 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
223 /* create and send a MSRPC command with api SAMR_ENUM_DOMAINS */
225 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
226 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
228 /* store the parameters */
229 make_samr_q_enum_domains(&q_e, pol, *start_idx, size);
231 /* turn parameters into data stream */
232 samr_io_q_enum_domains("", &q_e, &data, 0);
234 /* send the data on \PIPE\ */
235 if (rpc_hnd_pipe_req(pol, SAMR_ENUM_DOMAINS, &data, &rdata))
237 SAMR_R_ENUM_DOMAINS r_e;
240 samr_io_r_enum_domains("", &r_e, &rdata, 0);
243 p = rdata.offset != 0;
244 if (p && r_e.status != 0)
246 /* report error code */
247 DEBUG(4,("SAMR_R_ENUM_DOMAINS: %s\n", get_nt_error_msg(r_e.status)));
248 p = (r_e.status == STATUS_MORE_ENTRIES);
253 uint32 i = (*num_sam_domains);
257 (*num_sam_domains) += r_e.num_entries2;
258 (*sam) = (struct acct_info*) Realloc((*sam),
259 sizeof(struct acct_info) * (*num_sam_domains));
263 (*num_sam_domains) = 0;
267 for (j = 0; i < (*num_sam_domains) && j < r_e.num_entries2; j++, i++)
269 (*sam)[i].rid = r_e.sam[j].rid;
270 (*sam)[i].acct_name[0] = 0;
271 (*sam)[i].acct_desc[0] = 0;
272 if (r_e.sam[j].hdr_name.buffer)
274 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_dom_name[name_idx], sizeof((*sam)[i].acct_name)-1);
277 DEBUG(5,("samr_enum_domains: idx: %4d rid: %8x acct: %s\n",
278 i, (*sam)[i].rid, (*sam)[i].acct_name));
280 (*start_idx) = r_e.next_idx;
282 else if (status == 0x0)
284 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
291 if (r_e.uni_dom_name != NULL)
293 free(r_e.uni_dom_name);
297 prs_mem_free(&data );
298 prs_mem_free(&rdata );
303 /****************************************************************************
304 do a SAMR enumerate groups
305 ****************************************************************************/
306 uint32 samr_enum_dom_groups( POLICY_HND *pol,
307 uint32 *start_idx, uint32 size,
308 struct acct_info **sam,
309 uint32 *num_sam_groups)
315 SAMR_Q_ENUM_DOM_GROUPS q_e;
317 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
319 if (pol == NULL || num_sam_groups == NULL)
321 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
324 /* create and send a MSRPC command with api SAMR_ENUM_DOM_GROUPS */
326 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
327 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
329 /* store the parameters */
330 make_samr_q_enum_dom_groups(&q_e, pol, *start_idx, size);
332 /* turn parameters into data stream */
333 samr_io_q_enum_dom_groups("", &q_e, &data, 0);
335 /* send the data on \PIPE\ */
336 if (rpc_hnd_pipe_req(pol, SAMR_ENUM_DOM_GROUPS, &data, &rdata))
338 SAMR_R_ENUM_DOM_GROUPS r_e;
341 samr_io_r_enum_dom_groups("", &r_e, &rdata, 0);
344 p = rdata.offset != 0;
345 if (p && r_e.status != 0)
347 /* report error code */
348 DEBUG(4,("SAMR_R_ENUM_DOM_GROUPS: %s\n", get_nt_error_msg(r_e.status)));
349 p = (r_e.status == STATUS_MORE_ENTRIES);
354 uint32 i = (*num_sam_groups);
358 (*num_sam_groups) += r_e.num_entries2;
359 (*sam) = (struct acct_info*) Realloc((*sam),
360 sizeof(struct acct_info) * (*num_sam_groups));
364 (*num_sam_groups) = 0;
368 for (j = 0; i < (*num_sam_groups) && j < r_e.num_entries2; j++, i++)
370 (*sam)[i].rid = r_e.sam[j].rid;
371 (*sam)[i].acct_name[0] = 0;
372 (*sam)[i].acct_desc[0] = 0;
373 if (r_e.sam[j].hdr_name.buffer)
375 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
378 DEBUG(5,("samr_enum_dom_groups: idx: %4d rid: %8x acct: %s\n",
379 i, (*sam)[i].rid, (*sam)[i].acct_name));
381 (*start_idx) = r_e.next_idx;
383 else if (status == 0x0)
385 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
392 if (r_e.uni_grp_name != NULL)
394 free(r_e.uni_grp_name);
398 prs_mem_free(&data );
399 prs_mem_free(&rdata );
404 /****************************************************************************
405 do a SAMR enumerate aliases
406 ****************************************************************************/
407 uint32 samr_enum_dom_aliases( POLICY_HND *pol,
408 uint32 *start_idx, uint32 size,
409 struct acct_info **sam,
410 uint32 *num_sam_aliases)
416 SAMR_Q_ENUM_DOM_ALIASES q_e;
418 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
420 if (pol == NULL || num_sam_aliases == NULL)
422 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
425 /* create and send a MSRPC command with api SAMR_ENUM_DOM_ALIASES */
427 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
428 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
430 /* store the parameters */
431 make_samr_q_enum_dom_aliases(&q_e, pol, *start_idx, size);
433 /* turn parameters into data stream */
434 samr_io_q_enum_dom_aliases("", &q_e, &data, 0);
436 /* send the data on \PIPE\ */
437 if (rpc_hnd_pipe_req(pol, SAMR_ENUM_DOM_ALIASES, &data, &rdata))
439 SAMR_R_ENUM_DOM_ALIASES r_e;
442 samr_io_r_enum_dom_aliases("", &r_e, &rdata, 0);
444 p = rdata.offset != 0;
445 if (p && r_e.status != 0)
447 /* report error code */
448 DEBUG(4,("SAMR_R_ENUM_DOM_ALIASES: %s\n", get_nt_error_msg(r_e.status)));
449 p = (r_e.status == STATUS_MORE_ENTRIES);
454 uint32 i = (*num_sam_aliases);
458 (*num_sam_aliases) += r_e.num_entries2;
459 (*sam) = (struct acct_info*) Realloc((*sam),
460 sizeof(struct acct_info) * (*num_sam_aliases));
464 (*num_sam_aliases) = 0;
468 for (j = 0; i < (*num_sam_aliases) && j < r_e.num_entries2; j++, i++)
470 (*sam)[i].rid = r_e.sam[j].rid;
471 (*sam)[i].acct_name[0] = 0;
472 (*sam)[i].acct_desc[0] = 0;
473 if (r_e.sam[j].hdr_name.buffer)
475 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_grp_name[name_idx], sizeof((*sam)[i].acct_name)-1);
478 DEBUG(5,("samr_enum_dom_aliases: idx: %4d rid: %8x acct: %s\n",
479 i, (*sam)[i].rid, (*sam)[i].acct_name));
481 (*start_idx) = r_e.next_idx;
483 else if (status == 0x0)
485 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
492 if (r_e.uni_grp_name != NULL)
494 free(r_e.uni_grp_name);
498 prs_mem_free(&data );
499 prs_mem_free(&rdata );
504 /****************************************************************************
505 do a SAMR enumerate users
506 ****************************************************************************/
507 uint32 samr_enum_dom_users( POLICY_HND *pol, uint32 *start_idx,
508 uint16 acb_mask, uint16 unk_1, uint32 size,
509 struct acct_info **sam,
510 uint32 *num_sam_users)
516 SAMR_Q_ENUM_DOM_USERS q_e;
518 DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
520 if (pol == NULL || num_sam_users == NULL)
522 return NT_STATUS_INVALID_PARAMETER | 0xC0000000;
525 /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
527 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
528 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
530 /* store the parameters */
531 make_samr_q_enum_dom_users(&q_e, pol, *start_idx,
532 acb_mask, unk_1, size);
534 /* turn parameters into data stream */
535 samr_io_q_enum_dom_users("", &q_e, &data, 0);
537 /* send the data on \PIPE\ */
538 if (rpc_hnd_pipe_req(pol, SAMR_ENUM_DOM_USERS, &data, &rdata))
540 SAMR_R_ENUM_DOM_USERS r_e;
543 samr_io_r_enum_dom_users("", &r_e, &rdata, 0);
546 p = rdata.offset != 0;
548 if (p && r_e.status != 0)
550 /* report error code */
551 DEBUG(4,("SAMR_R_ENUM_DOM_USERS: %s\n", get_nt_error_msg(r_e.status)));
552 p = (r_e.status == STATUS_MORE_ENTRIES);
557 uint32 i = (*num_sam_users);
561 (*num_sam_users) += r_e.num_entries2;
562 (*sam) = (struct acct_info*) Realloc((*sam),
563 sizeof(struct acct_info) * (*num_sam_users));
567 (*num_sam_users) = 0;
571 for (j = 0; i < (*num_sam_users) && j < r_e.num_entries2; j++, i++)
573 (*sam)[i].rid = r_e.sam[j].rid;
574 (*sam)[i].acct_name[0] = 0;
575 (*sam)[i].acct_desc[0] = 0;
576 if (r_e.sam[j].hdr_name.buffer)
578 unistr2_to_ascii((*sam)[i].acct_name, &r_e.uni_acct_name[name_idx], sizeof((*sam)[i].acct_name)-1);
581 DEBUG(5,("samr_enum_dom_users: idx: %4d rid: %8x acct: %s\n",
582 i, (*sam)[i].rid, (*sam)[i].acct_name));
584 (*start_idx) = r_e.next_idx;
586 else if (status == 0x0)
588 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
595 if (r_e.uni_acct_name != NULL)
597 free(r_e.uni_acct_name);
602 status = NT_STATUS_ACCESS_DENIED | 0xC0000000;
605 prs_mem_free(&data );
606 prs_mem_free(&rdata );
611 /****************************************************************************
613 ****************************************************************************/
614 BOOL samr_connect( const char *srv_name, uint32 unknown_0,
615 POLICY_HND *connect_pol)
621 BOOL valid_pol = False;
623 struct cli_connection *con = NULL;
625 if (!cli_connection_init(srv_name, PIPE_SAMR, &con))
630 DEBUG(4,("SAMR Open Policy server:%s undoc value:%x\n",
631 srv_name, unknown_0));
633 if (srv_name == NULL || connect_pol == NULL) return False;
635 /* create and send a MSRPC command with api SAMR_CONNECT */
637 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
638 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
640 /* store the parameters */
641 make_samr_q_connect(&q_o, srv_name, unknown_0);
643 /* turn parameters into data stream */
644 samr_io_q_connect("", &q_o, &data, 0);
646 /* send the data on \PIPE\ */
647 if (rpc_con_pipe_req(con, SAMR_CONNECT, &data, &rdata))
652 samr_io_r_connect("", &r_o, &rdata, 0);
653 p = rdata.offset != 0;
655 if (p && r_o.status != 0)
657 /* report error code */
658 DEBUG(4,("SAMR_R_CONNECT: %s\n", get_nt_error_msg(r_o.status)));
664 memcpy(connect_pol, &r_o.connect_pol, sizeof(r_o.connect_pol));
665 valid_pol = register_policy_hnd(connect_pol) &&
666 set_policy_con(connect_pol, con,
667 cli_connection_unlink);
671 prs_mem_free(&data );
672 prs_mem_free(&rdata );
677 /****************************************************************************
679 ****************************************************************************/
680 BOOL samr_open_user( const POLICY_HND *pol,
681 uint32 unk_0, uint32 rid,
682 POLICY_HND *user_pol)
687 SAMR_Q_OPEN_USER q_o;
688 BOOL valid_pol = False;
690 DEBUG(4,("SAMR Open User. unk_0: %08x RID:%x\n",
693 if (pol == NULL || user_pol == NULL) return False;
695 /* create and send a MSRPC command with api SAMR_OPEN_USER */
697 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
698 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
700 /* store the parameters */
701 make_samr_q_open_user(&q_o, pol, unk_0, rid);
703 /* turn parameters into data stream */
704 samr_io_q_open_user("", &q_o, &data, 0);
706 /* send the data on \PIPE\ */
707 if (rpc_hnd_pipe_req(pol, SAMR_OPEN_USER, &data, &rdata))
709 SAMR_R_OPEN_USER r_o;
712 samr_io_r_open_user("", &r_o, &rdata, 0);
713 p = rdata.offset != 0;
715 if (p && r_o.status != 0)
717 /* report error code */
718 DEBUG(4,("SAMR_R_OPEN_USER: %s\n", get_nt_error_msg(r_o.status)));
724 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
725 valid_pol = cli_pol_link(user_pol, pol);
729 prs_mem_free(&data );
730 prs_mem_free(&rdata );
735 /****************************************************************************
737 ****************************************************************************/
738 BOOL samr_open_alias( const POLICY_HND *domain_pol,
739 uint32 flags, uint32 rid,
740 POLICY_HND *alias_pol)
745 SAMR_Q_OPEN_ALIAS q_o;
746 BOOL valid_pol = False;
748 DEBUG(4,("SAMR Open Alias. RID:%x\n", rid));
750 if (alias_pol == NULL || domain_pol == NULL) return False;
752 /* create and send a MSRPC command with api SAMR_OPEN_ALIAS */
754 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
755 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
757 /* store the parameters */
758 make_samr_q_open_alias(&q_o, domain_pol, flags, rid);
760 /* turn parameters into data stream */
761 samr_io_q_open_alias("", &q_o, &data, 0);
763 /* send the data on \PIPE\ */
764 if (rpc_hnd_pipe_req(domain_pol, SAMR_OPEN_ALIAS, &data, &rdata))
766 SAMR_R_OPEN_ALIAS r_o;
769 samr_io_r_open_alias("", &r_o, &rdata, 0);
770 p = rdata.offset != 0;
772 if (p && r_o.status != 0)
774 /* report error code */
775 DEBUG(4,("SAMR_R_OPEN_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
781 memcpy(alias_pol, &r_o.pol, sizeof(r_o.pol));
782 valid_pol = cli_pol_link(alias_pol, domain_pol);
786 prs_mem_free(&data );
787 prs_mem_free(&rdata );
792 /****************************************************************************
793 do a SAMR Delete Alias Member
794 ****************************************************************************/
795 BOOL samr_del_aliasmem( POLICY_HND *alias_pol, DOM_SID *sid)
800 SAMR_Q_DEL_ALIASMEM q_o;
801 BOOL valid_pol = False;
803 if (alias_pol == NULL || sid == NULL) return False;
805 /* create and send a MSRPC command with api SAMR_DEL_ALIASMEM */
807 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
808 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
810 DEBUG(4,("SAMR Delete Alias Member.\n"));
812 /* store the parameters */
813 make_samr_q_del_aliasmem(&q_o, alias_pol, sid);
815 /* turn parameters into data stream */
816 samr_io_q_del_aliasmem("", &q_o, &data, 0);
818 /* send the data on \PIPE\ */
819 if (rpc_hnd_pipe_req(alias_pol, SAMR_DEL_ALIASMEM, &data, &rdata))
821 SAMR_R_DEL_ALIASMEM r_o;
824 samr_io_r_del_aliasmem("", &r_o, &rdata, 0);
825 p = rdata.offset != 0;
827 if (p && r_o.status != 0)
829 /* report error code */
830 DEBUG(4,("SAMR_R_DEL_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
840 prs_mem_free(&data );
841 prs_mem_free(&rdata );
846 /****************************************************************************
847 do a SAMR Add Alias Member
848 ****************************************************************************/
849 BOOL samr_add_aliasmem( POLICY_HND *alias_pol, DOM_SID *sid)
854 SAMR_Q_ADD_ALIASMEM q_o;
855 BOOL valid_pol = False;
857 if (alias_pol == NULL || sid == NULL) return False;
859 /* create and send a MSRPC command with api SAMR_ADD_ALIASMEM */
861 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
862 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
864 DEBUG(4,("SAMR Add Alias Member.\n"));
866 /* store the parameters */
867 make_samr_q_add_aliasmem(&q_o, alias_pol, sid);
869 /* turn parameters into data stream */
870 samr_io_q_add_aliasmem("", &q_o, &data, 0);
872 /* send the data on \PIPE\ */
873 if (rpc_hnd_pipe_req(alias_pol, SAMR_ADD_ALIASMEM, &data, &rdata))
875 SAMR_R_ADD_ALIASMEM r_o;
878 samr_io_r_add_aliasmem("", &r_o, &rdata, 0);
879 p = rdata.offset != 0;
881 if (p && r_o.status != 0)
883 /* report error code */
884 DEBUG(4,("SAMR_R_ADD_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
894 prs_mem_free(&data );
895 prs_mem_free(&rdata );
900 /****************************************************************************
901 do a SAMR Delete Domain Alias
902 ****************************************************************************/
903 BOOL samr_delete_dom_alias( POLICY_HND *alias_pol)
908 SAMR_Q_DELETE_DOM_ALIAS q_o;
909 BOOL valid_pol = False;
911 if (alias_pol == NULL) return False;
913 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_ALIAS */
915 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
916 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
918 DEBUG(4,("SAMR Delete Domain Alias.\n"));
920 /* store the parameters */
921 make_samr_q_delete_dom_alias(&q_o, alias_pol);
923 /* turn parameters into data stream */
924 samr_io_q_delete_dom_alias("", &q_o, &data, 0);
926 /* send the data on \PIPE\ */
927 if (rpc_hnd_pipe_req(alias_pol, SAMR_DELETE_DOM_ALIAS, &data, &rdata))
929 SAMR_R_DELETE_DOM_ALIAS r_o;
932 samr_io_r_delete_dom_alias("", &r_o, &rdata, 0);
933 p = rdata.offset != 0;
935 if (p && r_o.status != 0)
937 /* report error code */
938 DEBUG(4,("SAMR_R_DELETE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
948 prs_mem_free(&data );
949 prs_mem_free(&rdata );
954 /****************************************************************************
955 do a SAMR Create Domain User
956 ****************************************************************************/
957 BOOL samr_create_dom_user( POLICY_HND *domain_pol, const char *acct_name,
958 uint32 unk_0, uint32 unk_1,
959 POLICY_HND *user_pol, uint32 *rid)
964 SAMR_Q_CREATE_USER q_o;
965 BOOL valid_pol = False;
967 if (user_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
969 /* create and send a MSRPC command with api SAMR_CREATE_USER */
971 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
972 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
974 DEBUG(4,("SAMR Create Domain User. Name:%s\n", acct_name));
976 /* store the parameters */
977 make_samr_q_create_user(&q_o, domain_pol, acct_name, unk_0, unk_1);
979 /* turn parameters into data stream */
980 samr_io_q_create_user("", &q_o, &data, 0);
982 /* send the data on \PIPE\ */
983 if (rpc_hnd_pipe_req(domain_pol, SAMR_CREATE_USER, &data, &rdata))
985 SAMR_R_CREATE_USER r_o;
988 samr_io_r_create_user("", &r_o, &rdata, 0);
989 p = rdata.offset != 0;
991 if (p && r_o.status != 0)
993 /* report error code */
994 DEBUG(4,("SAMR_R_CREATE_USER: %s\n", get_nt_error_msg(r_o.status)));
1000 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
1001 *rid = r_o.user_rid;
1002 valid_pol = cli_pol_link(user_pol, domain_pol);
1006 prs_mem_free(&data );
1007 prs_mem_free(&rdata );
1012 /****************************************************************************
1013 do a SAMR Create Domain Alias
1014 ****************************************************************************/
1015 BOOL samr_create_dom_alias( POLICY_HND *domain_pol, const char *acct_name,
1016 POLICY_HND *alias_pol, uint32 *rid)
1021 SAMR_Q_CREATE_DOM_ALIAS q_o;
1022 BOOL valid_pol = False;
1024 if (alias_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1026 /* create and send a MSRPC command with api SAMR_CREATE_DOM_ALIAS */
1028 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1029 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1031 DEBUG(4,("SAMR Create Domain Alias. Name:%s\n", acct_name));
1033 /* store the parameters */
1034 make_samr_q_create_dom_alias(&q_o, domain_pol, acct_name);
1036 /* turn parameters into data stream */
1037 samr_io_q_create_dom_alias("", &q_o, &data, 0);
1039 /* send the data on \PIPE\ */
1040 if (rpc_hnd_pipe_req(domain_pol, SAMR_CREATE_DOM_ALIAS, &data, &rdata))
1042 SAMR_R_CREATE_DOM_ALIAS r_o;
1045 samr_io_r_create_dom_alias("", &r_o, &rdata, 0);
1046 p = rdata.offset != 0;
1048 if (p && r_o.status != 0)
1050 /* report error code */
1051 DEBUG(4,("SAMR_R_CREATE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1057 memcpy(alias_pol, &r_o.alias_pol, sizeof(r_o.alias_pol));
1059 valid_pol = cli_pol_link(alias_pol, domain_pol);
1063 prs_mem_free(&data );
1064 prs_mem_free(&rdata );
1069 /****************************************************************************
1070 do a SAMR Get Alias Info
1071 ****************************************************************************/
1072 BOOL samr_query_aliasinfo( POLICY_HND *alias_pol, uint16 switch_value,
1073 ALIAS_INFO_CTR *ctr)
1078 SAMR_Q_QUERY_ALIASINFO q_o;
1079 BOOL valid_pol = False;
1081 if (alias_pol == NULL || ctr == NULL) return False;
1083 /* create and send a MSRPC command with api SAMR_GET_ALIASINFO */
1085 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1086 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1088 DEBUG(4,("SAMR Get Alias Info\n"));
1090 /* store the parameters */
1091 make_samr_q_query_aliasinfo(&q_o, alias_pol, switch_value);
1093 /* turn parameters into data stream */
1094 samr_io_q_query_aliasinfo("", &q_o, &data, 0);
1096 /* send the data on \PIPE\ */
1097 if (rpc_hnd_pipe_req(alias_pol, SAMR_QUERY_ALIASINFO, &data, &rdata))
1099 SAMR_R_QUERY_ALIASINFO r_o;
1102 /* get alias info */
1105 samr_io_r_query_aliasinfo("", &r_o, &rdata, 0);
1106 p = rdata.offset != 0;
1108 if (p && r_o.status != 0)
1110 /* report error code */
1111 DEBUG(4,("SAMR_R_QUERY_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1121 prs_mem_free(&data );
1122 prs_mem_free(&rdata );
1127 /****************************************************************************
1128 do a SAMR Set Alias Info
1129 ****************************************************************************/
1130 BOOL samr_set_aliasinfo( POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1135 SAMR_Q_SET_ALIASINFO q_o;
1136 BOOL valid_pol = False;
1138 if (alias_pol == NULL || ctr == NULL) return False;
1140 /* create and send a MSRPC command with api SAMR_SET_ALIASINFO */
1142 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1143 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1145 DEBUG(4,("SAMR Set Alias Info\n"));
1147 /* store the parameters */
1148 make_samr_q_set_aliasinfo(&q_o, alias_pol, ctr);
1150 /* turn parameters into data stream */
1151 samr_io_q_set_aliasinfo("", &q_o, &data, 0);
1153 /* send the data on \PIPE\ */
1154 if (rpc_hnd_pipe_req(alias_pol, SAMR_SET_ALIASINFO, &data, &rdata))
1156 SAMR_R_SET_ALIASINFO r_o;
1159 samr_io_r_set_aliasinfo("", &r_o, &rdata, 0);
1160 p = rdata.offset != 0;
1162 if (p && r_o.status != 0)
1164 /* report error code */
1165 DEBUG(4,("SAMR_R_SET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1175 prs_mem_free(&data );
1176 prs_mem_free(&rdata );
1181 /****************************************************************************
1182 do a SAMR Open Group
1183 ****************************************************************************/
1184 BOOL samr_open_group( const POLICY_HND *domain_pol,
1185 uint32 flags, uint32 rid,
1186 POLICY_HND *group_pol)
1191 SAMR_Q_OPEN_GROUP q_o;
1192 BOOL valid_pol = False;
1194 DEBUG(4,("SAMR Open Group. RID:%x\n", rid));
1196 if (group_pol == NULL || domain_pol == NULL) return False;
1198 /* create and send a MSRPC command with api SAMR_OPEN_GROUP */
1200 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1201 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1203 /* store the parameters */
1204 make_samr_q_open_group(&q_o, domain_pol, flags, rid);
1206 /* turn parameters into data stream */
1207 samr_io_q_open_group("", &q_o, &data, 0);
1209 /* send the data on \PIPE\ */
1210 if (rpc_hnd_pipe_req(domain_pol, SAMR_OPEN_GROUP, &data, &rdata))
1212 SAMR_R_OPEN_GROUP r_o;
1215 samr_io_r_open_group("", &r_o, &rdata, 0);
1216 p = rdata.offset != 0;
1218 if (p && r_o.status != 0)
1220 /* report error code */
1221 DEBUG(4,("SAMR_R_OPEN_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1227 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1228 valid_pol = cli_pol_link(group_pol, domain_pol);
1232 prs_mem_free(&data );
1233 prs_mem_free(&rdata );
1238 /****************************************************************************
1239 do a SAMR Delete Group Member
1240 ****************************************************************************/
1241 BOOL samr_del_groupmem( POLICY_HND *group_pol, uint32 rid)
1246 SAMR_Q_DEL_GROUPMEM q_o;
1247 BOOL valid_pol = False;
1249 if (group_pol == NULL) return False;
1251 /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */
1253 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1254 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1256 DEBUG(4,("SAMR Delete Group Member.\n"));
1258 /* store the parameters */
1259 make_samr_q_del_groupmem(&q_o, group_pol, rid);
1261 /* turn parameters into data stream */
1262 samr_io_q_del_groupmem("", &q_o, &data, 0);
1264 /* send the data on \PIPE\ */
1265 if (rpc_hnd_pipe_req(group_pol, SAMR_DEL_GROUPMEM, &data, &rdata))
1267 SAMR_R_DEL_GROUPMEM r_o;
1270 samr_io_r_del_groupmem("", &r_o, &rdata, 0);
1271 p = rdata.offset != 0;
1273 if (p && r_o.status != 0)
1275 /* report error code */
1276 DEBUG(4,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1286 prs_mem_free(&data );
1287 prs_mem_free(&rdata );
1292 /****************************************************************************
1293 do a SAMR Add Group Member
1294 ****************************************************************************/
1295 BOOL samr_add_groupmem( POLICY_HND *group_pol, uint32 rid)
1300 SAMR_Q_ADD_GROUPMEM q_o;
1301 BOOL valid_pol = False;
1303 if (group_pol == NULL) return False;
1305 /* create and send a MSRPC command with api SAMR_ADD_GROUPMEM */
1307 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1308 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1310 DEBUG(4,("SAMR Add Group Member.\n"));
1312 /* store the parameters */
1313 make_samr_q_add_groupmem(&q_o, group_pol, rid);
1315 /* turn parameters into data stream */
1316 samr_io_q_add_groupmem("", &q_o, &data, 0);
1318 /* send the data on \PIPE\ */
1319 if (rpc_hnd_pipe_req(group_pol, SAMR_ADD_GROUPMEM, &data, &rdata))
1321 SAMR_R_ADD_GROUPMEM r_o;
1324 samr_io_r_add_groupmem("", &r_o, &rdata, 0);
1325 p = rdata.offset != 0;
1327 if (p && r_o.status != 0)
1329 /* report error code */
1330 DEBUG(4,("SAMR_R_ADD_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1340 prs_mem_free(&data );
1341 prs_mem_free(&rdata );
1346 /****************************************************************************
1347 do a SAMR Delete Domain Group
1348 ****************************************************************************/
1349 BOOL samr_delete_dom_group( POLICY_HND *group_pol)
1354 SAMR_Q_DELETE_DOM_GROUP q_o;
1355 BOOL valid_pol = False;
1357 if (group_pol == NULL) return False;
1359 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */
1361 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1362 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1364 DEBUG(4,("SAMR Delete Domain Group.\n"));
1366 /* store the parameters */
1367 make_samr_q_delete_dom_group(&q_o, group_pol);
1369 /* turn parameters into data stream */
1370 samr_io_q_delete_dom_group("", &q_o, &data, 0);
1372 /* send the data on \PIPE\ */
1373 if (rpc_hnd_pipe_req(group_pol, SAMR_DELETE_DOM_GROUP, &data, &rdata))
1375 SAMR_R_DELETE_DOM_GROUP r_o;
1378 samr_io_r_delete_dom_group("", &r_o, &rdata, 0);
1379 p = rdata.offset != 0;
1381 if (p && r_o.status != 0)
1383 /* report error code */
1384 DEBUG(4,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1394 prs_mem_free(&data );
1395 prs_mem_free(&rdata );
1400 /****************************************************************************
1401 do a SAMR Create Domain Group
1402 ****************************************************************************/
1403 BOOL samr_create_dom_group( POLICY_HND *domain_pol, const char *acct_name,
1404 POLICY_HND *group_pol, uint32 *rid)
1409 SAMR_Q_CREATE_DOM_GROUP q_o;
1410 BOOL valid_pol = False;
1412 if (group_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1414 /* create and send a MSRPC command with api SAMR_CREATE_DOM_GROUP */
1416 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1417 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1419 DEBUG(4,("SAMR Create Domain Group. Name:%s\n", acct_name));
1421 /* store the parameters */
1422 make_samr_q_create_dom_group(&q_o, domain_pol, acct_name);
1424 /* turn parameters into data stream */
1425 samr_io_q_create_dom_group("", &q_o, &data, 0);
1427 /* send the data on \PIPE\ */
1428 if (rpc_hnd_pipe_req(domain_pol, SAMR_CREATE_DOM_GROUP, &data, &rdata))
1430 SAMR_R_CREATE_DOM_GROUP r_o;
1433 samr_io_r_create_dom_group("", &r_o, &rdata, 0);
1434 p = rdata.offset != 0;
1436 if (p && r_o.status != 0)
1438 /* report error code */
1439 DEBUG(4,("SAMR_R_CREATE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1445 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1447 valid_pol = cli_pol_link(group_pol, domain_pol);
1451 prs_mem_free(&data );
1452 prs_mem_free(&rdata );
1457 /****************************************************************************
1458 do a SAMR Set Group Info
1459 ****************************************************************************/
1460 BOOL samr_set_groupinfo( POLICY_HND *group_pol, GROUP_INFO_CTR *ctr)
1465 SAMR_Q_SET_GROUPINFO q_o;
1466 BOOL valid_pol = False;
1468 if (group_pol == NULL || ctr == NULL) return False;
1470 /* create and send a MSRPC command with api SAMR_SET_GROUPINFO */
1472 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1473 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1475 DEBUG(4,("SAMR Set Group Info\n"));
1477 /* store the parameters */
1478 make_samr_q_set_groupinfo(&q_o, group_pol, ctr);
1480 /* turn parameters into data stream */
1481 samr_io_q_set_groupinfo("", &q_o, &data, 0);
1483 /* send the data on \PIPE\ */
1484 if (rpc_hnd_pipe_req(group_pol, SAMR_SET_GROUPINFO, &data, &rdata))
1486 SAMR_R_SET_GROUPINFO r_o;
1489 samr_io_r_set_groupinfo("", &r_o, &rdata, 0);
1490 p = rdata.offset != 0;
1492 if (p && r_o.status != 0)
1494 /* report error code */
1495 DEBUG(4,("SAMR_R_SET_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
1505 prs_mem_free(&data );
1506 prs_mem_free(&rdata );
1511 /****************************************************************************
1512 do a SAMR Open Domain
1513 ****************************************************************************/
1514 BOOL samr_open_domain( const POLICY_HND *connect_pol,
1517 POLICY_HND *domain_pol)
1523 SAMR_Q_OPEN_DOMAIN q_o;
1524 BOOL valid_pol = False;
1526 if (DEBUGLEVEL >= 4)
1528 sid_to_string(sid_str, sid);
1529 DEBUG(4,("SAMR Open Domain. SID:%s Permissions:%x\n",
1530 sid_str, ace_perms));
1533 if (connect_pol == NULL || sid == NULL || domain_pol == NULL) return False;
1535 /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
1537 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1538 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1540 /* store the parameters */
1541 make_samr_q_open_domain(&q_o, connect_pol, ace_perms, sid);
1543 /* turn parameters into data stream */
1544 samr_io_q_open_domain("", &q_o, &data, 0);
1546 /* send the data on \PIPE\ */
1547 if (rpc_hnd_pipe_req(connect_pol, SAMR_OPEN_DOMAIN, &data, &rdata))
1549 SAMR_R_OPEN_DOMAIN r_o;
1552 samr_io_r_open_domain("", &r_o, &rdata, 0);
1553 p = rdata.offset != 0;
1555 if (p && r_o.status != 0)
1557 /* report error code */
1558 DEBUG(4,("SAMR_R_OPEN_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1564 memcpy(domain_pol, &r_o.domain_pol, sizeof(r_o.domain_pol));
1565 valid_pol = cli_pol_link(domain_pol, connect_pol);
1569 prs_mem_free(&data );
1570 prs_mem_free(&rdata );
1575 /****************************************************************************
1576 do a SAMR Query Lookup Domain
1577 ****************************************************************************/
1578 BOOL samr_query_lookup_domain( POLICY_HND *pol, const char *dom_name,
1584 SAMR_Q_LOOKUP_DOMAIN q_o;
1585 BOOL valid_query = False;
1587 if (pol == NULL || dom_name == NULL || dom_sid == NULL) return False;
1589 /* create and send a MSRPC command with api SAMR_LOOKUP_DOMAIN */
1591 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1592 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1594 DEBUG(4,("SAMR Query Lookup Domain.\n"));
1596 /* store the parameters */
1597 make_samr_q_lookup_domain(&q_o, pol, dom_name);
1599 /* turn parameters into data stream */
1600 samr_io_q_lookup_domain("", &q_o, &data, 0);
1602 /* send the data on \PIPE\ */
1603 if (rpc_hnd_pipe_req(pol, SAMR_LOOKUP_DOMAIN, &data, &rdata))
1605 SAMR_R_LOOKUP_DOMAIN r_o;
1608 samr_io_r_lookup_domain("", &r_o, &rdata, 0);
1609 p = rdata.offset != 0;
1611 if (p && r_o.status != 0)
1613 /* report error code */
1614 DEBUG(4,("SAMR_R_LOOKUP_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1618 if (p && r_o.ptr_sid != 0)
1620 sid_copy(dom_sid, &r_o.dom_sid.sid);
1625 prs_mem_free(&data );
1626 prs_mem_free(&rdata );
1631 /****************************************************************************
1632 do a SAMR Query Lookup Names
1633 ****************************************************************************/
1634 BOOL samr_query_lookup_names( POLICY_HND *pol, uint32 flags,
1635 uint32 num_names, char **names,
1637 uint32 rid[MAX_LOOKUP_SIDS],
1638 uint32 type[MAX_LOOKUP_SIDS])
1643 SAMR_Q_LOOKUP_NAMES q_o;
1644 BOOL valid_query = False;
1646 if (pol == NULL || flags == 0 || num_names == 0 || names == NULL ||
1647 num_rids == NULL || rid == NULL || type == NULL ) return False;
1649 /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */
1651 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1652 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1654 DEBUG(4,("SAMR Query Lookup NAMES.\n"));
1656 /* store the parameters */
1657 make_samr_q_lookup_names(&q_o, pol, flags, num_names, names);
1659 /* turn parameters into data stream */
1660 samr_io_q_lookup_names("", &q_o, &data, 0);
1662 /* send the data on \PIPE\ */
1663 if (rpc_hnd_pipe_req(pol, SAMR_LOOKUP_NAMES, &data, &rdata))
1665 SAMR_R_LOOKUP_NAMES r_o;
1668 samr_io_r_lookup_names("", &r_o, &rdata, 0);
1669 p = rdata.offset != 0;
1671 if (p && r_o.status != 0)
1673 /* report error code */
1674 DEBUG(4,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status)));
1675 p = r_o.status == 0x107;
1680 if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 &&
1681 r_o.num_types1 == r_o.num_rids1)
1686 *num_rids = r_o.num_rids1;
1688 for (i = 0; i < r_o.num_rids1; i++)
1690 rid[i] = r_o.rid[i];
1692 for (i = 0; i < r_o.num_types1; i++)
1694 type[i] = r_o.type[i];
1697 else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0)
1709 prs_mem_free(&data );
1710 prs_mem_free(&rdata );
1715 /****************************************************************************
1716 do a SAMR Query Lookup RIDS
1717 ****************************************************************************/
1718 BOOL samr_query_lookup_rids( const POLICY_HND *pol, uint32 flags,
1719 uint32 num_rids, uint32 *rids,
1727 SAMR_Q_LOOKUP_RIDS q_o;
1728 BOOL valid_query = False;
1730 if (pol == NULL || flags == 0 || num_rids == 0 || rids == NULL ||
1731 num_names == NULL || names == NULL || type == NULL ) return False;
1733 /* create and send a MSRPC command with api SAMR_LOOKUP_RIDS */
1735 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1736 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1738 DEBUG(4,("SAMR Query Lookup RIDs.\n"));
1740 /* store the parameters */
1741 make_samr_q_lookup_rids(&q_o, pol, flags, num_rids, rids);
1743 /* turn parameters into data stream */
1744 samr_io_q_lookup_rids("", &q_o, &data, 0);
1746 /* send the data on \PIPE\ */
1747 if (rpc_hnd_pipe_req(pol, SAMR_LOOKUP_RIDS, &data, &rdata))
1749 SAMR_R_LOOKUP_RIDS r_o;
1753 samr_io_r_lookup_rids("", &r_o, &rdata, 0);
1754 p = rdata.offset != 0;
1756 if (p && r_o.status != 0)
1758 /* report error code */
1759 DEBUG(4,("SAMR_R_LOOKUP_RIDS: %s\n", get_nt_error_msg(r_o.status)));
1765 if (r_o.ptr_names != 0 && r_o.ptr_types != 0 &&
1766 r_o.num_types1 == r_o.num_names1)
1774 for (i = 0; i < r_o.num_names1; i++)
1777 unistr2_to_ascii(tmp, &r_o.uni_name[i], sizeof(tmp)-1);
1778 add_chars_to_array(num_names, names, tmp);
1781 if ((*num_names) != 0)
1783 (*type) = (uint32*)malloc((*num_names) * sizeof(**type));
1786 for (i = 0; (*type) != NULL && i < r_o.num_types1; i++)
1788 (*type)[i] = r_o.type[i];
1791 else if (r_o.ptr_names == 0 && r_o.ptr_types == 0)
1804 samr_free_r_lookup_rids(&r_o);
1807 prs_mem_free(&data );
1808 prs_mem_free(&rdata );
1813 /****************************************************************************
1814 do a SAMR Query Alias Members
1815 ****************************************************************************/
1816 BOOL samr_query_aliasmem( const POLICY_HND *alias_pol,
1817 uint32 *num_mem, DOM_SID2 *sid)
1822 SAMR_Q_QUERY_ALIASMEM q_o;
1823 BOOL valid_query = False;
1825 DEBUG(4,("SAMR Query Alias Members.\n"));
1827 if (alias_pol == NULL || sid == NULL || num_mem == NULL) return False;
1829 /* create and send a MSRPC command with api SAMR_QUERY_ALIASMEM */
1831 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1832 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1834 /* store the parameters */
1835 make_samr_q_query_aliasmem(&q_o, alias_pol);
1837 /* turn parameters into data stream */
1838 samr_io_q_query_aliasmem("", &q_o, &data, 0);
1840 /* send the data on \PIPE\ */
1841 if (rpc_hnd_pipe_req(alias_pol, SAMR_QUERY_ALIASMEM, &data, &rdata))
1843 SAMR_R_QUERY_ALIASMEM r_o;
1849 samr_io_r_query_aliasmem("", &r_o, &rdata, 0);
1850 p = rdata.offset != 0;
1852 if (p && r_o.status != 0)
1854 /* report error code */
1855 DEBUG(4,("SAMR_R_QUERY_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1859 if (p && r_o.ptr != 0)
1862 *num_mem = r_o.num_sids;
1867 prs_mem_free(&data );
1868 prs_mem_free(&rdata );
1873 /****************************************************************************
1874 do a SAMR Query User Aliases
1875 ****************************************************************************/
1876 BOOL samr_query_useraliases( const POLICY_HND *pol,
1877 uint32 *ptr_sid, DOM_SID2 *sid,
1878 uint32 *num_aliases, uint32 **rid)
1883 SAMR_Q_QUERY_USERALIASES q_o;
1884 BOOL valid_query = False;
1887 DEBUG(4,("SAMR Query User Aliases.\n"));
1889 if (pol == NULL || sid == NULL || rid == NULL || num_aliases == 0) return False;
1891 /* create and send a MSRPC command with api SAMR_QUERY_USERALIASES */
1893 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1894 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1896 /* store the parameters */
1897 make_samr_q_query_useraliases(&q_o, pol, ptr_sid, sid);
1899 /* turn parameters into data stream */
1900 samr_io_q_query_useraliases("", &q_o, &data, 0);
1902 /* send the data on \PIPE\ */
1903 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_USERALIASES, &data, &rdata))
1905 SAMR_R_QUERY_USERALIASES r_o;
1910 samr_io_r_query_useraliases("", &r_o, &rdata, 0);
1912 p = rdata.offset != 0;
1914 if (p && r_o.status != 0)
1916 /* report error code */
1917 DEBUG(4,("SAMR_R_QUERY_USERALIASES: %s\n", get_nt_error_msg(r_o.status)));
1921 if (p && r_o.ptr != 0)
1924 *num_aliases = r_o.num_entries;
1929 prs_mem_free(&data );
1930 prs_mem_free(&rdata );
1935 /****************************************************************************
1936 do a SAMR Query Group Members
1937 ****************************************************************************/
1938 BOOL samr_query_groupmem( POLICY_HND *group_pol,
1939 uint32 *num_mem, uint32 **rid, uint32 **attr)
1944 SAMR_Q_QUERY_GROUPMEM q_o;
1945 BOOL valid_query = False;
1947 DEBUG(4,("SAMR Query Group Members.\n"));
1949 if (group_pol == NULL || rid == NULL || attr == NULL || num_mem == NULL) return False;
1951 /* create and send a MSRPC command with api SAMR_QUERY_GROUPMEM */
1953 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1954 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1956 /* store the parameters */
1957 make_samr_q_query_groupmem(&q_o, group_pol);
1959 /* turn parameters into data stream */
1960 samr_io_q_query_groupmem("", &q_o, &data, 0);
1962 /* send the data on \PIPE\ */
1963 if (rpc_hnd_pipe_req(group_pol, SAMR_QUERY_GROUPMEM, &data, &rdata))
1965 SAMR_R_QUERY_GROUPMEM r_o;
1971 samr_io_r_query_groupmem("", &r_o, &rdata, 0);
1974 p = rdata.offset != 0;
1976 if (p && r_o.status != 0)
1978 /* report error code */
1979 DEBUG(4,("SAMR_R_QUERY_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1983 if (p && r_o.ptr != 0 &&
1984 r_o.ptr_rids != 0 && r_o.ptr_attrs != 0 &&
1985 r_o.num_rids == r_o.num_attrs)
1988 *num_mem = r_o.num_rids;
1993 prs_mem_free(&data );
1994 prs_mem_free(&rdata );
1999 /****************************************************************************
2000 do a SAMR Query User Groups
2001 ****************************************************************************/
2002 BOOL samr_query_usergroups( POLICY_HND *pol, uint32 *num_groups,
2008 SAMR_Q_QUERY_USERGROUPS q_o;
2009 BOOL valid_query = False;
2011 DEBUG(4,("SAMR Query User Groups.\n"));
2013 if (pol == NULL || gid == NULL || num_groups == 0) return False;
2015 /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
2017 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2018 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2020 /* store the parameters */
2021 make_samr_q_query_usergroups(&q_o, pol);
2023 /* turn parameters into data stream */
2024 samr_io_q_query_usergroups("", &q_o, &data, 0);
2026 /* send the data on \PIPE\ */
2027 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_USERGROUPS, &data, &rdata))
2029 SAMR_R_QUERY_USERGROUPS r_o;
2035 samr_io_r_query_usergroups("", &r_o, &rdata, 0);
2037 p = rdata.offset != 0;
2039 if (p && r_o.status != 0)
2041 /* report error code */
2042 DEBUG(4,("SAMR_R_QUERY_USERGROUPS: %s\n", get_nt_error_msg(r_o.status)));
2046 if (p && r_o.ptr_0 != 0)
2049 *num_groups = r_o.num_entries;
2054 prs_mem_free(&data );
2055 prs_mem_free(&rdata );
2060 /****************************************************************************
2061 do a SAMR Query Group Info
2062 ****************************************************************************/
2063 BOOL samr_query_groupinfo( POLICY_HND *pol,
2064 uint16 switch_value, GROUP_INFO_CTR* ctr)
2069 SAMR_Q_QUERY_GROUPINFO q_o;
2070 BOOL valid_query = False;
2072 DEBUG(4,("SAMR Query Group Info. level: %d\n", switch_value));
2074 if (pol == NULL || ctr == NULL || switch_value == 0) return False;
2076 /* create and send a MSRPC command with api SAMR_QUERY_GROUPINFO */
2078 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2079 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2081 /* store the parameters */
2082 make_samr_q_query_groupinfo(&q_o, pol, switch_value);
2084 /* turn parameters into data stream */
2085 samr_io_q_query_groupinfo("", &q_o, &data, 0);
2087 /* send the data on \PIPE\ */
2088 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_GROUPINFO, &data, &rdata))
2090 SAMR_R_QUERY_GROUPINFO r_o;
2093 /* get group info */
2096 samr_io_r_query_groupinfo("", &r_o, &rdata, 0);
2097 p = rdata.offset != 0;
2099 if (p && r_o.status != 0)
2101 /* report error code */
2102 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
2106 if (p && r_o.ctr->switch_value1 != switch_value)
2108 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: received incorrect level %d\n",
2109 r_o.ctr->switch_value1));
2112 if (p && r_o.ptr != 0)
2118 prs_mem_free(&data );
2119 prs_mem_free(&rdata );
2124 /****************************************************************************
2125 do a SAMR Set User Info
2126 ****************************************************************************/
2127 BOOL samr_set_userinfo2( POLICY_HND *pol, uint16 switch_value,
2133 SAMR_Q_SET_USERINFO2 q_o;
2134 BOOL valid_query = False;
2136 DEBUG(4,("SAMR Set User Info 2. level: %d\n", switch_value));
2138 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2140 /* create and send a MSRPC command with api SAMR_SET_USERINFO2 */
2142 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2143 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2145 /* store the parameters */
2146 make_samr_q_set_userinfo2(&q_o, pol, switch_value, usr);
2148 /* turn parameters into data stream */
2149 samr_io_q_set_userinfo2("", &q_o, &data, 0);
2151 /* send the data on \PIPE\ */
2152 if (rpc_hnd_pipe_req(pol, SAMR_SET_USERINFO2, &data, &rdata))
2154 SAMR_R_SET_USERINFO2 r_o;
2157 samr_io_r_set_userinfo2("", &r_o, &rdata, 0);
2158 p = rdata.offset != 0;
2160 if (p && r_o.status != 0)
2162 /* report error code */
2163 DEBUG(4,("SAMR_R_QUERY_USERINFO2: %s\n", get_nt_error_msg(r_o.status)));
2173 prs_mem_free(&data );
2174 prs_mem_free(&rdata );
2179 /****************************************************************************
2180 do a SAMR Set User Info
2181 ****************************************************************************/
2182 BOOL samr_set_userinfo( POLICY_HND *pol, uint16 switch_value, void* usr)
2187 SAMR_Q_SET_USERINFO q_o;
2188 BOOL valid_query = False;
2190 DEBUG(4,("SAMR Set User Info. level: %d\n", switch_value));
2192 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2194 /* create and send a MSRPC command with api SAMR_SET_USERINFO */
2196 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2197 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2199 /* store the parameters */
2200 make_samr_q_set_userinfo(&q_o, pol, switch_value, usr);
2202 /* turn parameters into data stream */
2203 samr_io_q_set_userinfo("", &q_o, &data, 0);
2205 /* send the data on \PIPE\ */
2206 if (rpc_hnd_pipe_req(pol, SAMR_SET_USERINFO, &data, &rdata))
2208 SAMR_R_SET_USERINFO r_o;
2211 samr_io_r_set_userinfo("", &r_o, &rdata, 0);
2212 p = rdata.offset != 0;
2214 if (p && r_o.status != 0)
2216 /* report error code */
2217 DEBUG(4,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2227 prs_mem_free(&data );
2228 prs_mem_free(&rdata );
2233 /****************************************************************************
2234 do a SAMR Query User Info
2235 ****************************************************************************/
2236 BOOL samr_query_userinfo( POLICY_HND *pol, uint16 switch_value, void* usr)
2241 SAMR_Q_QUERY_USERINFO q_o;
2242 BOOL valid_query = False;
2244 DEBUG(4,("SAMR Query User Info. level: %d\n", switch_value));
2246 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2248 /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
2250 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2251 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2253 /* store the parameters */
2254 make_samr_q_query_userinfo(&q_o, pol, switch_value);
2256 /* turn parameters into data stream */
2257 samr_io_q_query_userinfo("", &q_o, &data, 0);
2259 /* send the data on \PIPE\ */
2260 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_USERINFO, &data, &rdata))
2262 SAMR_R_QUERY_USERINFO r_o;
2268 samr_io_r_query_userinfo("", &r_o, &rdata, 0);
2269 p = rdata.offset != 0;
2271 if (p && r_o.status != 0)
2273 /* report error code */
2274 DEBUG(4,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2278 if (p && r_o.switch_value != switch_value)
2280 DEBUG(4,("SAMR_R_QUERY_USERINFO: received incorrect level %d\n",
2284 if (p && r_o.ptr != 0)
2290 prs_mem_free(&data );
2291 prs_mem_free(&rdata );
2296 /****************************************************************************
2298 ****************************************************************************/
2299 BOOL samr_close( POLICY_HND *hnd)
2304 SAMR_Q_CLOSE_HND q_c;
2305 BOOL valid_close = False;
2307 DEBUG(4,("SAMR Close\n"));
2309 if (hnd == NULL) return False;
2311 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2312 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2314 /* create and send a MSRPC command with api SAMR_CLOSE_HND */
2316 /* store the parameters */
2317 make_samr_q_close_hnd(&q_c, hnd);
2319 /* turn parameters into data stream */
2320 samr_io_q_close_hnd("", &q_c, &data, 0);
2322 /* send the data on \PIPE\ */
2323 if (rpc_hnd_pipe_req(hnd, SAMR_CLOSE_HND, &data, &rdata))
2325 SAMR_R_CLOSE_HND r_c;
2328 samr_io_r_close_hnd("", &r_c, &rdata, 0);
2329 p = rdata.offset != 0;
2331 if (p && r_c.status != 0)
2333 /* report error code */
2334 DEBUG(4,("SAMR_CLOSE_HND: %s\n", get_nt_error_msg(r_c.status)));
2340 /* check that the returned policy handle is all zeros */
2344 for (i = 0; i < sizeof(r_c.pol.data); i++)
2346 if (r_c.pol.data[i] != 0)
2348 valid_close = False;
2354 DEBUG(4,("SAMR_CLOSE_HND: non-zero handle returned\n"));
2359 prs_mem_free(&data );
2360 prs_mem_free(&rdata );
2362 close_policy_hnd(hnd);
2367 /****************************************************************************
2368 do a SAMR query display info
2369 ****************************************************************************/
2370 BOOL samr_query_dispinfo( POLICY_HND *pol_domain, uint16 level,
2371 uint32 *num_entries,
2372 SAM_DISPINFO_CTR *ctr)
2377 SAMR_Q_QUERY_DISPINFO q_o;
2378 BOOL valid_query = False;
2380 DEBUG(4,("SAMR Query Display Info. level: %d\n", level));
2382 if (pol_domain == NULL || num_entries == NULL || ctr == NULL ||
2388 /* create and send a MSRPC command with api SAMR_QUERY_DISPINFO */
2390 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2391 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2393 /* store the parameters */
2394 make_samr_q_query_dispinfo(&q_o, pol_domain, level, 0, 0xffffffff);
2396 /* turn parameters into data stream */
2397 samr_io_q_query_dispinfo("", &q_o, &data, 0);
2399 /* send the data on \PIPE\ */
2400 if (rpc_hnd_pipe_req(pol_domain, SAMR_QUERY_DISPINFO, &data, &rdata))
2402 SAMR_R_QUERY_DISPINFO r_o;
2408 samr_io_r_query_dispinfo("", &r_o, &rdata, 0);
2409 p = rdata.offset != 0;
2411 if (p && r_o.status != 0)
2413 /* report error code */
2414 DEBUG(4,("SAMR_R_QUERY_DISPINFO: %s\n", get_nt_error_msg(r_o.status)));
2418 if (p && r_o.switch_level != level)
2420 DEBUG(4,("SAMR_R_QUERY_DISPINFO: received incorrect level %d\n",
2424 if (p && r_o.ptr_entries != 0)
2427 (*num_entries) = r_o.num_entries;
2431 prs_mem_free(&data );
2432 prs_mem_free(&rdata );