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);
65 /* send the data on \PIPE\ */
66 if (rpc_con_pipe_req(con, SAMR_CHGPASSWD_USER, &data, &rdata))
68 SAMR_R_CHGPASSWD_USER r_e;
71 samr_io_r_chgpasswd_user("", &r_e, &rdata, 0);
73 p = rdata.offset != 0;
74 if (p && r_e.status != 0)
76 /* report error code */
77 DEBUG(4,("SAMR_R_CHGPASSWD_USER: %s\n", get_nt_error_msg(r_e.status)));
88 prs_mem_free(&rdata );
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 uint32 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)
963 uint32 status = NT_STATUS_INVALID_PARAMETER | 0xC0000000;
965 SAMR_Q_CREATE_USER q_o;
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;
992 if (p && r_o.status != 0)
994 /* report error code */
995 DEBUG(4,("SAMR_R_CREATE_USER: %s\n", get_nt_error_msg(r_o.status)));
996 p = r_o.status != NT_STATUS_USER_EXISTS;
1001 memcpy(user_pol, &r_o.user_pol, sizeof(r_o.user_pol));
1002 *rid = r_o.user_rid;
1003 if (!cli_pol_link(user_pol, domain_pol))
1005 status = NT_STATUS_INVALID_HANDLE | 0xC0000000;
1010 prs_mem_free(&data );
1011 prs_mem_free(&rdata );
1016 /****************************************************************************
1017 do a SAMR Create Domain Alias
1018 ****************************************************************************/
1019 BOOL samr_create_dom_alias( POLICY_HND *domain_pol, const char *acct_name,
1020 POLICY_HND *alias_pol, uint32 *rid)
1025 SAMR_Q_CREATE_DOM_ALIAS q_o;
1026 BOOL valid_pol = False;
1028 if (alias_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1030 /* create and send a MSRPC command with api SAMR_CREATE_DOM_ALIAS */
1032 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1033 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1035 DEBUG(4,("SAMR Create Domain Alias. Name:%s\n", acct_name));
1037 /* store the parameters */
1038 make_samr_q_create_dom_alias(&q_o, domain_pol, acct_name);
1040 /* turn parameters into data stream */
1041 samr_io_q_create_dom_alias("", &q_o, &data, 0);
1043 /* send the data on \PIPE\ */
1044 if (rpc_hnd_pipe_req(domain_pol, SAMR_CREATE_DOM_ALIAS, &data, &rdata))
1046 SAMR_R_CREATE_DOM_ALIAS r_o;
1049 samr_io_r_create_dom_alias("", &r_o, &rdata, 0);
1050 p = rdata.offset != 0;
1052 if (p && r_o.status != 0)
1054 /* report error code */
1055 DEBUG(4,("SAMR_R_CREATE_DOM_ALIAS: %s\n", get_nt_error_msg(r_o.status)));
1061 memcpy(alias_pol, &r_o.alias_pol, sizeof(r_o.alias_pol));
1063 valid_pol = cli_pol_link(alias_pol, domain_pol);
1067 prs_mem_free(&data );
1068 prs_mem_free(&rdata );
1073 /****************************************************************************
1074 do a SAMR Get Alias Info
1075 ****************************************************************************/
1076 BOOL samr_query_aliasinfo( POLICY_HND *alias_pol, uint16 switch_value,
1077 ALIAS_INFO_CTR *ctr)
1082 SAMR_Q_QUERY_ALIASINFO q_o;
1083 BOOL valid_pol = False;
1085 if (alias_pol == NULL || ctr == NULL) return False;
1087 /* create and send a MSRPC command with api SAMR_GET_ALIASINFO */
1089 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1090 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1092 DEBUG(4,("SAMR Get Alias Info\n"));
1094 /* store the parameters */
1095 make_samr_q_query_aliasinfo(&q_o, alias_pol, switch_value);
1097 /* turn parameters into data stream */
1098 samr_io_q_query_aliasinfo("", &q_o, &data, 0);
1100 /* send the data on \PIPE\ */
1101 if (rpc_hnd_pipe_req(alias_pol, SAMR_QUERY_ALIASINFO, &data, &rdata))
1103 SAMR_R_QUERY_ALIASINFO r_o;
1106 /* get alias info */
1109 samr_io_r_query_aliasinfo("", &r_o, &rdata, 0);
1110 p = rdata.offset != 0;
1112 if (p && r_o.status != 0)
1114 /* report error code */
1115 DEBUG(4,("SAMR_R_QUERY_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1125 prs_mem_free(&data );
1126 prs_mem_free(&rdata );
1131 /****************************************************************************
1132 do a SAMR Set Alias Info
1133 ****************************************************************************/
1134 BOOL samr_set_aliasinfo( POLICY_HND *alias_pol, ALIAS_INFO_CTR *ctr)
1139 SAMR_Q_SET_ALIASINFO q_o;
1140 BOOL valid_pol = False;
1142 if (alias_pol == NULL || ctr == NULL) return False;
1144 /* create and send a MSRPC command with api SAMR_SET_ALIASINFO */
1146 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1147 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1149 DEBUG(4,("SAMR Set Alias Info\n"));
1151 /* store the parameters */
1152 make_samr_q_set_aliasinfo(&q_o, alias_pol, ctr);
1154 /* turn parameters into data stream */
1155 samr_io_q_set_aliasinfo("", &q_o, &data, 0);
1157 /* send the data on \PIPE\ */
1158 if (rpc_hnd_pipe_req(alias_pol, SAMR_SET_ALIASINFO, &data, &rdata))
1160 SAMR_R_SET_ALIASINFO r_o;
1163 samr_io_r_set_aliasinfo("", &r_o, &rdata, 0);
1164 p = rdata.offset != 0;
1166 if (p && r_o.status != 0)
1168 /* report error code */
1169 DEBUG(4,("SAMR_R_SET_ALIASINFO: %s\n", get_nt_error_msg(r_o.status)));
1179 prs_mem_free(&data );
1180 prs_mem_free(&rdata );
1185 /****************************************************************************
1186 do a SAMR Open Group
1187 ****************************************************************************/
1188 BOOL samr_open_group( const POLICY_HND *domain_pol,
1189 uint32 flags, uint32 rid,
1190 POLICY_HND *group_pol)
1195 SAMR_Q_OPEN_GROUP q_o;
1196 BOOL valid_pol = False;
1198 DEBUG(4,("SAMR Open Group. RID:%x\n", rid));
1200 if (group_pol == NULL || domain_pol == NULL) return False;
1202 /* create and send a MSRPC command with api SAMR_OPEN_GROUP */
1204 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1205 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1207 /* store the parameters */
1208 make_samr_q_open_group(&q_o, domain_pol, flags, rid);
1210 /* turn parameters into data stream */
1211 samr_io_q_open_group("", &q_o, &data, 0);
1213 /* send the data on \PIPE\ */
1214 if (rpc_hnd_pipe_req(domain_pol, SAMR_OPEN_GROUP, &data, &rdata))
1216 SAMR_R_OPEN_GROUP r_o;
1219 samr_io_r_open_group("", &r_o, &rdata, 0);
1220 p = rdata.offset != 0;
1222 if (p && r_o.status != 0)
1224 /* report error code */
1225 DEBUG(4,("SAMR_R_OPEN_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1231 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1232 valid_pol = cli_pol_link(group_pol, domain_pol);
1236 prs_mem_free(&data );
1237 prs_mem_free(&rdata );
1242 /****************************************************************************
1243 do a SAMR Delete Group Member
1244 ****************************************************************************/
1245 BOOL samr_del_groupmem( POLICY_HND *group_pol, uint32 rid)
1250 SAMR_Q_DEL_GROUPMEM q_o;
1251 BOOL valid_pol = False;
1253 if (group_pol == NULL) return False;
1255 /* create and send a MSRPC command with api SAMR_DEL_GROUPMEM */
1257 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1258 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1260 DEBUG(4,("SAMR Delete Group Member.\n"));
1262 /* store the parameters */
1263 make_samr_q_del_groupmem(&q_o, group_pol, rid);
1265 /* turn parameters into data stream */
1266 samr_io_q_del_groupmem("", &q_o, &data, 0);
1268 /* send the data on \PIPE\ */
1269 if (rpc_hnd_pipe_req(group_pol, SAMR_DEL_GROUPMEM, &data, &rdata))
1271 SAMR_R_DEL_GROUPMEM r_o;
1274 samr_io_r_del_groupmem("", &r_o, &rdata, 0);
1275 p = rdata.offset != 0;
1277 if (p && r_o.status != 0)
1279 /* report error code */
1280 DEBUG(4,("SAMR_R_DEL_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1290 prs_mem_free(&data );
1291 prs_mem_free(&rdata );
1296 /****************************************************************************
1297 do a SAMR Add Group Member
1298 ****************************************************************************/
1299 BOOL samr_add_groupmem( POLICY_HND *group_pol, uint32 rid)
1304 SAMR_Q_ADD_GROUPMEM q_o;
1305 BOOL valid_pol = False;
1307 if (group_pol == NULL) return False;
1309 /* create and send a MSRPC command with api SAMR_ADD_GROUPMEM */
1311 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1312 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1314 DEBUG(4,("SAMR Add Group Member.\n"));
1316 /* store the parameters */
1317 make_samr_q_add_groupmem(&q_o, group_pol, rid);
1319 /* turn parameters into data stream */
1320 samr_io_q_add_groupmem("", &q_o, &data, 0);
1322 /* send the data on \PIPE\ */
1323 if (rpc_hnd_pipe_req(group_pol, SAMR_ADD_GROUPMEM, &data, &rdata))
1325 SAMR_R_ADD_GROUPMEM r_o;
1328 samr_io_r_add_groupmem("", &r_o, &rdata, 0);
1329 p = rdata.offset != 0;
1331 if (p && r_o.status != 0)
1333 /* report error code */
1334 DEBUG(4,("SAMR_R_ADD_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1344 prs_mem_free(&data );
1345 prs_mem_free(&rdata );
1350 /****************************************************************************
1351 do a SAMR Delete Domain Group
1352 ****************************************************************************/
1353 BOOL samr_delete_dom_group( POLICY_HND *group_pol)
1358 SAMR_Q_DELETE_DOM_GROUP q_o;
1359 BOOL valid_pol = False;
1361 if (group_pol == NULL) return False;
1363 /* delete and send a MSRPC command with api SAMR_DELETE_DOM_GROUP */
1365 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1366 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1368 DEBUG(4,("SAMR Delete Domain Group.\n"));
1370 /* store the parameters */
1371 make_samr_q_delete_dom_group(&q_o, group_pol);
1373 /* turn parameters into data stream */
1374 samr_io_q_delete_dom_group("", &q_o, &data, 0);
1376 /* send the data on \PIPE\ */
1377 if (rpc_hnd_pipe_req(group_pol, SAMR_DELETE_DOM_GROUP, &data, &rdata))
1379 SAMR_R_DELETE_DOM_GROUP r_o;
1382 samr_io_r_delete_dom_group("", &r_o, &rdata, 0);
1383 p = rdata.offset != 0;
1385 if (p && r_o.status != 0)
1387 /* report error code */
1388 DEBUG(4,("SAMR_R_DELETE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1398 prs_mem_free(&data );
1399 prs_mem_free(&rdata );
1404 /****************************************************************************
1405 do a SAMR Create Domain Group
1406 ****************************************************************************/
1407 BOOL samr_create_dom_group( POLICY_HND *domain_pol, const char *acct_name,
1408 POLICY_HND *group_pol, uint32 *rid)
1413 SAMR_Q_CREATE_DOM_GROUP q_o;
1414 BOOL valid_pol = False;
1416 if (group_pol == NULL || domain_pol == NULL || acct_name == NULL || rid == NULL) return False;
1418 /* create and send a MSRPC command with api SAMR_CREATE_DOM_GROUP */
1420 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1421 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1423 DEBUG(4,("SAMR Create Domain Group. Name:%s\n", acct_name));
1425 /* store the parameters */
1426 make_samr_q_create_dom_group(&q_o, domain_pol, acct_name);
1428 /* turn parameters into data stream */
1429 samr_io_q_create_dom_group("", &q_o, &data, 0);
1431 /* send the data on \PIPE\ */
1432 if (rpc_hnd_pipe_req(domain_pol, SAMR_CREATE_DOM_GROUP, &data, &rdata))
1434 SAMR_R_CREATE_DOM_GROUP r_o;
1437 samr_io_r_create_dom_group("", &r_o, &rdata, 0);
1438 p = rdata.offset != 0;
1440 if (p && r_o.status != 0)
1442 /* report error code */
1443 DEBUG(4,("SAMR_R_CREATE_DOM_GROUP: %s\n", get_nt_error_msg(r_o.status)));
1449 memcpy(group_pol, &r_o.pol, sizeof(r_o.pol));
1451 valid_pol = cli_pol_link(group_pol, domain_pol);
1455 prs_mem_free(&data );
1456 prs_mem_free(&rdata );
1461 /****************************************************************************
1462 do a SAMR Set Group Info
1463 ****************************************************************************/
1464 BOOL samr_set_groupinfo( POLICY_HND *group_pol, GROUP_INFO_CTR *ctr)
1469 SAMR_Q_SET_GROUPINFO q_o;
1470 BOOL valid_pol = False;
1472 if (group_pol == NULL || ctr == NULL) return False;
1474 /* create and send a MSRPC command with api SAMR_SET_GROUPINFO */
1476 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1477 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1479 DEBUG(4,("SAMR Set Group Info\n"));
1481 /* store the parameters */
1482 make_samr_q_set_groupinfo(&q_o, group_pol, ctr);
1484 /* turn parameters into data stream */
1485 samr_io_q_set_groupinfo("", &q_o, &data, 0);
1487 /* send the data on \PIPE\ */
1488 if (rpc_hnd_pipe_req(group_pol, SAMR_SET_GROUPINFO, &data, &rdata))
1490 SAMR_R_SET_GROUPINFO r_o;
1493 samr_io_r_set_groupinfo("", &r_o, &rdata, 0);
1494 p = rdata.offset != 0;
1496 if (p && r_o.status != 0)
1498 /* report error code */
1499 DEBUG(4,("SAMR_R_SET_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
1509 prs_mem_free(&data );
1510 prs_mem_free(&rdata );
1515 /****************************************************************************
1516 do a SAMR Open Domain
1517 ****************************************************************************/
1518 BOOL samr_open_domain( const POLICY_HND *connect_pol,
1521 POLICY_HND *domain_pol)
1527 SAMR_Q_OPEN_DOMAIN q_o;
1528 BOOL valid_pol = False;
1530 if (DEBUGLEVEL >= 4)
1532 sid_to_string(sid_str, sid);
1533 DEBUG(4,("SAMR Open Domain. SID:%s Permissions:%x\n",
1534 sid_str, ace_perms));
1537 if (connect_pol == NULL || sid == NULL || domain_pol == NULL) return False;
1539 /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
1541 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1542 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1544 /* store the parameters */
1545 make_samr_q_open_domain(&q_o, connect_pol, ace_perms, sid);
1547 /* turn parameters into data stream */
1548 samr_io_q_open_domain("", &q_o, &data, 0);
1550 /* send the data on \PIPE\ */
1551 if (rpc_hnd_pipe_req(connect_pol, SAMR_OPEN_DOMAIN, &data, &rdata))
1553 SAMR_R_OPEN_DOMAIN r_o;
1556 samr_io_r_open_domain("", &r_o, &rdata, 0);
1557 p = rdata.offset != 0;
1559 if (p && r_o.status != 0)
1561 /* report error code */
1562 DEBUG(4,("SAMR_R_OPEN_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1568 memcpy(domain_pol, &r_o.domain_pol, sizeof(r_o.domain_pol));
1569 valid_pol = cli_pol_link(domain_pol, connect_pol);
1573 prs_mem_free(&data );
1574 prs_mem_free(&rdata );
1579 /****************************************************************************
1580 do a SAMR Query Lookup Domain
1581 ****************************************************************************/
1582 BOOL samr_query_lookup_domain( POLICY_HND *pol, const char *dom_name,
1588 SAMR_Q_LOOKUP_DOMAIN q_o;
1589 BOOL valid_query = False;
1591 if (pol == NULL || dom_name == NULL || dom_sid == NULL) return False;
1593 /* create and send a MSRPC command with api SAMR_LOOKUP_DOMAIN */
1595 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1596 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1598 DEBUG(4,("SAMR Query Lookup Domain.\n"));
1600 /* store the parameters */
1601 make_samr_q_lookup_domain(&q_o, pol, dom_name);
1603 /* turn parameters into data stream */
1604 samr_io_q_lookup_domain("", &q_o, &data, 0);
1606 /* send the data on \PIPE\ */
1607 if (rpc_hnd_pipe_req(pol, SAMR_LOOKUP_DOMAIN, &data, &rdata))
1609 SAMR_R_LOOKUP_DOMAIN r_o;
1612 samr_io_r_lookup_domain("", &r_o, &rdata, 0);
1613 p = rdata.offset != 0;
1615 if (p && r_o.status != 0)
1617 /* report error code */
1618 DEBUG(4,("SAMR_R_LOOKUP_DOMAIN: %s\n", get_nt_error_msg(r_o.status)));
1622 if (p && r_o.ptr_sid != 0)
1624 sid_copy(dom_sid, &r_o.dom_sid.sid);
1629 prs_mem_free(&data );
1630 prs_mem_free(&rdata );
1635 /****************************************************************************
1636 do a SAMR Query Lookup Names
1637 ****************************************************************************/
1638 BOOL samr_query_lookup_names( POLICY_HND *pol, uint32 flags,
1639 uint32 num_names, char **names,
1641 uint32 rid[MAX_LOOKUP_SIDS],
1642 uint32 type[MAX_LOOKUP_SIDS])
1647 SAMR_Q_LOOKUP_NAMES q_o;
1648 BOOL valid_query = False;
1650 if (pol == NULL || flags == 0 || num_names == 0 || names == NULL ||
1651 num_rids == NULL || rid == NULL || type == NULL ) return False;
1653 /* create and send a MSRPC command with api SAMR_LOOKUP_NAMES */
1655 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1656 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1658 DEBUG(4,("SAMR Query Lookup NAMES.\n"));
1660 /* store the parameters */
1661 make_samr_q_lookup_names(&q_o, pol, flags, num_names, names);
1663 /* turn parameters into data stream */
1664 samr_io_q_lookup_names("", &q_o, &data, 0);
1666 /* send the data on \PIPE\ */
1667 if (rpc_hnd_pipe_req(pol, SAMR_LOOKUP_NAMES, &data, &rdata))
1669 SAMR_R_LOOKUP_NAMES r_o;
1672 samr_io_r_lookup_names("", &r_o, &rdata, 0);
1673 p = rdata.offset != 0;
1675 if (p && r_o.status != 0)
1677 /* report error code */
1678 DEBUG(4,("SAMR_R_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_o.status)));
1679 p = r_o.status == 0x107;
1684 if (r_o.ptr_rids != 0 && r_o.ptr_types != 0 &&
1685 r_o.num_types1 == r_o.num_rids1)
1690 *num_rids = r_o.num_rids1;
1692 for (i = 0; i < r_o.num_rids1; i++)
1694 rid[i] = r_o.rid[i];
1696 for (i = 0; i < r_o.num_types1; i++)
1698 type[i] = r_o.type[i];
1701 else if (r_o.ptr_rids == 0 && r_o.ptr_types == 0)
1713 prs_mem_free(&data );
1714 prs_mem_free(&rdata );
1719 /****************************************************************************
1720 do a SAMR Query Lookup RIDS
1721 ****************************************************************************/
1722 BOOL samr_query_lookup_rids( const POLICY_HND *pol, uint32 flags,
1723 uint32 num_rids, uint32 *rids,
1731 SAMR_Q_LOOKUP_RIDS q_o;
1732 BOOL valid_query = False;
1734 if (pol == NULL || flags == 0 || num_rids == 0 || rids == NULL ||
1735 num_names == NULL || names == NULL || type == NULL ) return False;
1737 /* create and send a MSRPC command with api SAMR_LOOKUP_RIDS */
1739 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1740 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1742 DEBUG(4,("SAMR Query Lookup RIDs.\n"));
1744 /* store the parameters */
1745 make_samr_q_lookup_rids(&q_o, pol, flags, num_rids, rids);
1747 /* turn parameters into data stream */
1748 samr_io_q_lookup_rids("", &q_o, &data, 0);
1750 /* send the data on \PIPE\ */
1751 if (rpc_hnd_pipe_req(pol, SAMR_LOOKUP_RIDS, &data, &rdata))
1753 SAMR_R_LOOKUP_RIDS r_o;
1757 samr_io_r_lookup_rids("", &r_o, &rdata, 0);
1758 p = rdata.offset != 0;
1760 if (p && r_o.status != 0)
1762 /* report error code */
1763 DEBUG(4,("SAMR_R_LOOKUP_RIDS: %s\n", get_nt_error_msg(r_o.status)));
1769 if (r_o.ptr_names != 0 && r_o.ptr_types != 0 &&
1770 r_o.num_types1 == r_o.num_names1)
1778 for (i = 0; i < r_o.num_names1; i++)
1781 unistr2_to_ascii(tmp, &r_o.uni_name[i], sizeof(tmp)-1);
1782 add_chars_to_array(num_names, names, tmp);
1785 if ((*num_names) != 0)
1787 (*type) = (uint32*)malloc((*num_names) * sizeof(**type));
1790 for (i = 0; (*type) != NULL && i < r_o.num_types1; i++)
1792 (*type)[i] = r_o.type[i];
1795 else if (r_o.ptr_names == 0 && r_o.ptr_types == 0)
1808 samr_free_r_lookup_rids(&r_o);
1811 prs_mem_free(&data );
1812 prs_mem_free(&rdata );
1817 /****************************************************************************
1818 do a SAMR Query Alias Members
1819 ****************************************************************************/
1820 BOOL samr_query_aliasmem( const POLICY_HND *alias_pol,
1821 uint32 *num_mem, DOM_SID2 *sid)
1826 SAMR_Q_QUERY_ALIASMEM q_o;
1827 BOOL valid_query = False;
1829 DEBUG(4,("SAMR Query Alias Members.\n"));
1831 if (alias_pol == NULL || sid == NULL || num_mem == NULL) return False;
1833 /* create and send a MSRPC command with api SAMR_QUERY_ALIASMEM */
1835 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1836 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1838 /* store the parameters */
1839 make_samr_q_query_aliasmem(&q_o, alias_pol);
1841 /* turn parameters into data stream */
1842 samr_io_q_query_aliasmem("", &q_o, &data, 0);
1844 /* send the data on \PIPE\ */
1845 if (rpc_hnd_pipe_req(alias_pol, SAMR_QUERY_ALIASMEM, &data, &rdata))
1847 SAMR_R_QUERY_ALIASMEM r_o;
1853 samr_io_r_query_aliasmem("", &r_o, &rdata, 0);
1854 p = rdata.offset != 0;
1856 if (p && r_o.status != 0)
1858 /* report error code */
1859 DEBUG(4,("SAMR_R_QUERY_ALIASMEM: %s\n", get_nt_error_msg(r_o.status)));
1863 if (p && r_o.ptr != 0)
1866 *num_mem = r_o.num_sids;
1871 prs_mem_free(&data );
1872 prs_mem_free(&rdata );
1877 /****************************************************************************
1878 do a SAMR Query User Aliases
1879 ****************************************************************************/
1880 BOOL samr_query_useraliases( const POLICY_HND *pol,
1881 uint32 *ptr_sid, DOM_SID2 *sid,
1882 uint32 *num_aliases, uint32 **rid)
1887 SAMR_Q_QUERY_USERALIASES q_o;
1888 BOOL valid_query = False;
1891 DEBUG(4,("SAMR Query User Aliases.\n"));
1893 if (pol == NULL || sid == NULL || rid == NULL || num_aliases == 0) return False;
1895 /* create and send a MSRPC command with api SAMR_QUERY_USERALIASES */
1897 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1898 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1900 /* store the parameters */
1901 make_samr_q_query_useraliases(&q_o, pol, ptr_sid, sid);
1903 /* turn parameters into data stream */
1904 samr_io_q_query_useraliases("", &q_o, &data, 0);
1906 /* send the data on \PIPE\ */
1907 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_USERALIASES, &data, &rdata))
1909 SAMR_R_QUERY_USERALIASES r_o;
1914 samr_io_r_query_useraliases("", &r_o, &rdata, 0);
1916 p = rdata.offset != 0;
1918 if (p && r_o.status != 0)
1920 /* report error code */
1921 DEBUG(4,("SAMR_R_QUERY_USERALIASES: %s\n", get_nt_error_msg(r_o.status)));
1925 if (p && r_o.ptr != 0)
1928 *num_aliases = r_o.num_entries;
1933 prs_mem_free(&data );
1934 prs_mem_free(&rdata );
1939 /****************************************************************************
1940 do a SAMR Query Group Members
1941 ****************************************************************************/
1942 BOOL samr_query_groupmem( POLICY_HND *group_pol,
1943 uint32 *num_mem, uint32 **rid, uint32 **attr)
1948 SAMR_Q_QUERY_GROUPMEM q_o;
1949 BOOL valid_query = False;
1951 DEBUG(4,("SAMR Query Group Members.\n"));
1953 if (group_pol == NULL || rid == NULL || attr == NULL || num_mem == NULL) return False;
1955 /* create and send a MSRPC command with api SAMR_QUERY_GROUPMEM */
1957 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
1958 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
1960 /* store the parameters */
1961 make_samr_q_query_groupmem(&q_o, group_pol);
1963 /* turn parameters into data stream */
1964 samr_io_q_query_groupmem("", &q_o, &data, 0);
1966 /* send the data on \PIPE\ */
1967 if (rpc_hnd_pipe_req(group_pol, SAMR_QUERY_GROUPMEM, &data, &rdata))
1969 SAMR_R_QUERY_GROUPMEM r_o;
1975 samr_io_r_query_groupmem("", &r_o, &rdata, 0);
1978 p = rdata.offset != 0;
1980 if (p && r_o.status != 0)
1982 /* report error code */
1983 DEBUG(4,("SAMR_R_QUERY_GROUPMEM: %s\n", get_nt_error_msg(r_o.status)));
1987 if (p && r_o.ptr != 0 &&
1988 r_o.ptr_rids != 0 && r_o.ptr_attrs != 0 &&
1989 r_o.num_rids == r_o.num_attrs)
1992 *num_mem = r_o.num_rids;
1997 prs_mem_free(&data );
1998 prs_mem_free(&rdata );
2003 /****************************************************************************
2004 do a SAMR Query User Groups
2005 ****************************************************************************/
2006 BOOL samr_query_usergroups( POLICY_HND *pol, uint32 *num_groups,
2012 SAMR_Q_QUERY_USERGROUPS q_o;
2013 BOOL valid_query = False;
2015 DEBUG(4,("SAMR Query User Groups.\n"));
2017 if (pol == NULL || gid == NULL || num_groups == 0) return False;
2019 /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
2021 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2022 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2024 /* store the parameters */
2025 make_samr_q_query_usergroups(&q_o, pol);
2027 /* turn parameters into data stream */
2028 samr_io_q_query_usergroups("", &q_o, &data, 0);
2030 /* send the data on \PIPE\ */
2031 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_USERGROUPS, &data, &rdata))
2033 SAMR_R_QUERY_USERGROUPS r_o;
2039 samr_io_r_query_usergroups("", &r_o, &rdata, 0);
2041 p = rdata.offset != 0;
2043 if (p && r_o.status != 0)
2045 /* report error code */
2046 DEBUG(4,("SAMR_R_QUERY_USERGROUPS: %s\n", get_nt_error_msg(r_o.status)));
2050 if (p && r_o.ptr_0 != 0)
2053 *num_groups = r_o.num_entries;
2058 prs_mem_free(&data );
2059 prs_mem_free(&rdata );
2064 /****************************************************************************
2065 do a SAMR Query Group Info
2066 ****************************************************************************/
2067 BOOL samr_query_groupinfo( POLICY_HND *pol,
2068 uint16 switch_value, GROUP_INFO_CTR* ctr)
2073 SAMR_Q_QUERY_GROUPINFO q_o;
2074 BOOL valid_query = False;
2076 DEBUG(4,("SAMR Query Group Info. level: %d\n", switch_value));
2078 if (pol == NULL || ctr == NULL || switch_value == 0) return False;
2080 /* create and send a MSRPC command with api SAMR_QUERY_GROUPINFO */
2082 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2083 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2085 /* store the parameters */
2086 make_samr_q_query_groupinfo(&q_o, pol, switch_value);
2088 /* turn parameters into data stream */
2089 samr_io_q_query_groupinfo("", &q_o, &data, 0);
2091 /* send the data on \PIPE\ */
2092 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_GROUPINFO, &data, &rdata))
2094 SAMR_R_QUERY_GROUPINFO r_o;
2097 /* get group info */
2100 samr_io_r_query_groupinfo("", &r_o, &rdata, 0);
2101 p = rdata.offset != 0;
2103 if (p && r_o.status != 0)
2105 /* report error code */
2106 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: %s\n", get_nt_error_msg(r_o.status)));
2110 if (p && r_o.ctr->switch_value1 != switch_value)
2112 DEBUG(4,("SAMR_R_QUERY_GROUPINFO: received incorrect level %d\n",
2113 r_o.ctr->switch_value1));
2116 if (p && r_o.ptr != 0)
2122 prs_mem_free(&data );
2123 prs_mem_free(&rdata );
2128 /****************************************************************************
2129 do a SAMR Set User Info
2130 ****************************************************************************/
2131 BOOL samr_set_userinfo2( POLICY_HND *pol, uint16 switch_value,
2137 SAMR_Q_SET_USERINFO2 q_o;
2138 BOOL valid_query = False;
2140 DEBUG(4,("SAMR Set User Info 2. level: %d\n", switch_value));
2142 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2144 /* create and send a MSRPC command with api SAMR_SET_USERINFO2 */
2146 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2147 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2149 /* store the parameters */
2150 make_samr_q_set_userinfo2(&q_o, pol, switch_value, usr);
2152 /* turn parameters into data stream */
2153 samr_io_q_set_userinfo2("", &q_o, &data, 0);
2155 /* send the data on \PIPE\ */
2156 if (rpc_hnd_pipe_req(pol, SAMR_SET_USERINFO2, &data, &rdata))
2158 SAMR_R_SET_USERINFO2 r_o;
2161 samr_io_r_set_userinfo2("", &r_o, &rdata, 0);
2162 p = rdata.offset != 0;
2164 if (p && r_o.status != 0)
2166 /* report error code */
2167 DEBUG(4,("SAMR_R_QUERY_USERINFO2: %s\n", get_nt_error_msg(r_o.status)));
2177 prs_mem_free(&data );
2178 prs_mem_free(&rdata );
2183 /****************************************************************************
2184 do a SAMR Set User Info
2185 ****************************************************************************/
2186 BOOL samr_set_userinfo( POLICY_HND *pol, uint16 switch_value, void* usr)
2191 SAMR_Q_SET_USERINFO q_o;
2192 BOOL valid_query = False;
2194 DEBUG(4,("SAMR Set User Info. level: %d\n", switch_value));
2196 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2198 /* create and send a MSRPC command with api SAMR_SET_USERINFO */
2200 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2201 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2203 /* store the parameters */
2204 make_samr_q_set_userinfo(&q_o, pol, switch_value, usr);
2206 /* turn parameters into data stream */
2207 samr_io_q_set_userinfo("", &q_o, &data, 0);
2209 /* send the data on \PIPE\ */
2210 if (rpc_hnd_pipe_req(pol, SAMR_SET_USERINFO, &data, &rdata))
2212 SAMR_R_SET_USERINFO r_o;
2215 samr_io_r_set_userinfo("", &r_o, &rdata, 0);
2216 p = rdata.offset != 0;
2218 if (p && r_o.status != 0)
2220 /* report error code */
2221 DEBUG(4,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2231 prs_mem_free(&data );
2232 prs_mem_free(&rdata );
2237 /****************************************************************************
2238 do a SAMR Query User Info
2239 ****************************************************************************/
2240 BOOL samr_query_userinfo( POLICY_HND *pol, uint16 switch_value, void* usr)
2245 SAMR_Q_QUERY_USERINFO q_o;
2246 BOOL valid_query = False;
2248 DEBUG(4,("SAMR Query User Info. level: %d\n", switch_value));
2250 if (pol == NULL || usr == NULL || switch_value == 0) return False;
2252 /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
2254 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2255 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2257 /* store the parameters */
2258 make_samr_q_query_userinfo(&q_o, pol, switch_value);
2260 /* turn parameters into data stream */
2261 samr_io_q_query_userinfo("", &q_o, &data, 0);
2263 /* send the data on \PIPE\ */
2264 if (rpc_hnd_pipe_req(pol, SAMR_QUERY_USERINFO, &data, &rdata))
2266 SAMR_R_QUERY_USERINFO r_o;
2272 samr_io_r_query_userinfo("", &r_o, &rdata, 0);
2273 p = rdata.offset != 0;
2275 if (p && r_o.status != 0)
2277 /* report error code */
2278 DEBUG(4,("SAMR_R_QUERY_USERINFO: %s\n", get_nt_error_msg(r_o.status)));
2282 if (p && r_o.switch_value != switch_value)
2284 DEBUG(4,("SAMR_R_QUERY_USERINFO: received incorrect level %d\n",
2288 if (p && r_o.ptr != 0)
2294 prs_mem_free(&data );
2295 prs_mem_free(&rdata );
2300 /****************************************************************************
2302 ****************************************************************************/
2303 BOOL samr_close( POLICY_HND *hnd)
2308 SAMR_Q_CLOSE_HND q_c;
2309 BOOL valid_close = False;
2311 DEBUG(4,("SAMR Close\n"));
2313 if (hnd == NULL) return False;
2315 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2316 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2318 /* create and send a MSRPC command with api SAMR_CLOSE_HND */
2320 /* store the parameters */
2321 make_samr_q_close_hnd(&q_c, hnd);
2323 /* turn parameters into data stream */
2324 samr_io_q_close_hnd("", &q_c, &data, 0);
2326 /* send the data on \PIPE\ */
2327 if (rpc_hnd_pipe_req(hnd, SAMR_CLOSE_HND, &data, &rdata))
2329 SAMR_R_CLOSE_HND r_c;
2332 samr_io_r_close_hnd("", &r_c, &rdata, 0);
2333 p = rdata.offset != 0;
2335 if (p && r_c.status != 0)
2337 /* report error code */
2338 DEBUG(4,("SAMR_CLOSE_HND: %s\n", get_nt_error_msg(r_c.status)));
2344 /* check that the returned policy handle is all zeros */
2348 for (i = 0; i < sizeof(r_c.pol.data); i++)
2350 if (r_c.pol.data[i] != 0)
2352 valid_close = False;
2358 DEBUG(4,("SAMR_CLOSE_HND: non-zero handle returned\n"));
2363 prs_mem_free(&data );
2364 prs_mem_free(&rdata );
2366 close_policy_hnd(hnd);
2371 /****************************************************************************
2372 do a SAMR query display info
2373 ****************************************************************************/
2374 BOOL samr_query_dispinfo( POLICY_HND *pol_domain, uint16 level,
2375 uint32 *num_entries,
2376 SAM_DISPINFO_CTR *ctr)
2381 SAMR_Q_QUERY_DISPINFO q_o;
2382 BOOL valid_query = False;
2384 DEBUG(4,("SAMR Query Display Info. level: %d\n", level));
2386 if (pol_domain == NULL || num_entries == NULL || ctr == NULL ||
2392 /* create and send a MSRPC command with api SAMR_QUERY_DISPINFO */
2394 prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
2395 prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
2397 /* store the parameters */
2398 make_samr_q_query_dispinfo(&q_o, pol_domain, level, 0, 0xffffffff);
2400 /* turn parameters into data stream */
2401 samr_io_q_query_dispinfo("", &q_o, &data, 0);
2403 /* send the data on \PIPE\ */
2404 if (rpc_hnd_pipe_req(pol_domain, SAMR_QUERY_DISPINFO, &data, &rdata))
2406 SAMR_R_QUERY_DISPINFO r_o;
2412 samr_io_r_query_dispinfo("", &r_o, &rdata, 0);
2413 p = rdata.offset != 0;
2415 if (p && r_o.status != 0)
2417 /* report error code */
2418 DEBUG(4,("SAMR_R_QUERY_DISPINFO: %s\n", get_nt_error_msg(r_o.status)));
2422 if (p && r_o.switch_level != level)
2424 DEBUG(4,("SAMR_R_QUERY_DISPINFO: received incorrect level %d\n",
2428 if (p && r_o.ptr_entries != 0)
2431 (*num_entries) = r_o.num_entries;
2435 prs_mem_free(&data );
2436 prs_mem_free(&rdata );