2 Unix SMB/CIFS implementation.
5 Copyright (C) Andrew Tridgell 1992-2000,
6 Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
7 Copyright (C) Elrond 2000,
8 Copyright (C) Tim Potter 2000
9 Copyright (C) Guenther Deschner 2008
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include "rpcclient.h"
27 #include "../libcli/auth/libcli_auth.h"
28 #include "../librpc/gen_ndr/ndr_samr.h"
29 #include "../librpc/gen_ndr/ndr_samr_c.h"
30 #include "rpc_client/cli_samr.h"
31 #include "rpc_client/init_samr.h"
32 #include "rpc_client/init_lsa.h"
33 #include "../libcli/security/security.h"
34 #include "lib/util/smb_strtox.h"
36 static struct dom_sid domain_sid
;
38 /****************************************************************************
39 display samr_user_info_7 structure
40 ****************************************************************************/
41 static void display_samr_user_info_7(struct samr_UserInfo7
*r
)
43 printf("\tUser Name :\t%s\n", r
->account_name
.string
);
46 /****************************************************************************
47 display samr_user_info_9 structure
48 ****************************************************************************/
49 static void display_samr_user_info_9(struct samr_UserInfo9
*r
)
51 printf("\tPrimary group RID :\tox%x\n", r
->primary_gid
);
54 /****************************************************************************
55 display samr_user_info_16 structure
56 ****************************************************************************/
57 static void display_samr_user_info_16(struct samr_UserInfo16
*r
)
59 printf("\tAcct Flags :\tox%x\n", r
->acct_flags
);
62 /****************************************************************************
63 display samr_user_info_20 structure
64 ****************************************************************************/
65 static void display_samr_user_info_20(struct samr_UserInfo20
*r
)
67 printf("\tRemote Dial :\n");
68 dump_data(0, (uint8_t *)r
->parameters
.array
, r
->parameters
.length
*2);
72 /****************************************************************************
73 display samr_user_info_21 structure
74 ****************************************************************************/
75 static void display_samr_user_info_21(struct samr_UserInfo21
*r
)
77 printf("\tUser Name :\t%s\n", r
->account_name
.string
);
78 printf("\tFull Name :\t%s\n", r
->full_name
.string
);
79 printf("\tHome Drive :\t%s\n", r
->home_directory
.string
);
80 printf("\tDir Drive :\t%s\n", r
->home_drive
.string
);
81 printf("\tProfile Path:\t%s\n", r
->profile_path
.string
);
82 printf("\tLogon Script:\t%s\n", r
->logon_script
.string
);
83 printf("\tDescription :\t%s\n", r
->description
.string
);
84 printf("\tWorkstations:\t%s\n", r
->workstations
.string
);
85 printf("\tComment :\t%s\n", r
->comment
.string
);
86 printf("\tRemote Dial :\n");
87 dump_data(0, (uint8_t *)r
->parameters
.array
, r
->parameters
.length
*2);
89 printf("\tLogon Time :\t%s\n",
90 http_timestring(talloc_tos(), nt_time_to_unix(r
->last_logon
)));
91 printf("\tLogoff Time :\t%s\n",
92 http_timestring(talloc_tos(), nt_time_to_unix(r
->last_logoff
)));
93 printf("\tKickoff Time :\t%s\n",
94 http_timestring(talloc_tos(), nt_time_to_unix(r
->acct_expiry
)));
95 printf("\tPassword last set Time :\t%s\n",
96 http_timestring(talloc_tos(), nt_time_to_unix(r
->last_password_change
)));
97 printf("\tPassword can change Time :\t%s\n",
98 http_timestring(talloc_tos(), nt_time_to_unix(r
->allow_password_change
)));
99 printf("\tPassword must change Time:\t%s\n",
100 http_timestring(talloc_tos(), nt_time_to_unix(r
->force_password_change
)));
102 printf("\tunknown_2[0..31]...\n"); /* user passwords? */
104 printf("\tuser_rid :\t0x%x\n" , r
->rid
); /* User ID */
105 printf("\tgroup_rid:\t0x%x\n" , r
->primary_gid
); /* Group ID */
106 printf("\tacb_info :\t0x%08x\n", r
->acct_flags
); /* Account Control Info */
108 printf("\tfields_present:\t0x%08x\n", r
->fields_present
); /* 0x00ff ffff */
109 printf("\tlogon_divs:\t%d\n", r
->logon_hours
.units_per_week
); /* 0x0000 00a8 which is 168 which is num hrs in a week */
110 printf("\tbad_password_count:\t0x%08x\n", r
->bad_password_count
);
111 printf("\tlogon_count:\t0x%08x\n", r
->logon_count
);
113 printf("\tpadding1[0..7]...\n");
115 if (r
->logon_hours
.bits
) {
116 printf("\tlogon_hrs[0..%d]...\n", r
->logon_hours
.units_per_week
/8);
121 static void display_password_properties(uint32_t password_properties
)
123 printf("password_properties: 0x%08x\n", password_properties
);
125 if (password_properties
& DOMAIN_PASSWORD_COMPLEX
)
126 printf("\tDOMAIN_PASSWORD_COMPLEX\n");
128 if (password_properties
& DOMAIN_PASSWORD_NO_ANON_CHANGE
)
129 printf("\tDOMAIN_PASSWORD_NO_ANON_CHANGE\n");
131 if (password_properties
& DOMAIN_PASSWORD_NO_CLEAR_CHANGE
)
132 printf("\tDOMAIN_PASSWORD_NO_CLEAR_CHANGE\n");
134 if (password_properties
& DOMAIN_PASSWORD_LOCKOUT_ADMINS
)
135 printf("\tDOMAIN_PASSWORD_LOCKOUT_ADMINS\n");
137 if (password_properties
& DOMAIN_PASSWORD_STORE_CLEARTEXT
)
138 printf("\tDOMAIN_PASSWORD_STORE_CLEARTEXT\n");
140 if (password_properties
& DOMAIN_REFUSE_PASSWORD_CHANGE
)
141 printf("\tDOMAIN_REFUSE_PASSWORD_CHANGE\n");
144 static void display_sam_dom_info_1(struct samr_DomInfo1
*info1
)
146 printf("Minimum password length:\t\t\t%d\n",
147 info1
->min_password_length
);
148 printf("Password uniqueness (remember x passwords):\t%d\n",
149 info1
->password_history_length
);
150 display_password_properties(info1
->password_properties
);
151 printf("password expire in:\t\t\t\t%s\n",
152 display_time(info1
->max_password_age
));
153 printf("Min password age (allow changing in x days):\t%s\n",
154 display_time(info1
->min_password_age
));
157 static void display_sam_dom_info_2(struct samr_DomGeneralInformation
*general
)
159 printf("Domain:\t\t%s\n", general
->domain_name
.string
);
160 printf("Server:\t\t%s\n", general
->primary
.string
);
161 printf("Comment:\t%s\n", general
->oem_information
.string
);
163 printf("Total Users:\t%d\n", general
->num_users
);
164 printf("Total Groups:\t%d\n", general
->num_groups
);
165 printf("Total Aliases:\t%d\n", general
->num_aliases
);
167 printf("Sequence No:\t%llu\n", (unsigned long long)general
->sequence_num
);
169 printf("Force Logoff:\t%" PRIu64
"\n",
170 (uint64_t)nt_time_to_unix_abs(&general
->force_logoff_time
));
172 printf("Domain Server State:\t0x%x\n", general
->domain_server_state
);
173 printf("Server Role:\t%s\n", server_role_str(general
->role
));
174 printf("Unknown 3:\t0x%x\n", general
->unknown3
);
177 static void display_sam_dom_info_3(struct samr_DomInfo3
*info3
)
179 printf("Force Logoff:\t%d\n",
180 (int)nt_time_to_unix_abs(&info3
->force_logoff_time
));
183 static void display_sam_dom_info_4(struct samr_DomOEMInformation
*oem
)
185 printf("Comment:\t%s\n", oem
->oem_information
.string
);
188 static void display_sam_dom_info_5(struct samr_DomInfo5
*info5
)
190 printf("Domain:\t\t%s\n", info5
->domain_name
.string
);
193 static void display_sam_dom_info_6(struct samr_DomInfo6
*info6
)
195 printf("Server:\t\t%s\n", info6
->primary
.string
);
198 static void display_sam_dom_info_7(struct samr_DomInfo7
*info7
)
200 printf("Server Role:\t%s\n", server_role_str(info7
->role
));
203 static void display_sam_dom_info_8(struct samr_DomInfo8
*info8
)
205 printf("Sequence No:\t%llu\n", (unsigned long long)info8
->sequence_num
);
206 printf("Domain Create Time:\t%s\n",
207 http_timestring(talloc_tos(), nt_time_to_unix(info8
->domain_create_time
)));
210 static void display_sam_dom_info_9(struct samr_DomInfo9
*info9
)
212 printf("Domain Server State:\t0x%x\n", info9
->domain_server_state
);
215 static void display_sam_dom_info_12(struct samr_DomInfo12
*info12
)
217 printf("Bad password lockout duration: %s\n",
218 display_time(info12
->lockout_duration
));
219 printf("Reset Lockout after: %s\n",
220 display_time(info12
->lockout_window
));
221 printf("Lockout after bad attempts: %d\n",
222 info12
->lockout_threshold
);
225 static void display_sam_dom_info_13(struct samr_DomInfo13
*info13
)
227 printf("Sequence No:\t%llu\n", (unsigned long long)info13
->sequence_num
);
228 printf("Domain Create Time:\t%s\n",
229 http_timestring(talloc_tos(), nt_time_to_unix(info13
->domain_create_time
)));
230 printf("Sequence No at last promotion:\t%llu\n",
231 (unsigned long long)info13
->modified_count_at_last_promotion
);
234 static void display_sam_info_1(struct samr_DispEntryGeneral
*r
)
236 printf("index: 0x%x ", r
->idx
);
237 printf("RID: 0x%x ", r
->rid
);
238 printf("acb: 0x%08x ", r
->acct_flags
);
239 printf("Account: %s\t", r
->account_name
.string
);
240 printf("Name: %s\t", r
->full_name
.string
);
241 printf("Desc: %s\n", r
->description
.string
);
244 static void display_sam_info_2(struct samr_DispEntryFull
*r
)
246 printf("index: 0x%x ", r
->idx
);
247 printf("RID: 0x%x ", r
->rid
);
248 printf("acb: 0x%08x ", r
->acct_flags
);
249 printf("Account: %s\t", r
->account_name
.string
);
250 printf("Desc: %s\n", r
->description
.string
);
253 static void display_sam_info_3(struct samr_DispEntryFullGroup
*r
)
255 printf("index: 0x%x ", r
->idx
);
256 printf("RID: 0x%x ", r
->rid
);
257 printf("acb: 0x%08x ", r
->acct_flags
);
258 printf("Account: %s\t", r
->account_name
.string
);
259 printf("Desc: %s\n", r
->description
.string
);
262 static void display_sam_info_4(struct samr_DispEntryAscii
*r
)
264 printf("index: 0x%x ", r
->idx
);
265 printf("Account: %s\n", r
->account_name
.string
);
268 static void display_sam_info_5(struct samr_DispEntryAscii
*r
)
270 printf("index: 0x%x ", r
->idx
);
271 printf("Account: %s\n", r
->account_name
.string
);
274 static NTSTATUS
rpccli_try_samr_connects(
275 struct rpc_pipe_client
*cli
,
277 uint32_t access_mask
,
278 struct policy_handle
*connect_pol
)
280 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
282 NTSTATUS result
= NT_STATUS_UNSUCCESSFUL
;
283 uint32_t start_idx
= 0;
284 uint32_t i
, num_entries
;
285 struct samr_SamArray
*sam
= NULL
;
286 struct dom_sid
*domsid
= NULL
;
288 status
= dcerpc_try_samr_connects(
295 if (!NT_STATUS_IS_OK(status
)) {
298 if (!NT_STATUS_IS_OK(result
)) {
302 if (!is_null_sid(&domain_sid
)) {
307 * Look up the servers domain SID. Just pick the first
308 * non-builtin domain from samr_EnumDomains.
311 status
= dcerpc_samr_EnumDomains(
320 if (!NT_STATUS_IS_OK(status
)) {
323 if (!NT_STATUS_IS_OK(result
)) {
328 for (i
=0; i
<num_entries
; i
++) {
329 if (!strequal(sam
->entries
[i
].name
.string
, "builtin")) {
333 if (i
== num_entries
) {
334 status
= NT_STATUS_NOT_FOUND
;
338 status
= dcerpc_samr_LookupDomain(
342 &sam
->entries
[i
].name
,
345 if (!NT_STATUS_IS_OK(status
)) {
348 if (!NT_STATUS_IS_OK(result
)) {
353 sid_copy(&domain_sid
, domsid
);
359 dcerpc_samr_Close(b
, mem_ctx
, connect_pol
, &result
);
363 /****************************************************************************
364 ****************************************************************************/
366 static NTSTATUS
get_domain_handle(struct rpc_pipe_client
*cli
,
369 struct policy_handle
*connect_pol
,
370 uint32_t access_mask
,
371 struct dom_sid
*_domain_sid
,
372 struct policy_handle
*domain_pol
)
374 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
375 NTSTATUS status
= NT_STATUS_INVALID_PARAMETER
, result
;
377 if (strcasecmp_m(sam
, "domain") == 0) {
378 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
384 } else if (strcasecmp_m(sam
, "builtin") == 0) {
385 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
388 discard_const_p(struct dom_sid2
, &global_sid_Builtin
),
393 if (!NT_STATUS_IS_OK(status
)) {
400 /**********************************************************************
401 * Query user information
403 static NTSTATUS
cmd_samr_query_user(struct rpc_pipe_client
*cli
,
405 int argc
, const char **argv
)
407 struct policy_handle connect_pol
, domain_pol
, user_pol
;
408 NTSTATUS status
, result
;
409 uint32_t info_level
= 21;
410 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
411 union samr_UserInfo
*info
= NULL
;
412 uint32_t user_rid
= 0;
413 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
415 if ((argc
< 2) || (argc
> 4)) {
416 printf("Usage: %s rid [info level] [access mask] \n", argv
[0]);
420 sscanf(argv
[1], "%i", &user_rid
);
423 sscanf(argv
[2], "%i", &info_level
);
426 sscanf(argv
[3], "%x", &access_mask
);
429 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
430 MAXIMUM_ALLOWED_ACCESS
,
432 if (!NT_STATUS_IS_OK(status
)) {
436 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
438 MAXIMUM_ALLOWED_ACCESS
,
442 if (!NT_STATUS_IS_OK(status
)) {
445 if (!NT_STATUS_IS_OK(result
)) {
450 status
= dcerpc_samr_OpenUser(b
, mem_ctx
,
456 if (!NT_STATUS_IS_OK(status
)) {
459 if (NT_STATUS_EQUAL(result
, NT_STATUS_NO_SUCH_USER
) &&
462 /* Probably this was a user name, try lookupnames */
463 struct samr_Ids rids
, types
;
464 struct lsa_String lsa_acct_name
;
466 init_lsa_String(&lsa_acct_name
, argv
[1]);
468 status
= dcerpc_samr_LookupNames(b
, mem_ctx
,
475 if (!NT_STATUS_IS_OK(status
)) {
479 if (NT_STATUS_IS_OK(result
)) {
480 if (rids
.count
!= 1) {
481 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
484 if (types
.count
!= 1) {
485 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
489 status
= dcerpc_samr_OpenUser(b
, mem_ctx
,
495 if (!NT_STATUS_IS_OK(status
)) {
502 if (!NT_STATUS_IS_OK(result
)) {
507 status
= dcerpc_samr_QueryUserInfo(b
, mem_ctx
,
512 if (!NT_STATUS_IS_OK(status
)) {
515 if (!NT_STATUS_IS_OK(result
)) {
520 switch (info_level
) {
522 display_samr_user_info_7(&info
->info7
);
525 display_samr_user_info_9(&info
->info9
);
528 display_samr_user_info_16(&info
->info16
);
531 display_samr_user_info_20(&info
->info20
);
534 display_samr_user_info_21(&info
->info21
);
537 printf("Unsupported infolevel: %d\n", info_level
);
541 dcerpc_samr_Close(b
, mem_ctx
, &user_pol
, &result
);
542 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
543 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
549 /****************************************************************************
551 ****************************************************************************/
552 static void display_group_info1(struct samr_GroupInfoAll
*info1
)
554 printf("\tGroup Name:\t%s\n", info1
->name
.string
);
555 printf("\tDescription:\t%s\n", info1
->description
.string
);
556 printf("\tGroup Attribute:%d\n", info1
->attributes
);
557 printf("\tNum Members:%d\n", info1
->num_members
);
560 /****************************************************************************
562 ****************************************************************************/
563 static void display_group_info2(struct lsa_String
*info2
)
565 printf("\tGroup Description:%s\n", info2
->string
);
569 /****************************************************************************
571 ****************************************************************************/
572 static void display_group_info3(struct samr_GroupInfoAttributes
*info3
)
574 printf("\tGroup Attribute:%d\n", info3
->attributes
);
578 /****************************************************************************
580 ****************************************************************************/
581 static void display_group_info4(struct lsa_String
*info4
)
583 printf("\tGroup Description:%s\n", info4
->string
);
586 /****************************************************************************
588 ****************************************************************************/
589 static void display_group_info5(struct samr_GroupInfoAll
*info5
)
591 printf("\tGroup Name:\t%s\n", info5
->name
.string
);
592 printf("\tDescription:\t%s\n", info5
->description
.string
);
593 printf("\tGroup Attribute:%d\n", info5
->attributes
);
594 printf("\tNum Members:%d\n", info5
->num_members
);
597 /****************************************************************************
598 display sam sync structure
599 ****************************************************************************/
600 static void display_group_info(union samr_GroupInfo
*info
,
601 enum samr_GroupInfoEnum level
)
605 display_group_info1(&info
->all
);
608 display_group_info2(&info
->name
);
611 display_group_info3(&info
->attributes
);
614 display_group_info4(&info
->description
);
617 display_group_info5(&info
->all2
);
622 /***********************************************************************
623 * Query group information
625 static NTSTATUS
cmd_samr_query_group(struct rpc_pipe_client
*cli
,
627 int argc
, const char **argv
)
629 struct policy_handle connect_pol
, domain_pol
, group_pol
;
630 NTSTATUS status
, result
;
631 enum samr_GroupInfoEnum info_level
= GROUPINFOALL
;
632 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
633 union samr_GroupInfo
*group_info
= NULL
;
635 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
637 if ((argc
< 2) || (argc
> 4)) {
638 printf("Usage: %s rid [info level] [access mask]\n", argv
[0]);
642 sscanf(argv
[1], "%i", &group_rid
);
645 info_level
= atoi(argv
[2]);
648 sscanf(argv
[3], "%x", &access_mask
);
650 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
651 MAXIMUM_ALLOWED_ACCESS
,
653 if (!NT_STATUS_IS_OK(status
)) {
657 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
659 MAXIMUM_ALLOWED_ACCESS
,
663 if (!NT_STATUS_IS_OK(status
)) {
666 if (!NT_STATUS_IS_OK(result
)) {
671 status
= dcerpc_samr_OpenGroup(b
, mem_ctx
,
677 if (!NT_STATUS_IS_OK(status
)) {
680 if (!NT_STATUS_IS_OK(result
)) {
685 status
= dcerpc_samr_QueryGroupInfo(b
, mem_ctx
,
690 if (!NT_STATUS_IS_OK(status
)) {
693 if (!NT_STATUS_IS_OK(result
)) {
698 display_group_info(group_info
, info_level
);
700 dcerpc_samr_Close(b
, mem_ctx
, &group_pol
, &result
);
701 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
702 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
707 /* Query groups a user is a member of */
709 static NTSTATUS
cmd_samr_query_usergroups(struct rpc_pipe_client
*cli
,
711 int argc
, const char **argv
)
713 struct policy_handle connect_pol
,
716 NTSTATUS status
, result
;
718 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
720 struct samr_RidWithAttributeArray
*rid_array
= NULL
;
721 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
723 if ((argc
< 2) || (argc
> 3)) {
724 printf("Usage: %s rid [access mask]\n", argv
[0]);
728 sscanf(argv
[1], "%i", &user_rid
);
731 sscanf(argv
[2], "%x", &access_mask
);
733 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
734 MAXIMUM_ALLOWED_ACCESS
,
736 if (!NT_STATUS_IS_OK(status
)) {
740 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
742 MAXIMUM_ALLOWED_ACCESS
,
746 if (!NT_STATUS_IS_OK(status
)) {
749 if (!NT_STATUS_IS_OK(result
)) {
754 status
= dcerpc_samr_OpenUser(b
, mem_ctx
,
761 if (!NT_STATUS_IS_OK(status
)) {
764 if (!NT_STATUS_IS_OK(result
)) {
769 status
= dcerpc_samr_GetGroupsForUser(b
, mem_ctx
,
773 if (!NT_STATUS_IS_OK(status
)) {
776 if (!NT_STATUS_IS_OK(result
)) {
781 for (i
= 0; i
< rid_array
->count
; i
++) {
782 printf("\tgroup rid:[0x%x] attr:[0x%x]\n",
783 rid_array
->rids
[i
].rid
,
784 rid_array
->rids
[i
].attributes
);
787 dcerpc_samr_Close(b
, mem_ctx
, &user_pol
, &result
);
788 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
789 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
794 /* Query aliases a user is a member of */
796 static NTSTATUS
cmd_samr_query_useraliases(struct rpc_pipe_client
*cli
,
798 int argc
, const char **argv
)
800 struct policy_handle connect_pol
, domain_pol
;
801 NTSTATUS status
, result
;
802 struct dom_sid
*sids
;
804 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
806 struct lsa_SidArray sid_array
;
807 struct samr_Ids alias_rids
;
808 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
811 printf("Usage: %s builtin|domain sid1 sid2 ...\n", argv
[0]);
812 return NT_STATUS_INVALID_PARAMETER
;
818 for (i
=2; i
<argc
; i
++) {
819 struct dom_sid tmp_sid
;
820 if (!string_to_sid(&tmp_sid
, argv
[i
])) {
821 printf("%s is not a legal SID\n", argv
[i
]);
822 return NT_STATUS_INVALID_PARAMETER
;
824 result
= add_sid_to_array(mem_ctx
, &tmp_sid
, &sids
, &num_sids
);
825 if (!NT_STATUS_IS_OK(result
)) {
831 sid_array
.sids
= talloc_zero_array(mem_ctx
, struct lsa_SidPtr
, num_sids
);
832 if (sid_array
.sids
== NULL
)
833 return NT_STATUS_NO_MEMORY
;
835 sid_array
.sids
= NULL
;
838 for (i
=0; i
<num_sids
; i
++) {
839 sid_array
.sids
[i
].sid
= dom_sid_dup(mem_ctx
, &sids
[i
]);
840 if (!sid_array
.sids
[i
].sid
) {
841 return NT_STATUS_NO_MEMORY
;
845 sid_array
.num_sids
= num_sids
;
847 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
848 MAXIMUM_ALLOWED_ACCESS
,
850 if (!NT_STATUS_IS_OK(status
)) {
854 status
= get_domain_handle(cli
, mem_ctx
, argv
[1],
859 if (!NT_STATUS_IS_OK(status
)) {
863 status
= dcerpc_samr_GetAliasMembership(b
, mem_ctx
,
868 if (!NT_STATUS_IS_OK(status
)) {
871 if (!NT_STATUS_IS_OK(result
)) {
876 for (i
= 0; i
< alias_rids
.count
; i
++) {
877 printf("\tgroup rid:[0x%x]\n", alias_rids
.ids
[i
]);
880 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
881 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
886 /* Query members of a group */
888 static NTSTATUS
cmd_samr_query_groupmem(struct rpc_pipe_client
*cli
,
890 int argc
, const char **argv
)
892 struct policy_handle connect_pol
, domain_pol
, group_pol
;
893 NTSTATUS status
, result
;
895 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
897 unsigned int old_timeout
;
898 struct samr_RidAttrArray
*rids
= NULL
;
899 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
901 if ((argc
< 2) || (argc
> 3)) {
902 printf("Usage: %s rid [access mask]\n", argv
[0]);
906 sscanf(argv
[1], "%i", &group_rid
);
909 sscanf(argv
[2], "%x", &access_mask
);
911 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
912 MAXIMUM_ALLOWED_ACCESS
,
914 if (!NT_STATUS_IS_OK(status
)) {
918 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
920 MAXIMUM_ALLOWED_ACCESS
,
924 if (!NT_STATUS_IS_OK(status
)) {
927 if (!NT_STATUS_IS_OK(result
)) {
932 status
= dcerpc_samr_OpenGroup(b
, mem_ctx
,
938 if (!NT_STATUS_IS_OK(status
)) {
941 if (!NT_STATUS_IS_OK(result
)) {
946 /* Make sure to wait for our DC's reply */
947 old_timeout
= rpccli_set_timeout(cli
, 30000); /* 30 seconds. */
948 rpccli_set_timeout(cli
, MAX(30000, old_timeout
)); /* At least 30 sec */
950 status
= dcerpc_samr_QueryGroupMember(b
, mem_ctx
,
955 rpccli_set_timeout(cli
, old_timeout
);
957 if (!NT_STATUS_IS_OK(status
)) {
960 if (!NT_STATUS_IS_OK(result
)) {
965 for (i
= 0; i
< rids
->count
; i
++) {
966 printf("\trid:[0x%x] attr:[0x%x]\n", rids
->rids
[i
],
967 rids
->attributes
[i
]);
970 dcerpc_samr_Close(b
, mem_ctx
, &group_pol
, &result
);
971 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
972 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
977 /* Enumerate domain users */
979 static NTSTATUS
cmd_samr_enum_dom_users(struct rpc_pipe_client
*cli
,
981 int argc
, const char **argv
)
983 struct policy_handle connect_pol
;
984 struct policy_handle domain_pol
= { 0, };
985 NTSTATUS status
, result
;
986 uint32_t start_idx
, num_dom_users
, i
;
987 struct samr_SamArray
*dom_users
= NULL
;
988 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
989 uint32_t acb_mask
= ACB_NORMAL
;
990 uint32_t size
= 0xffff;
991 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
993 if ((argc
< 1) || (argc
> 4)) {
994 printf("Usage: %s [access_mask] [acb_mask] [size]\n", argv
[0]);
999 sscanf(argv
[1], "%x", &access_mask
);
1003 sscanf(argv
[2], "%x", &acb_mask
);
1007 sscanf(argv
[3], "%x", &size
);
1010 /* Get sam policy handle */
1012 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1013 MAXIMUM_ALLOWED_ACCESS
,
1015 if (!NT_STATUS_IS_OK(status
)) {
1019 /* Get domain policy handle */
1021 status
= get_domain_handle(cli
, mem_ctx
, "domain",
1026 if (!NT_STATUS_IS_OK(status
)) {
1030 /* Enumerate domain users */
1035 status
= dcerpc_samr_EnumDomainUsers(b
, mem_ctx
,
1043 if (!NT_STATUS_IS_OK(status
)) {
1046 if (NT_STATUS_IS_OK(result
) ||
1047 NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
)) {
1049 for (i
= 0; i
< num_dom_users
; i
++)
1050 printf("user:[%s] rid:[0x%x]\n",
1051 dom_users
->entries
[i
].name
.string
,
1052 dom_users
->entries
[i
].idx
);
1055 } while (NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
));
1058 if (is_valid_policy_hnd(&domain_pol
))
1059 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1061 if (is_valid_policy_hnd(&connect_pol
))
1062 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1067 /* Enumerate domain groups */
1069 static NTSTATUS
cmd_samr_enum_dom_groups(struct rpc_pipe_client
*cli
,
1070 TALLOC_CTX
*mem_ctx
,
1071 int argc
, const char **argv
)
1073 struct policy_handle connect_pol
;
1074 struct policy_handle domain_pol
= { 0, };
1075 NTSTATUS status
, result
;
1076 uint32_t start_idx
, num_dom_groups
, i
;
1077 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
1078 struct samr_SamArray
*dom_groups
= NULL
;
1079 uint32_t size
= 0xffff;
1080 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1082 if ((argc
< 1) || (argc
> 3)) {
1083 printf("Usage: %s [access_mask] [max_size]\n", argv
[0]);
1084 return NT_STATUS_OK
;
1088 sscanf(argv
[1], "%x", &access_mask
);
1092 sscanf(argv
[2], "%x", &size
);
1095 /* Get sam policy handle */
1097 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1098 MAXIMUM_ALLOWED_ACCESS
,
1100 if (!NT_STATUS_IS_OK(status
)) {
1104 /* Get domain policy handle */
1106 status
= get_domain_handle(cli
, mem_ctx
, "domain",
1111 if (!NT_STATUS_IS_OK(status
)) {
1115 /* Enumerate domain groups */
1120 status
= dcerpc_samr_EnumDomainGroups(b
, mem_ctx
,
1127 if (!NT_STATUS_IS_OK(status
)) {
1130 if (NT_STATUS_IS_OK(result
) ||
1131 NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
)) {
1133 for (i
= 0; i
< num_dom_groups
; i
++)
1134 printf("group:[%s] rid:[0x%x]\n",
1135 dom_groups
->entries
[i
].name
.string
,
1136 dom_groups
->entries
[i
].idx
);
1139 } while (NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
));
1142 if (is_valid_policy_hnd(&domain_pol
))
1143 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1145 if (is_valid_policy_hnd(&connect_pol
))
1146 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1151 /* Enumerate alias groups */
1153 static NTSTATUS
cmd_samr_enum_als_groups(struct rpc_pipe_client
*cli
,
1154 TALLOC_CTX
*mem_ctx
,
1155 int argc
, const char **argv
)
1157 struct policy_handle connect_pol
;
1158 struct policy_handle domain_pol
= { 0, };
1159 NTSTATUS status
, result
;
1160 uint32_t start_idx
, num_als_groups
, i
;
1161 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
1162 struct samr_SamArray
*als_groups
= NULL
;
1163 uint32_t size
= 0xffff;
1164 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1166 if ((argc
< 2) || (argc
> 4)) {
1167 printf("Usage: %s builtin|domain [access mask] [max_size]\n", argv
[0]);
1168 return NT_STATUS_OK
;
1172 sscanf(argv
[2], "%x", &access_mask
);
1176 sscanf(argv
[3], "%x", &size
);
1179 /* Get sam policy handle */
1181 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1182 MAXIMUM_ALLOWED_ACCESS
,
1184 if (!NT_STATUS_IS_OK(status
)) {
1188 /* Get domain policy handle */
1190 status
= get_domain_handle(cli
, mem_ctx
, argv
[1],
1195 if (!NT_STATUS_IS_OK(status
)) {
1199 /* Enumerate alias groups */
1204 status
= dcerpc_samr_EnumDomainAliases(b
, mem_ctx
,
1211 if (!NT_STATUS_IS_OK(status
)) {
1214 if (NT_STATUS_IS_OK(result
) ||
1215 NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
)) {
1217 for (i
= 0; i
< num_als_groups
; i
++)
1218 printf("group:[%s] rid:[0x%x]\n",
1219 als_groups
->entries
[i
].name
.string
,
1220 als_groups
->entries
[i
].idx
);
1222 } while (NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
));
1225 if (is_valid_policy_hnd(&domain_pol
))
1226 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1228 if (is_valid_policy_hnd(&connect_pol
))
1229 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1234 /* Enumerate domains */
1236 static NTSTATUS
cmd_samr_enum_domains(struct rpc_pipe_client
*cli
,
1237 TALLOC_CTX
*mem_ctx
,
1238 int argc
, const char **argv
)
1240 struct policy_handle connect_pol
;
1241 NTSTATUS status
, result
;
1242 uint32_t start_idx
, size
, num_entries
, i
;
1243 uint32_t access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
1244 struct samr_SamArray
*sam
= NULL
;
1245 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1247 if ((argc
< 1) || (argc
> 2)) {
1248 printf("Usage: %s [access mask]\n", argv
[0]);
1249 return NT_STATUS_OK
;
1253 sscanf(argv
[1], "%x", &access_mask
);
1256 /* Get sam policy handle */
1258 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1261 if (!NT_STATUS_IS_OK(status
)) {
1265 /* Enumerate domains */
1271 status
= dcerpc_samr_EnumDomains(b
, mem_ctx
,
1278 if (!NT_STATUS_IS_OK(status
)) {
1281 if (NT_STATUS_IS_OK(result
) ||
1282 NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
)) {
1284 for (i
= 0; i
< num_entries
; i
++)
1285 printf("name:[%s] idx:[0x%x]\n",
1286 sam
->entries
[i
].name
.string
,
1287 sam
->entries
[i
].idx
);
1289 } while (NT_STATUS_V(result
) == NT_STATUS_V(STATUS_MORE_ENTRIES
));
1292 if (is_valid_policy_hnd(&connect_pol
)) {
1293 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1300 /* Query alias membership */
1302 static NTSTATUS
cmd_samr_query_aliasmem(struct rpc_pipe_client
*cli
,
1303 TALLOC_CTX
*mem_ctx
,
1304 int argc
, const char **argv
)
1306 struct policy_handle connect_pol
, domain_pol
, alias_pol
;
1307 NTSTATUS status
, result
;
1308 uint32_t alias_rid
, i
;
1309 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
1310 struct lsa_SidArray sid_array
;
1311 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1313 if ((argc
< 3) || (argc
> 4)) {
1314 printf("Usage: %s builtin|domain rid [access mask]\n", argv
[0]);
1315 return NT_STATUS_OK
;
1318 sscanf(argv
[2], "%i", &alias_rid
);
1321 sscanf(argv
[3], "%x", &access_mask
);
1323 /* Open SAMR handle */
1325 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1326 MAXIMUM_ALLOWED_ACCESS
,
1328 if (!NT_STATUS_IS_OK(status
)) {
1332 /* Open handle on domain */
1334 status
= get_domain_handle(cli
, mem_ctx
, argv
[1],
1336 MAXIMUM_ALLOWED_ACCESS
,
1339 if (!NT_STATUS_IS_OK(status
)) {
1343 /* Open handle on alias */
1345 status
= dcerpc_samr_OpenAlias(b
, mem_ctx
,
1351 if (!NT_STATUS_IS_OK(status
)) {
1354 if (!NT_STATUS_IS_OK(result
)) {
1359 status
= dcerpc_samr_GetMembersInAlias(b
, mem_ctx
,
1363 if (!NT_STATUS_IS_OK(status
)) {
1366 if (!NT_STATUS_IS_OK(result
)) {
1371 for (i
= 0; i
< sid_array
.num_sids
; i
++) {
1372 struct dom_sid_buf sid_str
;
1374 printf("\tsid:[%s]\n",
1375 dom_sid_str_buf(sid_array
.sids
[i
].sid
, &sid_str
));
1378 dcerpc_samr_Close(b
, mem_ctx
, &alias_pol
, &result
);
1379 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1380 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1385 /* Query alias info */
1387 static NTSTATUS
cmd_samr_query_aliasinfo(struct rpc_pipe_client
*cli
,
1388 TALLOC_CTX
*mem_ctx
,
1389 int argc
, const char **argv
)
1391 struct policy_handle connect_pol
, domain_pol
, alias_pol
;
1392 NTSTATUS status
, result
;
1394 uint32_t access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
1395 union samr_AliasInfo
*info
= NULL
;
1396 enum samr_AliasInfoEnum level
= ALIASINFOALL
;
1397 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1399 if ((argc
< 3) || (argc
> 4)) {
1400 printf("Usage: %s builtin|domain rid [level] [access mask]\n",
1402 return NT_STATUS_OK
;
1405 sscanf(argv
[2], "%i", &alias_rid
);
1408 level
= atoi(argv
[3]);
1412 sscanf(argv
[4], "%x", &access_mask
);
1415 /* Open SAMR handle */
1417 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1418 SEC_FLAG_MAXIMUM_ALLOWED
,
1420 if (!NT_STATUS_IS_OK(status
)) {
1424 /* Open handle on domain */
1426 status
= get_domain_handle(cli
, mem_ctx
, argv
[1],
1428 SEC_FLAG_MAXIMUM_ALLOWED
,
1431 if (!NT_STATUS_IS_OK(status
)) {
1435 /* Open handle on alias */
1437 status
= dcerpc_samr_OpenAlias(b
, mem_ctx
,
1443 if (!NT_STATUS_IS_OK(status
)) {
1446 if (!NT_STATUS_IS_OK(result
)) {
1451 status
= dcerpc_samr_QueryAliasInfo(b
, mem_ctx
,
1456 if (!NT_STATUS_IS_OK(status
)) {
1459 if (!NT_STATUS_IS_OK(result
)) {
1466 printf("Name: %s\n", info
->all
.name
.string
);
1467 printf("Description: %s\n", info
->all
.description
.string
);
1468 printf("Num Members: %d\n", info
->all
.num_members
);
1471 printf("Name: %s\n", info
->name
.string
);
1473 case ALIASINFODESCRIPTION
:
1474 printf("Description: %s\n", info
->description
.string
);
1480 dcerpc_samr_Close(b
, mem_ctx
, &alias_pol
, &result
);
1481 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1482 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1488 /* Query delete an alias membership */
1490 static NTSTATUS
cmd_samr_delete_alias(struct rpc_pipe_client
*cli
,
1491 TALLOC_CTX
*mem_ctx
,
1492 int argc
, const char **argv
)
1494 struct policy_handle connect_pol
, domain_pol
, alias_pol
;
1495 NTSTATUS status
, result
;
1497 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
1498 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1502 printf("Usage: %s builtin|domain [rid|name]\n", argv
[0]);
1503 return NT_STATUS_OK
;
1506 alias_rid
= smb_strtoul(argv
[2], NULL
, 10, &error
, SMB_STR_STANDARD
);
1508 return NT_STATUS_INVALID_PARAMETER
;
1512 /* Open SAMR handle */
1514 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1515 MAXIMUM_ALLOWED_ACCESS
,
1517 if (!NT_STATUS_IS_OK(status
)) {
1521 /* Open handle on domain */
1523 status
= get_domain_handle(cli
, mem_ctx
, argv
[1],
1525 MAXIMUM_ALLOWED_ACCESS
,
1528 if (!NT_STATUS_IS_OK(status
)) {
1532 /* Open handle on alias */
1534 status
= dcerpc_samr_OpenAlias(b
, mem_ctx
,
1540 if (!NT_STATUS_IS_OK(status
)) {
1543 if (!NT_STATUS_IS_OK(result
) && (alias_rid
== 0)) {
1544 /* Probably this was a user name, try lookupnames */
1545 struct samr_Ids rids
, types
;
1546 struct lsa_String lsa_acct_name
;
1548 init_lsa_String(&lsa_acct_name
, argv
[2]);
1550 status
= dcerpc_samr_LookupNames(b
, mem_ctx
,
1557 if (!NT_STATUS_IS_OK(status
)) {
1560 if (NT_STATUS_IS_OK(result
)) {
1561 if (rids
.count
!= 1) {
1562 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
1565 if (types
.count
!= 1) {
1566 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
1570 status
= dcerpc_samr_OpenAlias(b
, mem_ctx
,
1576 if (!NT_STATUS_IS_OK(status
)) {
1582 status
= dcerpc_samr_DeleteDomAlias(b
, mem_ctx
,
1585 if (!NT_STATUS_IS_OK(status
)) {
1588 if (!NT_STATUS_IS_OK(result
)) {
1593 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1594 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1599 /* Query display info */
1601 static NTSTATUS
cmd_samr_query_dispinfo_internal(struct rpc_pipe_client
*cli
,
1602 TALLOC_CTX
*mem_ctx
,
1603 int argc
, const char **argv
,
1606 struct policy_handle connect_pol
, domain_pol
;
1607 NTSTATUS status
, result
;
1608 uint32_t start_idx
=0, max_entries
=250, max_size
= 0xffff, num_entries
= 0, i
;
1609 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
1610 uint32_t info_level
= 1;
1611 union samr_DispInfo info
;
1613 bool got_params
= False
; /* Use get_query_dispinfo_params() or not? */
1614 uint32_t total_size
, returned_size
;
1615 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1618 printf("Usage: %s [info level] [start index] [max entries] [max size] [access mask]\n", argv
[0]);
1619 return NT_STATUS_OK
;
1623 sscanf(argv
[1], "%i", &info_level
);
1626 sscanf(argv
[2], "%i", &start_idx
);
1629 sscanf(argv
[3], "%i", &max_entries
);
1634 sscanf(argv
[4], "%i", &max_size
);
1639 sscanf(argv
[5], "%x", &access_mask
);
1641 /* Get sam policy handle */
1643 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1644 MAXIMUM_ALLOWED_ACCESS
,
1646 if (!NT_STATUS_IS_OK(status
)) {
1650 /* Get domain policy handle */
1652 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
1658 if (!NT_STATUS_IS_OK(status
)) {
1661 if (!NT_STATUS_IS_OK(result
)) {
1666 /* Query display info */
1671 dcerpc_get_query_dispinfo_params(
1672 loop_count
, &max_entries
, &max_size
);
1675 case NDR_SAMR_QUERYDISPLAYINFO
:
1676 status
= dcerpc_samr_QueryDisplayInfo(b
, mem_ctx
,
1687 case NDR_SAMR_QUERYDISPLAYINFO2
:
1688 status
= dcerpc_samr_QueryDisplayInfo2(b
, mem_ctx
,
1700 case NDR_SAMR_QUERYDISPLAYINFO3
:
1701 status
= dcerpc_samr_QueryDisplayInfo3(b
, mem_ctx
,
1714 return NT_STATUS_INVALID_PARAMETER
;
1717 if (!NT_STATUS_IS_OK(status
)) {
1721 if (!NT_STATUS_IS_OK(result
) &&
1722 !NT_STATUS_EQUAL(result
, NT_STATUS_NO_MORE_ENTRIES
) &&
1723 !NT_STATUS_EQUAL(result
, STATUS_MORE_ENTRIES
)) {
1729 switch (info_level
) {
1731 num_entries
= info
.info1
.count
;
1734 num_entries
= info
.info2
.count
;
1737 num_entries
= info
.info3
.count
;
1740 num_entries
= info
.info4
.count
;
1743 num_entries
= info
.info5
.count
;
1749 start_idx
+= num_entries
;
1751 if (num_entries
== 0)
1754 for (i
= 0; i
< num_entries
; i
++) {
1755 switch (info_level
) {
1757 display_sam_info_1(&info
.info1
.entries
[i
]);
1760 display_sam_info_2(&info
.info2
.entries
[i
]);
1763 display_sam_info_3(&info
.info3
.entries
[i
]);
1766 display_sam_info_4(&info
.info4
.entries
[i
]);
1769 display_sam_info_5(&info
.info5
.entries
[i
]);
1773 } while ( NT_STATUS_EQUAL(result
, STATUS_MORE_ENTRIES
));
1775 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1776 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1781 static NTSTATUS
cmd_samr_query_dispinfo(struct rpc_pipe_client
*cli
,
1782 TALLOC_CTX
*mem_ctx
,
1783 int argc
, const char **argv
)
1785 return cmd_samr_query_dispinfo_internal(cli
, mem_ctx
, argc
, argv
,
1786 NDR_SAMR_QUERYDISPLAYINFO
);
1789 static NTSTATUS
cmd_samr_query_dispinfo2(struct rpc_pipe_client
*cli
,
1790 TALLOC_CTX
*mem_ctx
,
1791 int argc
, const char **argv
)
1793 return cmd_samr_query_dispinfo_internal(cli
, mem_ctx
, argc
, argv
,
1794 NDR_SAMR_QUERYDISPLAYINFO2
);
1797 static NTSTATUS
cmd_samr_query_dispinfo3(struct rpc_pipe_client
*cli
,
1798 TALLOC_CTX
*mem_ctx
,
1799 int argc
, const char **argv
)
1801 return cmd_samr_query_dispinfo_internal(cli
, mem_ctx
, argc
, argv
,
1802 NDR_SAMR_QUERYDISPLAYINFO3
);
1805 /* Query domain info */
1807 static NTSTATUS
cmd_samr_query_dominfo(struct rpc_pipe_client
*cli
,
1808 TALLOC_CTX
*mem_ctx
,
1809 int argc
, const char **argv
)
1811 struct policy_handle connect_pol
, domain_pol
;
1812 NTSTATUS status
, result
;
1813 uint32_t switch_level
= 2;
1814 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
1815 union samr_DomainInfo
*info
= NULL
;
1816 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1819 printf("Usage: %s [info level] [access mask]\n", argv
[0]);
1820 return NT_STATUS_OK
;
1824 sscanf(argv
[1], "%i", &switch_level
);
1827 sscanf(argv
[2], "%x", &access_mask
);
1829 /* Get sam policy handle */
1831 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1832 MAXIMUM_ALLOWED_ACCESS
,
1834 if (!NT_STATUS_IS_OK(status
)) {
1838 /* Get domain policy handle */
1840 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
1846 if (!NT_STATUS_IS_OK(status
)) {
1849 if (!NT_STATUS_IS_OK(result
)) {
1854 /* Query domain info */
1856 status
= dcerpc_samr_QueryDomainInfo(b
, mem_ctx
,
1861 if (!NT_STATUS_IS_OK(status
)) {
1864 if (!NT_STATUS_IS_OK(result
)) {
1869 /* Display domain info */
1871 switch (switch_level
) {
1873 display_sam_dom_info_1(&info
->info1
);
1876 display_sam_dom_info_2(&info
->general
);
1879 display_sam_dom_info_3(&info
->info3
);
1882 display_sam_dom_info_4(&info
->oem
);
1885 display_sam_dom_info_5(&info
->info5
);
1888 display_sam_dom_info_6(&info
->info6
);
1891 display_sam_dom_info_7(&info
->info7
);
1894 display_sam_dom_info_8(&info
->info8
);
1897 display_sam_dom_info_9(&info
->info9
);
1900 display_sam_dom_info_12(&info
->info12
);
1903 display_sam_dom_info_13(&info
->info13
);
1907 printf("cannot display domain info for switch value %d\n",
1914 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1915 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
1919 /* Create domain user */
1921 static NTSTATUS
cmd_samr_create_dom_user(struct rpc_pipe_client
*cli
,
1922 TALLOC_CTX
*mem_ctx
,
1923 int argc
, const char **argv
)
1925 struct policy_handle connect_pol
, domain_pol
, user_pol
;
1926 NTSTATUS status
, result
;
1927 struct lsa_String acct_name
;
1929 uint32_t acct_flags
, user_rid
;
1930 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
1931 uint32_t access_granted
= 0;
1932 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
1934 if ((argc
< 2) || (argc
> 3)) {
1935 printf("Usage: %s username [access mask]\n", argv
[0]);
1936 return NT_STATUS_OK
;
1939 init_lsa_String(&acct_name
, argv
[1]);
1942 sscanf(argv
[2], "%x", &access_mask
);
1944 /* Get sam policy handle */
1946 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
1947 MAXIMUM_ALLOWED_ACCESS
,
1949 if (!NT_STATUS_IS_OK(status
)) {
1953 /* Get domain policy handle */
1955 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
1961 if (!NT_STATUS_IS_OK(status
)) {
1964 if (!NT_STATUS_IS_OK(result
)) {
1969 /* Create domain user */
1971 acb_info
= ACB_NORMAL
;
1972 acct_flags
= SEC_GENERIC_READ
| SEC_GENERIC_WRITE
| SEC_GENERIC_EXECUTE
|
1973 SEC_STD_WRITE_DAC
| SEC_STD_DELETE
|
1974 SAMR_USER_ACCESS_SET_PASSWORD
|
1975 SAMR_USER_ACCESS_GET_ATTRIBUTES
|
1976 SAMR_USER_ACCESS_SET_ATTRIBUTES
;
1978 status
= dcerpc_samr_CreateUser2(b
, mem_ctx
,
1987 if (!NT_STATUS_IS_OK(status
)) {
1990 if (!NT_STATUS_IS_OK(result
)) {
1995 status
= dcerpc_samr_Close(b
, mem_ctx
, &user_pol
, &result
);
1996 if (!NT_STATUS_IS_OK(status
)) goto done
;
1998 status
= dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
1999 if (!NT_STATUS_IS_OK(status
)) goto done
;
2001 status
= dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2002 if (!NT_STATUS_IS_OK(status
)) goto done
;
2008 /* Create domain group */
2010 static NTSTATUS
cmd_samr_create_dom_group(struct rpc_pipe_client
*cli
,
2011 TALLOC_CTX
*mem_ctx
,
2012 int argc
, const char **argv
)
2014 struct policy_handle connect_pol
, domain_pol
, group_pol
;
2015 NTSTATUS status
, result
;
2016 struct lsa_String grp_name
;
2017 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
2019 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2021 if ((argc
< 2) || (argc
> 3)) {
2022 printf("Usage: %s groupname [access mask]\n", argv
[0]);
2023 return NT_STATUS_OK
;
2026 init_lsa_String(&grp_name
, argv
[1]);
2029 sscanf(argv
[2], "%x", &access_mask
);
2031 /* Get sam policy handle */
2033 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2034 MAXIMUM_ALLOWED_ACCESS
,
2036 if (!NT_STATUS_IS_OK(status
)) {
2040 /* Get domain policy handle */
2042 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2048 if (!NT_STATUS_IS_OK(status
)) {
2051 if (!NT_STATUS_IS_OK(result
)) {
2056 /* Create domain user */
2057 status
= dcerpc_samr_CreateDomainGroup(b
, mem_ctx
,
2060 MAXIMUM_ALLOWED_ACCESS
,
2064 if (!NT_STATUS_IS_OK(status
)) {
2067 if (!NT_STATUS_IS_OK(result
)) {
2072 status
= dcerpc_samr_Close(b
, mem_ctx
, &group_pol
, &result
);
2073 if (!NT_STATUS_IS_OK(status
)) goto done
;
2075 status
= dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2076 if (!NT_STATUS_IS_OK(status
)) goto done
;
2078 status
= dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2079 if (!NT_STATUS_IS_OK(status
)) goto done
;
2085 /* Create domain alias */
2087 static NTSTATUS
cmd_samr_create_dom_alias(struct rpc_pipe_client
*cli
,
2088 TALLOC_CTX
*mem_ctx
,
2089 int argc
, const char **argv
)
2091 struct policy_handle connect_pol
, domain_pol
, alias_pol
;
2092 NTSTATUS status
, result
;
2093 struct lsa_String alias_name
;
2094 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
2096 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2098 if ((argc
< 2) || (argc
> 3)) {
2099 printf("Usage: %s aliasname [access mask]\n", argv
[0]);
2100 return NT_STATUS_OK
;
2103 init_lsa_String(&alias_name
, argv
[1]);
2106 sscanf(argv
[2], "%x", &access_mask
);
2108 /* Get sam policy handle */
2110 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2111 MAXIMUM_ALLOWED_ACCESS
,
2113 if (!NT_STATUS_IS_OK(status
)) {
2117 /* Get domain policy handle */
2119 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2125 if (!NT_STATUS_IS_OK(status
)) {
2128 if (!NT_STATUS_IS_OK(result
)) {
2133 /* Create domain user */
2135 status
= dcerpc_samr_CreateDomAlias(b
, mem_ctx
,
2138 MAXIMUM_ALLOWED_ACCESS
,
2142 if (!NT_STATUS_IS_OK(status
)) {
2145 if (!NT_STATUS_IS_OK(result
)) {
2151 status
= dcerpc_samr_Close(b
, mem_ctx
, &alias_pol
, &result
);
2152 if (!NT_STATUS_IS_OK(status
)) goto done
;
2154 status
= dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2155 if (!NT_STATUS_IS_OK(status
)) goto done
;
2157 status
= dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2158 if (!NT_STATUS_IS_OK(status
)) goto done
;
2164 /* Lookup sam names */
2166 static NTSTATUS
cmd_samr_lookup_names(struct rpc_pipe_client
*cli
,
2167 TALLOC_CTX
*mem_ctx
,
2168 int argc
, const char **argv
)
2170 NTSTATUS status
, result
;
2171 struct policy_handle connect_pol
, domain_pol
;
2173 struct samr_Ids rids
, name_types
;
2175 struct lsa_String
*names
= NULL
;
2176 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2179 printf("Usage: %s domain|builtin name1 [name2 [name3] [...]]\n", argv
[0]);
2180 printf("check on the domain SID: S-1-5-21-x-y-z\n");
2181 printf("or check on the builtin SID: S-1-5-32\n");
2182 return NT_STATUS_OK
;
2185 /* Get sam policy and domain handles */
2187 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2188 MAXIMUM_ALLOWED_ACCESS
,
2190 if (!NT_STATUS_IS_OK(status
)) {
2194 status
= get_domain_handle(cli
, mem_ctx
, argv
[1],
2196 MAXIMUM_ALLOWED_ACCESS
,
2199 if (!NT_STATUS_IS_OK(status
)) {
2205 num_names
= argc
- 2;
2207 if ((names
= talloc_array(mem_ctx
, struct lsa_String
, num_names
)) == NULL
) {
2208 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2209 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2210 status
= NT_STATUS_NO_MEMORY
;
2214 for (i
= 0; i
< num_names
; i
++) {
2215 init_lsa_String(&names
[i
], argv
[i
+ 2]);
2218 status
= dcerpc_samr_LookupNames(b
, mem_ctx
,
2225 if (!NT_STATUS_IS_OK(status
)) {
2228 if (!NT_STATUS_IS_OK(result
)) {
2232 if (rids
.count
!= num_names
) {
2233 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2236 if (name_types
.count
!= num_names
) {
2237 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2241 /* Display results */
2243 for (i
= 0; i
< num_names
; i
++)
2244 printf("name %s: 0x%x (%d)\n", names
[i
].string
, rids
.ids
[i
],
2247 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2248 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2253 /* Lookup sam rids */
2255 static NTSTATUS
cmd_samr_lookup_rids(struct rpc_pipe_client
*cli
,
2256 TALLOC_CTX
*mem_ctx
,
2257 int argc
, const char **argv
)
2259 NTSTATUS status
, result
;
2260 struct policy_handle connect_pol
, domain_pol
;
2261 uint32_t num_rids
, *rids
;
2262 struct lsa_Strings names
;
2263 struct samr_Ids types
;
2264 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2269 printf("Usage: %s domain|builtin rid1 [rid2 [rid3] [...]]\n", argv
[0]);
2270 return NT_STATUS_OK
;
2273 /* Get sam policy and domain handles */
2275 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2276 MAXIMUM_ALLOWED_ACCESS
,
2278 if (!NT_STATUS_IS_OK(status
)) {
2282 status
= get_domain_handle(cli
, mem_ctx
, argv
[1],
2284 MAXIMUM_ALLOWED_ACCESS
,
2287 if (!NT_STATUS_IS_OK(status
)) {
2293 num_rids
= argc
- 2;
2295 if ((rids
= talloc_array(mem_ctx
, uint32_t, num_rids
)) == NULL
) {
2296 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2297 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2298 status
= NT_STATUS_NO_MEMORY
;
2302 for (i
= 0; i
< argc
- 2; i
++)
2303 sscanf(argv
[i
+ 2], "%i", &rids
[i
]);
2305 status
= dcerpc_samr_LookupRids(b
, mem_ctx
,
2312 if (!NT_STATUS_IS_OK(status
)) {
2316 if (!NT_STATUS_IS_OK(result
) &&
2317 !NT_STATUS_EQUAL(result
, STATUS_SOME_UNMAPPED
))
2320 /* Display results */
2321 if (num_rids
!= names
.count
) {
2322 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2325 if (num_rids
!= types
.count
) {
2326 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2330 for (i
= 0; i
< num_rids
; i
++) {
2331 printf("rid 0x%x: %s (%d)\n",
2332 rids
[i
], names
.names
[i
].string
, types
.ids
[i
]);
2335 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2336 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2341 /* Delete domain group */
2343 static NTSTATUS
cmd_samr_delete_dom_group(struct rpc_pipe_client
*cli
,
2344 TALLOC_CTX
*mem_ctx
,
2345 int argc
, const char **argv
)
2347 NTSTATUS status
, result
;
2348 struct policy_handle connect_pol
, domain_pol
, group_pol
;
2349 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
2350 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2352 if ((argc
< 2) || (argc
> 3)) {
2353 printf("Usage: %s groupname\n", argv
[0]);
2354 return NT_STATUS_OK
;
2358 sscanf(argv
[2], "%x", &access_mask
);
2360 /* Get sam policy and domain handles */
2362 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2363 MAXIMUM_ALLOWED_ACCESS
,
2365 if (!NT_STATUS_IS_OK(status
)) {
2369 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2371 MAXIMUM_ALLOWED_ACCESS
,
2375 if (!NT_STATUS_IS_OK(status
)) {
2378 if (!NT_STATUS_IS_OK(result
)) {
2383 /* Get handle on group */
2386 struct samr_Ids group_rids
, name_types
;
2387 struct lsa_String lsa_acct_name
;
2389 init_lsa_String(&lsa_acct_name
, argv
[1]);
2391 status
= dcerpc_samr_LookupNames(b
, mem_ctx
,
2398 if (!NT_STATUS_IS_OK(status
)) {
2401 if (!NT_STATUS_IS_OK(result
)) {
2405 if (group_rids
.count
!= 1) {
2406 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2409 if (name_types
.count
!= 1) {
2410 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2414 status
= dcerpc_samr_OpenGroup(b
, mem_ctx
,
2420 if (!NT_STATUS_IS_OK(status
)) {
2423 if (!NT_STATUS_IS_OK(result
)) {
2431 status
= dcerpc_samr_DeleteDomainGroup(b
, mem_ctx
,
2434 if (!NT_STATUS_IS_OK(status
)) {
2437 if (!NT_STATUS_IS_OK(result
)) {
2442 /* Display results */
2444 dcerpc_samr_Close(b
, mem_ctx
, &group_pol
, &result
);
2445 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2446 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2452 /* Delete domain user */
2454 static NTSTATUS
cmd_samr_delete_dom_user(struct rpc_pipe_client
*cli
,
2455 TALLOC_CTX
*mem_ctx
,
2456 int argc
, const char **argv
)
2458 NTSTATUS status
, result
;
2459 struct policy_handle connect_pol
, domain_pol
, user_pol
;
2460 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
2461 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2463 if ((argc
< 2) || (argc
> 3)) {
2464 printf("Usage: %s username\n", argv
[0]);
2465 return NT_STATUS_OK
;
2469 sscanf(argv
[2], "%x", &access_mask
);
2471 /* Get sam policy and domain handles */
2473 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2474 MAXIMUM_ALLOWED_ACCESS
,
2476 if (!NT_STATUS_IS_OK(status
)) {
2480 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2482 MAXIMUM_ALLOWED_ACCESS
,
2486 if (!NT_STATUS_IS_OK(status
)) {
2489 if (!NT_STATUS_IS_OK(result
)) {
2494 /* Get handle on user */
2497 struct samr_Ids user_rids
, name_types
;
2498 struct lsa_String lsa_acct_name
;
2500 init_lsa_String(&lsa_acct_name
, argv
[1]);
2502 status
= dcerpc_samr_LookupNames(b
, mem_ctx
,
2509 if (!NT_STATUS_IS_OK(status
)) {
2512 if (!NT_STATUS_IS_OK(result
)) {
2516 if (user_rids
.count
!= 1) {
2517 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2520 if (name_types
.count
!= 1) {
2521 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2525 status
= dcerpc_samr_OpenUser(b
, mem_ctx
,
2531 if (!NT_STATUS_IS_OK(status
)) {
2534 if (!NT_STATUS_IS_OK(result
)) {
2542 status
= dcerpc_samr_DeleteUser(b
, mem_ctx
,
2545 if (!NT_STATUS_IS_OK(status
)) {
2548 if (!NT_STATUS_IS_OK(result
)) {
2553 /* Display results */
2555 dcerpc_samr_Close(b
, mem_ctx
, &user_pol
, &result
);
2556 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2557 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2563 /**********************************************************************
2564 * Query user security object
2566 static NTSTATUS
cmd_samr_query_sec_obj(struct rpc_pipe_client
*cli
,
2567 TALLOC_CTX
*mem_ctx
,
2568 int argc
, const char **argv
)
2570 struct policy_handle connect_pol
, domain_pol
, user_pol
, *pol
;
2571 NTSTATUS status
, result
;
2572 uint32_t sec_info
= SECINFO_DACL
;
2573 uint32_t user_rid
= 0;
2574 TALLOC_CTX
*ctx
= NULL
;
2575 struct sec_desc_buf
*sec_desc_buf
=NULL
;
2576 bool domain
= False
;
2577 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2579 ctx
=talloc_init("cmd_samr_query_sec_obj");
2581 if ((argc
< 1) || (argc
> 3)) {
2582 printf("Usage: %s [rid|-d] [sec_info]\n", argv
[0]);
2583 printf("\tSpecify rid for security on user, -d for security on domain\n");
2584 talloc_destroy(ctx
);
2585 return NT_STATUS_OK
;
2589 if (strcmp(argv
[1], "-d") == 0)
2592 sscanf(argv
[1], "%i", &user_rid
);
2596 sec_info
= atoi(argv
[2]);
2599 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2600 MAXIMUM_ALLOWED_ACCESS
,
2602 if (!NT_STATUS_IS_OK(status
)) {
2606 if (domain
|| user_rid
) {
2607 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2609 MAXIMUM_ALLOWED_ACCESS
,
2613 if (!NT_STATUS_IS_OK(status
)) {
2616 if (!NT_STATUS_IS_OK(result
)) {
2623 status
= dcerpc_samr_OpenUser(b
, mem_ctx
,
2625 MAXIMUM_ALLOWED_ACCESS
,
2629 if (!NT_STATUS_IS_OK(status
)) {
2632 if (!NT_STATUS_IS_OK(result
)) {
2638 /* Pick which query pol to use */
2648 /* Query SAM security object */
2650 status
= dcerpc_samr_QuerySecurity(b
, mem_ctx
,
2655 if (!NT_STATUS_IS_OK(status
)) {
2658 if (!NT_STATUS_IS_OK(result
)) {
2663 display_sec_desc(sec_desc_buf
->sd
);
2665 dcerpc_samr_Close(b
, mem_ctx
, &user_pol
, &result
);
2666 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2667 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2669 talloc_destroy(ctx
);
2673 static NTSTATUS
cmd_samr_get_usrdom_pwinfo(struct rpc_pipe_client
*cli
,
2674 TALLOC_CTX
*mem_ctx
,
2675 int argc
, const char **argv
)
2677 NTSTATUS status
, result
;
2678 struct policy_handle connect_pol
, domain_pol
, user_pol
;
2679 struct samr_PwInfo info
;
2681 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2684 printf("Usage: %s rid\n", argv
[0]);
2685 return NT_STATUS_OK
;
2688 sscanf(argv
[1], "%i", &rid
);
2690 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2691 MAXIMUM_ALLOWED_ACCESS
,
2693 if (!NT_STATUS_IS_OK(status
)) {
2697 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2699 MAXIMUM_ALLOWED_ACCESS
,
2703 if (!NT_STATUS_IS_OK(status
)) {
2706 if (!NT_STATUS_IS_OK(result
)) {
2711 status
= dcerpc_samr_OpenUser(b
, mem_ctx
,
2713 MAXIMUM_ALLOWED_ACCESS
,
2717 if (!NT_STATUS_IS_OK(status
)) {
2720 if (!NT_STATUS_IS_OK(result
)) {
2725 status
= dcerpc_samr_GetUserPwInfo(b
, mem_ctx
,
2729 if (!NT_STATUS_IS_OK(status
)) {
2733 if (NT_STATUS_IS_OK(result
)) {
2735 NDR_PRINT_STRUCT_STRING(mem_ctx
,
2736 samr_PwInfo
, &info
));
2740 dcerpc_samr_Close(b
, mem_ctx
, &user_pol
, &result
);
2741 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2742 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2747 static NTSTATUS
cmd_samr_get_dom_pwinfo(struct rpc_pipe_client
*cli
,
2748 TALLOC_CTX
*mem_ctx
,
2749 int argc
, const char **argv
)
2751 NTSTATUS status
, result
;
2752 struct lsa_String domain_name
;
2753 struct samr_PwInfo info
;
2754 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2756 if (argc
< 1 || argc
> 3) {
2757 printf("Usage: %s <domain>\n", argv
[0]);
2758 return NT_STATUS_OK
;
2761 init_lsa_String(&domain_name
, argv
[1]);
2763 status
= dcerpc_samr_GetDomPwInfo(b
, mem_ctx
,
2767 if (!NT_STATUS_IS_OK(status
)) {
2770 if (NT_STATUS_IS_OK(result
)) {
2771 printf("min_password_length: %d\n", info
.min_password_length
);
2772 display_password_properties(info
.password_properties
);
2778 /* Look up domain name */
2780 static NTSTATUS
cmd_samr_lookup_domain(struct rpc_pipe_client
*cli
,
2781 TALLOC_CTX
*mem_ctx
,
2782 int argc
, const char **argv
)
2784 struct policy_handle connect_pol
, domain_pol
;
2785 NTSTATUS status
, result
;
2786 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
2787 struct lsa_String domain_name
;
2788 struct dom_sid
*sid
= NULL
;
2789 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2792 printf("Usage: %s domain_name\n", argv
[0]);
2793 return NT_STATUS_OK
;
2796 init_lsa_String(&domain_name
, argv
[1]);
2798 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2801 if (!NT_STATUS_IS_OK(status
)) {
2805 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2811 if (!NT_STATUS_IS_OK(status
)) {
2814 if (!NT_STATUS_IS_OK(result
)) {
2819 status
= dcerpc_samr_LookupDomain(b
, mem_ctx
,
2824 if (!NT_STATUS_IS_OK(status
)) {
2827 if (!NT_STATUS_IS_OK(result
)) {
2832 if (NT_STATUS_IS_OK(result
)) {
2833 struct dom_sid_buf sid_str
;
2834 printf("SAMR_LOOKUP_DOMAIN: Domain Name: %s Domain SID: %s\n",
2836 dom_sid_str_buf(sid
, &sid_str
));
2839 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2840 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2845 /* Change user password */
2847 static NTSTATUS
cmd_samr_chgpasswd(struct rpc_pipe_client
*cli
,
2848 TALLOC_CTX
*mem_ctx
,
2849 int argc
, const char **argv
)
2851 struct policy_handle connect_pol
;
2852 struct policy_handle domain_pol
= { 0, };
2853 struct policy_handle user_pol
= { 0, };
2854 NTSTATUS status
, result
;
2855 const char *user
, *oldpass
, *newpass
;
2856 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
2857 struct samr_Ids rids
, types
;
2858 struct lsa_String lsa_acct_name
;
2859 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2862 printf("Usage: %s username oldpass newpass\n", argv
[0]);
2863 return NT_STATUS_INVALID_PARAMETER
;
2870 /* Get sam policy handle */
2872 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2873 MAXIMUM_ALLOWED_ACCESS
,
2875 if (!NT_STATUS_IS_OK(status
)) {
2879 /* Get domain policy handle */
2881 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2887 if (!NT_STATUS_IS_OK(status
)) {
2890 if (!NT_STATUS_IS_OK(result
)) {
2895 init_lsa_String(&lsa_acct_name
, user
);
2897 status
= dcerpc_samr_LookupNames(b
, mem_ctx
,
2904 if (!NT_STATUS_IS_OK(status
)) {
2907 if (!NT_STATUS_IS_OK(result
)) {
2911 if (rids
.count
!= 1) {
2912 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2915 if (types
.count
!= 1) {
2916 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
2920 status
= dcerpc_samr_OpenUser(b
, mem_ctx
,
2926 if (!NT_STATUS_IS_OK(status
)) {
2929 if (!NT_STATUS_IS_OK(result
)) {
2934 /* Change user password */
2935 status
= rpccli_samr_chgpasswd_user(cli
, mem_ctx
,
2939 if (!NT_STATUS_IS_OK(status
)) {
2944 if (is_valid_policy_hnd(&user_pol
)) {
2945 dcerpc_samr_Close(b
, mem_ctx
, &user_pol
, &result
);
2947 if (is_valid_policy_hnd(&domain_pol
)) {
2948 dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
2950 if (is_valid_policy_hnd(&connect_pol
)) {
2951 dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
2958 /* Change user password */
2960 static NTSTATUS
cmd_samr_chgpasswd2(struct rpc_pipe_client
*cli
,
2961 TALLOC_CTX
*mem_ctx
,
2962 int argc
, const char **argv
)
2964 struct policy_handle connect_pol
, domain_pol
;
2965 NTSTATUS status
, result
;
2966 const char *user
, *oldpass
, *newpass
;
2967 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
2968 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
2971 printf("Usage: %s username oldpass newpass\n", argv
[0]);
2972 return NT_STATUS_INVALID_PARAMETER
;
2979 /* Get sam policy handle */
2981 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
2982 MAXIMUM_ALLOWED_ACCESS
,
2984 if (!NT_STATUS_IS_OK(status
)) {
2988 /* Get domain policy handle */
2990 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
2996 if (!NT_STATUS_IS_OK(status
)) {
2999 if (!NT_STATUS_IS_OK(result
)) {
3004 /* Change user password */
3005 status
= rpccli_samr_chgpasswd_user2(cli
, mem_ctx
, user
, newpass
, oldpass
);
3007 if (!NT_STATUS_IS_OK(status
)) {
3011 status
= dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
3012 if (!NT_STATUS_IS_OK(status
)) goto done
;
3014 status
= dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
3015 if (!NT_STATUS_IS_OK(status
)) goto done
;
3022 /* Change user password */
3024 static NTSTATUS
cmd_samr_chgpasswd3(struct rpc_pipe_client
*cli
,
3025 TALLOC_CTX
*mem_ctx
,
3026 int argc
, const char **argv
)
3028 struct policy_handle connect_pol
, domain_pol
;
3029 NTSTATUS status
, result
;
3030 const char *user
, *oldpass
, *newpass
;
3031 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
3032 struct samr_DomInfo1
*info
= NULL
;
3033 struct userPwdChangeFailureInformation
*reject
= NULL
;
3034 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
3037 printf("Usage: %s username oldpass newpass\n", argv
[0]);
3038 return NT_STATUS_INVALID_PARAMETER
;
3045 /* Get sam policy handle */
3047 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
3048 MAXIMUM_ALLOWED_ACCESS
,
3050 if (!NT_STATUS_IS_OK(status
)) {
3054 /* Get domain policy handle */
3056 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
3062 if (!NT_STATUS_IS_OK(status
)) {
3065 if (!NT_STATUS_IS_OK(result
)) {
3070 /* Change user password */
3071 status
= rpccli_samr_chgpasswd_user3(cli
, mem_ctx
,
3077 if (!NT_STATUS_IS_OK(status
)) {
3081 if (NT_STATUS_EQUAL(result
, NT_STATUS_PASSWORD_RESTRICTION
)) {
3083 display_sam_dom_info_1(info
);
3085 switch (reject
->extendedFailureReason
) {
3086 case SAM_PWD_CHANGE_PASSWORD_TOO_SHORT
:
3087 d_printf("SAM_PWD_CHANGE_PASSWORD_TOO_SHORT\n");
3089 case SAM_PWD_CHANGE_PWD_IN_HISTORY
:
3090 d_printf("SAM_PWD_CHANGE_PWD_IN_HISTORY\n");
3092 case SAM_PWD_CHANGE_NOT_COMPLEX
:
3093 d_printf("SAM_PWD_CHANGE_NOT_COMPLEX\n");
3096 d_printf("unknown reject reason: %d\n",
3097 reject
->extendedFailureReason
);
3102 if (!NT_STATUS_IS_OK(result
)) {
3107 status
= dcerpc_samr_Close(b
, mem_ctx
, &domain_pol
, &result
);
3108 if (!NT_STATUS_IS_OK(status
)) goto done
;
3110 status
= dcerpc_samr_Close(b
, mem_ctx
, &connect_pol
, &result
);
3111 if (!NT_STATUS_IS_OK(status
)) goto done
;
3117 static NTSTATUS
cmd_samr_chgpasswd4(struct rpc_pipe_client
*cli
,
3118 TALLOC_CTX
*mem_ctx
,
3122 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
3123 const char *srv_name_slash
= cli
->srv_name_slash
;
3124 const char *user
= NULL
;
3125 const char *oldpass
= NULL
;
3126 const char *newpass
= NULL
;
3128 NTSTATUS result
= NT_STATUS_UNSUCCESSFUL
;
3131 printf("Usage: %s username oldpass newpass\n", argv
[0]);
3132 return NT_STATUS_INVALID_PARAMETER
;
3139 /* Change user password */
3140 status
= dcerpc_samr_chgpasswd_user4(b
,
3147 if (!NT_STATUS_IS_OK(status
)) {
3150 if (!NT_STATUS_IS_OK(result
)) {
3157 static NTSTATUS
cmd_samr_setuserinfo_int(struct rpc_pipe_client
*cli
,
3158 TALLOC_CTX
*mem_ctx
,
3159 int argc
, const char **argv
,
3162 struct policy_handle connect_pol
, domain_pol
, user_pol
;
3163 NTSTATUS status
, result
;
3164 const char *user
, *param
;
3165 uint32_t access_mask
= MAXIMUM_ALLOWED_ACCESS
;
3168 union samr_UserInfo info
;
3169 struct samr_CryptPassword pwd_buf
;
3170 struct samr_CryptPasswordEx pwd_buf_ex
;
3171 struct samr_EncryptedPasswordAES pwd_buf_aes
;
3172 uint8_t nt_hash
[16];
3173 uint8_t lm_hash
[16];
3174 DATA_BLOB session_key
;
3175 uint8_t salt_data
[16];
3178 .length
= sizeof(salt_data
),
3180 uint8_t password_expired
= 0;
3181 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
3182 TALLOC_CTX
*frame
= NULL
;
3186 printf("Usage: %s username level password [password_expired]\n",
3188 return NT_STATUS_INVALID_PARAMETER
;
3191 frame
= talloc_stackframe();
3194 level
= atoi(argv
[2]);
3198 password_expired
= atoi(argv
[4]);
3201 status
= dcerpc_binding_handle_transport_session_key(
3202 b
, frame
, &session_key
);
3203 if (!NT_STATUS_IS_OK(status
)) {
3207 generate_nonce_buffer(salt
.data
, salt
.length
);
3212 nt_lm_owf_gen(param
, nt_hash
, lm_hash
);
3216 status
= init_samr_CryptPassword(param
, &session_key
, &pwd_buf
);
3217 if (!NT_STATUS_IS_OK(status
)) {
3223 status
= init_samr_CryptPasswordEx(param
, &session_key
, &pwd_buf_ex
);
3224 if (!NT_STATUS_IS_OK(status
)) {
3229 status
= init_samr_CryptPasswordAES(frame
,
3234 if (!NT_STATUS_IS_OK(status
)) {
3246 in
= data_blob_const(nt_hash
, 16);
3247 out
= data_blob_talloc_zero(frame
, 16);
3248 if (out
.data
== NULL
) {
3249 status
= NT_STATUS_NO_MEMORY
;
3252 rc
= sess_crypt_blob(&out
, &in
, &session_key
, SAMBA_GNUTLS_ENCRYPT
);
3254 status
= gnutls_error_to_ntstatus(rc
,
3255 NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER
);
3257 memcpy(nt_hash
, out
.data
, out
.length
);
3261 in
= data_blob_const(lm_hash
, 16);
3262 out
= data_blob_talloc_zero(frame
, 15);
3263 if (out
.data
== NULL
) {
3264 status
= NT_STATUS_NO_MEMORY
;
3267 rc
= sess_crypt_blob(&out
, &in
, &session_key
, SAMBA_GNUTLS_ENCRYPT
);
3269 status
= gnutls_error_to_ntstatus(rc
,
3270 NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER
);
3272 memcpy(lm_hash
, out
.data
, out
.length
);
3275 memcpy(info
.info18
.nt_pwd
.hash
, nt_hash
, 16);
3276 memcpy(info
.info18
.lm_pwd
.hash
, lm_hash
, 16);
3277 info
.info18
.nt_pwd_active
= true;
3278 info
.info18
.lm_pwd_active
= true;
3279 info
.info18
.password_expired
= password_expired
;
3283 ZERO_STRUCT(info
.info21
);
3285 info
.info21
.fields_present
= SAMR_FIELD_NT_PASSWORD_PRESENT
|
3286 SAMR_FIELD_LM_PASSWORD_PRESENT
;
3288 info
.info21
.fields_present
|= SAMR_FIELD_EXPIRED_FLAG
;
3289 info
.info21
.password_expired
= password_expired
;
3292 info
.info21
.lm_password_set
= true;
3293 info
.info21
.lm_owf_password
.length
= 16;
3294 info
.info21
.lm_owf_password
.size
= 16;
3296 info
.info21
.nt_password_set
= true;
3297 info
.info21
.nt_owf_password
.length
= 16;
3298 info
.info21
.nt_owf_password
.size
= 16;
3302 in
= data_blob_const(nt_hash
, 16);
3303 out
= data_blob_talloc_zero(frame
, 16);
3304 if (out
.data
== NULL
) {
3305 status
= NT_STATUS_NO_MEMORY
;
3308 rc
= sess_crypt_blob(&out
, &in
, &session_key
, SAMBA_GNUTLS_ENCRYPT
);
3310 status
= gnutls_error_to_ntstatus(rc
,
3311 NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER
);
3313 info
.info21
.nt_owf_password
.array
=
3314 (uint16_t *)talloc_memdup(frame
, out
.data
, 16);
3318 in
= data_blob_const(lm_hash
, 16);
3319 out
= data_blob_talloc_zero(frame
, 16);
3320 rc
= sess_crypt_blob(&out
, &in
, &session_key
, SAMBA_GNUTLS_ENCRYPT
);
3322 status
= gnutls_error_to_ntstatus(rc
,
3323 NT_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER
);
3325 info
.info21
.lm_owf_password
.array
=
3326 (uint16_t *)talloc_memdup(frame
, out
.data
, 16);
3327 if (out
.data
== NULL
) {
3328 status
= NT_STATUS_NO_MEMORY
;
3335 ZERO_STRUCT(info
.info23
);
3337 info
.info23
.info
.fields_present
= SAMR_FIELD_NT_PASSWORD_PRESENT
|
3338 SAMR_FIELD_LM_PASSWORD_PRESENT
;
3340 info
.info23
.info
.fields_present
|= SAMR_FIELD_EXPIRED_FLAG
;
3341 info
.info23
.info
.password_expired
= password_expired
;
3344 info
.info23
.password
= pwd_buf
;
3348 info
.info24
.password
= pwd_buf
;
3349 info
.info24
.password_expired
= password_expired
;
3353 ZERO_STRUCT(info
.info25
);
3355 info
.info25
.info
.fields_present
= SAMR_FIELD_NT_PASSWORD_PRESENT
|
3356 SAMR_FIELD_LM_PASSWORD_PRESENT
;
3358 info
.info25
.info
.fields_present
|= SAMR_FIELD_EXPIRED_FLAG
;
3359 info
.info25
.info
.password_expired
= password_expired
;
3362 info
.info25
.password
= pwd_buf_ex
;
3366 info
.info26
.password
= pwd_buf_ex
;
3367 info
.info26
.password_expired
= password_expired
;
3371 info
.info31
.password
= pwd_buf_aes
;
3372 info
.info31
.password_expired
= password_expired
;
3375 status
= NT_STATUS_INVALID_INFO_CLASS
;
3379 /* Get sam policy handle */
3381 status
= rpccli_try_samr_connects(cli
, frame
,
3382 MAXIMUM_ALLOWED_ACCESS
,
3384 if (!NT_STATUS_IS_OK(status
)) {
3388 /* Get domain policy handle */
3390 status
= dcerpc_samr_OpenDomain(b
, frame
,
3397 if (!NT_STATUS_IS_OK(status
))
3399 if (!NT_STATUS_IS_OK(result
)) {
3404 user_rid
= strtol(user
, NULL
, 0);
3406 status
= dcerpc_samr_OpenUser(b
, frame
,
3412 if (!NT_STATUS_IS_OK(status
)) {
3419 if (NT_STATUS_EQUAL(status
, NT_STATUS_NO_SUCH_USER
) ||
3422 /* Probably this was a user name, try lookupnames */
3423 struct samr_Ids rids
, types
;
3424 struct lsa_String lsa_acct_name
;
3426 init_lsa_String(&lsa_acct_name
, user
);
3428 status
= dcerpc_samr_LookupNames(b
, frame
,
3435 if (!NT_STATUS_IS_OK(status
)) {
3438 if (!NT_STATUS_IS_OK(result
)) {
3442 if (rids
.count
!= 1) {
3443 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
3446 if (types
.count
!= 1) {
3447 status
= NT_STATUS_INVALID_NETWORK_RESPONSE
;
3451 status
= dcerpc_samr_OpenUser(b
, frame
,
3457 if (!NT_STATUS_IS_OK(status
)) {
3460 if (!NT_STATUS_IS_OK(result
)) {
3467 case NDR_SAMR_SETUSERINFO
:
3468 status
= dcerpc_samr_SetUserInfo(b
, frame
,
3474 case NDR_SAMR_SETUSERINFO2
:
3475 status
= dcerpc_samr_SetUserInfo2(b
, frame
,
3482 status
= NT_STATUS_INVALID_PARAMETER
;
3485 if (!NT_STATUS_IS_OK(status
)) {
3486 DEBUG(0,("status: %s\n", nt_errstr(status
)));
3489 if (!NT_STATUS_IS_OK(result
)) {
3491 DEBUG(0,("result: %s\n", nt_errstr(status
)));
3495 status
= NT_STATUS_OK
;
3501 static NTSTATUS
cmd_samr_setuserinfo(struct rpc_pipe_client
*cli
,
3502 TALLOC_CTX
*mem_ctx
,
3503 int argc
, const char **argv
)
3505 return cmd_samr_setuserinfo_int(cli
, mem_ctx
, argc
, argv
,
3506 NDR_SAMR_SETUSERINFO
);
3509 static NTSTATUS
cmd_samr_setuserinfo2(struct rpc_pipe_client
*cli
,
3510 TALLOC_CTX
*mem_ctx
,
3511 int argc
, const char **argv
)
3513 return cmd_samr_setuserinfo_int(cli
, mem_ctx
, argc
, argv
,
3514 NDR_SAMR_SETUSERINFO2
);
3517 static NTSTATUS
cmd_samr_get_dispinfo_idx(struct rpc_pipe_client
*cli
,
3518 TALLOC_CTX
*mem_ctx
,
3519 int argc
, const char **argv
)
3521 NTSTATUS status
, result
;
3522 struct policy_handle connect_handle
;
3523 struct policy_handle domain_handle
= { 0, };
3525 struct lsa_String name
;
3527 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
3529 if (argc
< 2 || argc
> 3) {
3530 printf("Usage: %s name level\n", argv
[0]);
3531 return NT_STATUS_INVALID_PARAMETER
;
3534 init_lsa_String(&name
, argv
[1]);
3537 level
= atoi(argv
[2]);
3540 status
= rpccli_try_samr_connects(cli
, mem_ctx
,
3541 SEC_FLAG_MAXIMUM_ALLOWED
,
3543 if (!NT_STATUS_IS_OK(status
)) {
3547 status
= dcerpc_samr_OpenDomain(b
, mem_ctx
,
3549 SEC_FLAG_MAXIMUM_ALLOWED
,
3553 if (!NT_STATUS_IS_OK(status
)) {
3556 if (!NT_STATUS_IS_OK(result
)) {
3561 status
= dcerpc_samr_GetDisplayEnumerationIndex(b
, mem_ctx
,
3567 if (!NT_STATUS_IS_OK(status
)) {
3573 if (NT_STATUS_IS_OK(status
) ||
3574 NT_STATUS_EQUAL(status
, NT_STATUS_NO_MORE_ENTRIES
)) {
3575 printf("idx: %d (0x%08x)\n", idx
, idx
);
3579 if (is_valid_policy_hnd(&domain_handle
)) {
3580 dcerpc_samr_Close(b
, mem_ctx
, &domain_handle
, &result
);
3582 if (is_valid_policy_hnd(&connect_handle
)) {
3583 dcerpc_samr_Close(b
, mem_ctx
, &connect_handle
, &result
);
3589 /* List of commands exported by this module */
3591 struct cmd_set samr_commands
[] = {
3598 .name
= "queryuser",
3599 .returntype
= RPC_RTYPE_NTSTATUS
,
3600 .ntfn
= cmd_samr_query_user
,
3602 .table
= &ndr_table_samr
,
3604 .description
= "Query user info",
3608 .name
= "querygroup",
3609 .returntype
= RPC_RTYPE_NTSTATUS
,
3610 .ntfn
= cmd_samr_query_group
,
3612 .table
= &ndr_table_samr
,
3614 .description
= "Query group info",
3618 .name
= "queryusergroups",
3619 .returntype
= RPC_RTYPE_NTSTATUS
,
3620 .ntfn
= cmd_samr_query_usergroups
,
3622 .table
= &ndr_table_samr
,
3624 .description
= "Query user groups",
3628 .name
= "queryuseraliases",
3629 .returntype
= RPC_RTYPE_NTSTATUS
,
3630 .ntfn
= cmd_samr_query_useraliases
,
3632 .table
= &ndr_table_samr
,
3634 .description
= "Query user aliases",
3638 .name
= "querygroupmem",
3639 .returntype
= RPC_RTYPE_NTSTATUS
,
3640 .ntfn
= cmd_samr_query_groupmem
,
3642 .table
= &ndr_table_samr
,
3644 .description
= "Query group membership",
3648 .name
= "queryaliasmem",
3649 .returntype
= RPC_RTYPE_NTSTATUS
,
3650 .ntfn
= cmd_samr_query_aliasmem
,
3652 .table
= &ndr_table_samr
,
3654 .description
= "Query alias membership",
3658 .name
= "queryaliasinfo",
3659 .returntype
= RPC_RTYPE_NTSTATUS
,
3660 .ntfn
= cmd_samr_query_aliasinfo
,
3662 .table
= &ndr_table_samr
,
3664 .description
= "Query alias info",
3668 .name
= "deletealias",
3669 .returntype
= RPC_RTYPE_NTSTATUS
,
3670 .ntfn
= cmd_samr_delete_alias
,
3672 .table
= &ndr_table_samr
,
3674 .description
= "Delete an alias",
3678 .name
= "querydispinfo",
3679 .returntype
= RPC_RTYPE_NTSTATUS
,
3680 .ntfn
= cmd_samr_query_dispinfo
,
3682 .table
= &ndr_table_samr
,
3684 .description
= "Query display info",
3688 .name
= "querydispinfo2",
3689 .returntype
= RPC_RTYPE_NTSTATUS
,
3690 .ntfn
= cmd_samr_query_dispinfo2
,
3692 .table
= &ndr_table_samr
,
3694 .description
= "Query display info",
3698 .name
= "querydispinfo3",
3699 .returntype
= RPC_RTYPE_NTSTATUS
,
3700 .ntfn
= cmd_samr_query_dispinfo3
,
3702 .table
= &ndr_table_samr
,
3704 .description
= "Query display info",
3708 .name
= "querydominfo",
3709 .returntype
= RPC_RTYPE_NTSTATUS
,
3710 .ntfn
= cmd_samr_query_dominfo
,
3712 .table
= &ndr_table_samr
,
3714 .description
= "Query domain info",
3718 .name
= "enumdomusers",
3719 .returntype
= RPC_RTYPE_NTSTATUS
,
3720 .ntfn
= cmd_samr_enum_dom_users
,
3722 .table
= &ndr_table_samr
,
3724 .description
= "Enumerate domain users",
3728 .name
= "enumdomgroups",
3729 .returntype
= RPC_RTYPE_NTSTATUS
,
3730 .ntfn
= cmd_samr_enum_dom_groups
,
3732 .table
= &ndr_table_samr
,
3734 .description
= "Enumerate domain groups",
3738 .name
= "enumalsgroups",
3739 .returntype
= RPC_RTYPE_NTSTATUS
,
3740 .ntfn
= cmd_samr_enum_als_groups
,
3742 .table
= &ndr_table_samr
,
3744 .description
= "Enumerate alias groups",
3748 .name
= "enumdomains",
3749 .returntype
= RPC_RTYPE_NTSTATUS
,
3750 .ntfn
= cmd_samr_enum_domains
,
3752 .table
= &ndr_table_samr
,
3754 .description
= "Enumerate domains",
3759 .name
= "createdomuser",
3760 .returntype
= RPC_RTYPE_NTSTATUS
,
3761 .ntfn
= cmd_samr_create_dom_user
,
3763 .table
= &ndr_table_samr
,
3765 .description
= "Create domain user",
3769 .name
= "createdomgroup",
3770 .returntype
= RPC_RTYPE_NTSTATUS
,
3771 .ntfn
= cmd_samr_create_dom_group
,
3773 .table
= &ndr_table_samr
,
3775 .description
= "Create domain group",
3779 .name
= "createdomalias",
3780 .returntype
= RPC_RTYPE_NTSTATUS
,
3781 .ntfn
= cmd_samr_create_dom_alias
,
3783 .table
= &ndr_table_samr
,
3785 .description
= "Create domain alias",
3789 .name
= "samlookupnames",
3790 .returntype
= RPC_RTYPE_NTSTATUS
,
3791 .ntfn
= cmd_samr_lookup_names
,
3793 .table
= &ndr_table_samr
,
3795 .description
= "Look up names",
3799 .name
= "samlookuprids",
3800 .returntype
= RPC_RTYPE_NTSTATUS
,
3801 .ntfn
= cmd_samr_lookup_rids
,
3803 .table
= &ndr_table_samr
,
3805 .description
= "Look up names",
3809 .name
= "deletedomgroup",
3810 .returntype
= RPC_RTYPE_NTSTATUS
,
3811 .ntfn
= cmd_samr_delete_dom_group
,
3813 .table
= &ndr_table_samr
,
3815 .description
= "Delete domain group",
3819 .name
= "deletedomuser",
3820 .returntype
= RPC_RTYPE_NTSTATUS
,
3821 .ntfn
= cmd_samr_delete_dom_user
,
3823 .table
= &ndr_table_samr
,
3825 .description
= "Delete domain user",
3829 .name
= "samquerysecobj",
3830 .returntype
= RPC_RTYPE_NTSTATUS
,
3831 .ntfn
= cmd_samr_query_sec_obj
,
3833 .table
= &ndr_table_samr
,
3835 .description
= "Query SAMR security object",
3839 .name
= "getdompwinfo",
3840 .returntype
= RPC_RTYPE_NTSTATUS
,
3841 .ntfn
= cmd_samr_get_dom_pwinfo
,
3843 .table
= &ndr_table_samr
,
3845 .description
= "Retrieve domain password info",
3849 .name
= "getusrdompwinfo",
3850 .returntype
= RPC_RTYPE_NTSTATUS
,
3851 .ntfn
= cmd_samr_get_usrdom_pwinfo
,
3853 .table
= &ndr_table_samr
,
3855 .description
= "Retrieve user domain password info",
3860 .name
= "lookupdomain",
3861 .returntype
= RPC_RTYPE_NTSTATUS
,
3862 .ntfn
= cmd_samr_lookup_domain
,
3864 .table
= &ndr_table_samr
,
3866 .description
= "Lookup Domain Name",
3870 .name
= "chgpasswd",
3871 .returntype
= RPC_RTYPE_NTSTATUS
,
3872 .ntfn
= cmd_samr_chgpasswd
,
3874 .table
= &ndr_table_samr
,
3876 .description
= "Change user password",
3880 .name
= "chgpasswd2",
3881 .returntype
= RPC_RTYPE_NTSTATUS
,
3882 .ntfn
= cmd_samr_chgpasswd2
,
3884 .table
= &ndr_table_samr
,
3886 .description
= "Change user password",
3890 .name
= "chgpasswd3",
3891 .returntype
= RPC_RTYPE_NTSTATUS
,
3892 .ntfn
= cmd_samr_chgpasswd3
,
3894 .table
= &ndr_table_samr
,
3896 .description
= "Change user password",
3900 .name
= "chgpasswd4",
3901 .returntype
= RPC_RTYPE_NTSTATUS
,
3902 .ntfn
= cmd_samr_chgpasswd4
,
3904 .table
= &ndr_table_samr
,
3906 .description
= "Change user password",
3910 .name
= "getdispinfoidx",
3911 .returntype
= RPC_RTYPE_NTSTATUS
,
3912 .ntfn
= cmd_samr_get_dispinfo_idx
,
3914 .table
= &ndr_table_samr
,
3916 .description
= "Get Display Information Index",
3920 .name
= "setuserinfo",
3921 .returntype
= RPC_RTYPE_NTSTATUS
,
3922 .ntfn
= cmd_samr_setuserinfo
,
3924 .table
= &ndr_table_samr
,
3926 .description
= "Set user info",
3930 .name
= "setuserinfo2",
3931 .returntype
= RPC_RTYPE_NTSTATUS
,
3932 .ntfn
= cmd_samr_setuserinfo2
,
3934 .table
= &ndr_table_samr
,
3936 .description
= "Set user info2",