2 Unix SMB/Netbios implementation.
6 Copyright (C) Andrew Tridgell 1992-2000,
7 Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
8 Copyright (C) Elrond 2000
9 Copyright (C) Tim Potter 2000
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 2 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, write to the Free Software
23 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 extern pstring server;
29 extern DOM_SID domain_sid;
31 /****************************************************************************
32 display sam_user_info_21 structure
33 ****************************************************************************/
34 static void display_sam_user_info_21(SAM_USER_INFO_21 *usr)
38 unistr2_to_ascii(temp, &usr->uni_user_name, sizeof(temp)-1);
39 printf("\tUser Name :\t%s\n", temp);
41 unistr2_to_ascii(temp, &usr->uni_full_name, sizeof(temp)-1);
42 printf("\tFull Name :\t%s\n", temp);
44 unistr2_to_ascii(temp, &usr->uni_home_dir, sizeof(temp)-1);
45 printf("\tHome Drive :\t%s\n", temp);
47 unistr2_to_ascii(temp, &usr->uni_dir_drive, sizeof(temp)-1);
48 printf("\tDir Drive :\t%s\n", temp);
50 unistr2_to_ascii(temp, &usr->uni_profile_path, sizeof(temp)-1);
51 printf("\tProfile Path:\t%s\n", temp);
53 unistr2_to_ascii(temp, &usr->uni_logon_script, sizeof(temp)-1);
54 printf("\tLogon Script:\t%s\n", temp);
56 unistr2_to_ascii(temp, &usr->uni_acct_desc, sizeof(temp)-1);
57 printf("\tDescription :\t%s\n", temp);
59 unistr2_to_ascii(temp, &usr->uni_workstations, sizeof(temp)-1);
60 printf("\tWorkstations:\t%s\n", temp);
62 unistr2_to_ascii(temp, &usr->uni_unknown_str, sizeof(temp)-1);
63 printf("\tUnknown Str :\t%s\n", temp);
65 unistr2_to_ascii(temp, &usr->uni_munged_dial, sizeof(temp)-1);
66 printf("\tRemote Dial :\t%s\n", temp);
68 printf("\tLogon Time :\t%s\n",
69 http_timestring(nt_time_to_unix(&usr->logon_time)));
70 printf("\tLogoff Time :\t%s\n",
71 http_timestring(nt_time_to_unix(&usr->logoff_time)));
72 printf("\tKickoff Time :\t%s\n",
73 http_timestring(nt_time_to_unix(&usr->kickoff_time)));
74 printf("\tPassword last set Time :\t%s\n",
75 http_timestring(nt_time_to_unix(&usr->pass_last_set_time)));
76 printf("\tPassword can change Time :\t%s\n",
77 http_timestring(nt_time_to_unix(&usr->pass_can_change_time)));
78 printf("\tPassword must change Time:\t%s\n",
79 http_timestring(nt_time_to_unix(&usr->pass_must_change_time)));
81 printf("\tunknown_2[0..31]...\n"); /* user passwords? */
83 printf("\tuser_rid :\t%x\n" , usr->user_rid ); /* User ID */
84 printf("\tgroup_rid:\t%x\n" , usr->group_rid); /* Group ID */
85 printf("\tacb_info :\t%04x\n", usr->acb_info ); /* Account Control Info */
87 printf("\tunknown_3:\t%08x\n", usr->unknown_3); /* 0x00ff ffff */
88 printf("\tlogon_divs:\t%d\n", usr->logon_divs); /* 0x0000 00a8 which is 168 which is num hrs in a week */
89 printf("\tunknown_5:\t%08x\n", usr->unknown_5); /* 0x0002 0000 */
91 printf("\tpadding1[0..7]...\n");
93 if (usr->ptr_logon_hrs) {
94 printf("\tlogon_hrs[0..%d]...\n", usr->logon_hrs.len);
98 /* Query user information */
100 static uint32 cmd_samr_query_user(int argc, char **argv)
102 struct cli_state cli;
103 POLICY_HND connect_pol, domain_pol, user_pol;
104 uint32 result = NT_STATUS_UNSUCCESSFUL, info_level = 21;
105 struct ntuser_creds creds;
106 BOOL got_connect_pol = False, got_domain_pol = False,
107 got_user_pol = False;
108 SAM_USERINFO_CTR user_ctr;
109 SAM_USER_INFO_21 info_21;
112 printf("Usage: %s\n", argv[0]);
116 /* Open a lsa handle */
119 init_rpcclient_creds(&creds);
121 if (!cli_samr_initialise(&cli, server, &creds)) {
125 if ((result = cli_samr_connect(&cli, server, MAXIMUM_ALLOWED_ACCESS,
127 NT_STATUS_NOPROBLEMO) {
131 got_connect_pol = True;
134 if ((result = cli_samr_open_domain(&cli, &connect_pol,
135 MAXIMUM_ALLOWED_ACCESS,
136 &domain_sid, &domain_pol))
137 != NT_STATUS_NOPROBLEMO) {
141 got_domain_pol = True;
143 if ((result = cli_samr_open_user(&cli, &domain_pol,
144 MAXIMUM_ALLOWED_ACCESS,
146 != NT_STATUS_NOPROBLEMO) {
152 ZERO_STRUCT(user_ctr);
153 ZERO_STRUCT(info_21);
155 user_ctr.info.id21 = &info_21;
157 if ((result = cli_samr_query_userinfo(&cli, &user_pol, info_level,
159 != NT_STATUS_NOPROBLEMO) {
163 display_sam_user_info_21(&info_21);
166 if (got_user_pol) cli_samr_close(&cli, &user_pol);
167 if (got_domain_pol) cli_samr_close(&cli, &domain_pol);
168 if (got_connect_pol) cli_samr_close(&cli, &connect_pol);
170 cli_samr_shutdown(&cli);
175 /****************************************************************************
177 ****************************************************************************/
178 static void display_group_info1(GROUP_INFO1 *info1)
182 unistr2_to_ascii(temp, &info1->uni_acct_name, sizeof(temp)-1);
183 printf("\tGroup Name:\t%s\n", temp);
184 unistr2_to_ascii(temp, &info1->uni_acct_desc, sizeof(temp)-1);
185 printf("\tDescription:\t%s\n", temp);
186 printf("\tunk1:%d\n", info1->unknown_1);
187 printf("\tNum Members:%d\n", info1->num_members);
190 /****************************************************************************
192 ****************************************************************************/
193 static void display_group_info4(GROUP_INFO4 *info4)
197 unistr2_to_ascii(desc, &info4->uni_acct_desc, sizeof(desc)-1);
198 printf("\tGroup Description:%s\n", desc);
201 /****************************************************************************
202 display sam sync structure
203 ****************************************************************************/
204 static void display_group_info_ctr(GROUP_INFO_CTR *ctr)
206 switch (ctr->switch_value1) {
208 display_group_info1(&ctr->group.info1);
212 display_group_info4(&ctr->group.info4);
218 /* Query group information */
220 static uint32 cmd_samr_query_group(int argc, char **argv)
222 struct cli_state cli;
223 POLICY_HND connect_pol, domain_pol, group_pol;
224 uint32 result = NT_STATUS_UNSUCCESSFUL, info_level = 1;
225 struct ntuser_creds creds;
226 BOOL got_connect_pol = False, got_domain_pol = False,
227 got_group_pol = False;
228 GROUP_INFO_CTR group_ctr;
231 printf("Usage: %s\n", argv[0]);
235 /* Open a lsa handle */
238 init_rpcclient_creds(&creds);
240 if (!cli_samr_initialise(&cli, server, &creds)) {
244 if ((result = cli_samr_connect(&cli, server, MAXIMUM_ALLOWED_ACCESS,
246 NT_STATUS_NOPROBLEMO) {
250 got_connect_pol = True;
253 if ((result = cli_samr_open_domain(&cli, &connect_pol,
254 MAXIMUM_ALLOWED_ACCESS,
255 &domain_sid, &domain_pol))
256 != NT_STATUS_NOPROBLEMO) {
260 got_domain_pol = True;
262 if ((result = cli_samr_open_group(&cli, &domain_pol,
263 MAXIMUM_ALLOWED_ACCESS,
265 != NT_STATUS_NOPROBLEMO) {
269 got_group_pol = True;
271 ZERO_STRUCT(group_ctr);
273 if ((result = cli_samr_query_groupinfo(&cli, &group_pol, info_level,
275 != NT_STATUS_NOPROBLEMO) {
279 display_group_info_ctr(&group_ctr);
282 if (got_group_pol) cli_samr_close(&cli, &group_pol);
283 if (got_domain_pol) cli_samr_close(&cli, &domain_pol);
284 if (got_connect_pol) cli_samr_close(&cli, &connect_pol);
286 cli_samr_shutdown(&cli);
291 /* Query groups a user is a member of */
293 static uint32 cmd_samr_query_usergroups(int argc, char **argv)
295 struct cli_state cli;
296 POLICY_HND connect_pol, domain_pol, user_pol;
297 uint32 result = NT_STATUS_UNSUCCESSFUL;
298 struct ntuser_creds creds;
299 BOOL got_connect_pol = False, got_domain_pol = False,
300 got_user_pol = False;
301 uint32 num_groups, user_rid;
306 printf("Usage: %s rid/name\n", argv[0]);
310 sscanf(argv[1], "%i", &user_rid);
312 /* Open a lsa handle */
315 init_rpcclient_creds(&creds);
317 if (!cli_samr_initialise(&cli, server, &creds)) {
321 if ((result = cli_samr_connect(&cli, server, MAXIMUM_ALLOWED_ACCESS,
323 NT_STATUS_NOPROBLEMO) {
327 got_connect_pol = True;
330 if ((result = cli_samr_open_domain(&cli, &connect_pol,
331 MAXIMUM_ALLOWED_ACCESS,
332 &domain_sid, &domain_pol))
333 != NT_STATUS_NOPROBLEMO) {
337 got_domain_pol = True;
339 if ((result = cli_samr_open_user(&cli, &domain_pol,
340 MAXIMUM_ALLOWED_ACCESS,
341 user_rid, &user_pol))
342 != NT_STATUS_NOPROBLEMO) {
348 if ((result = cli_samr_query_usergroups(&cli, &user_pol,
349 &num_groups, &user_gids))
350 != NT_STATUS_NOPROBLEMO) {
354 for (i = 0; i < num_groups; i++) {
355 printf("\tgroup rid:[0x%x] attr:[0x%x]\n",
356 user_gids[i].g_rid, user_gids[i].attr);
360 if (got_user_pol) cli_samr_close(&cli, &user_pol);
361 if (got_domain_pol) cli_samr_close(&cli, &domain_pol);
362 if (got_connect_pol) cli_samr_close(&cli, &connect_pol);
364 cli_samr_shutdown(&cli);
369 /* Query members of a group */
371 static uint32 cmd_samr_query_groupmem(int argc, char **argv)
373 struct cli_state cli;
374 POLICY_HND connect_pol, domain_pol, group_pol;
375 uint32 result = NT_STATUS_UNSUCCESSFUL;
376 struct ntuser_creds creds;
377 BOOL got_connect_pol = False, got_domain_pol = False,
378 got_group_pol = False;
379 uint32 num_members, *group_rids, *group_attrs, group_rid;
383 printf("Usage: %s rid/name\n", argv[0]);
387 sscanf(argv[1], "%i", &group_rid);
389 /* Open a lsa handle */
392 init_rpcclient_creds(&creds);
394 if (!cli_samr_initialise(&cli, server, &creds)) {
398 if ((result = cli_samr_connect(&cli, server, MAXIMUM_ALLOWED_ACCESS,
400 NT_STATUS_NOPROBLEMO) {
404 got_connect_pol = True;
407 if ((result = cli_samr_open_domain(&cli, &connect_pol,
408 MAXIMUM_ALLOWED_ACCESS,
409 &domain_sid, &domain_pol))
410 != NT_STATUS_NOPROBLEMO) {
414 got_domain_pol = True;
416 if ((result = cli_samr_open_group(&cli, &domain_pol,
417 MAXIMUM_ALLOWED_ACCESS,
418 group_rid, &group_pol))
419 != NT_STATUS_NOPROBLEMO) {
423 got_group_pol = True;
425 if ((result = cli_samr_query_groupmem(&cli, &group_pol,
426 &num_members, &group_rids,
428 != NT_STATUS_NOPROBLEMO) {
432 for (i = 0; i < num_members; i++) {
433 printf("\trid:[0x%x] attr:[0x%x]\n", group_rids[i],
438 if (got_group_pol) cli_samr_close(&cli, &group_pol);
439 if (got_domain_pol) cli_samr_close(&cli, &domain_pol);
440 if (got_connect_pol) cli_samr_close(&cli, &connect_pol);
442 cli_samr_shutdown(&cli);
447 /* List of commands exported by this module */
449 struct cmd_set samr_commands[] = {
450 { "queryuser", cmd_samr_query_user, "Query user info" },
451 { "querygroup", cmd_samr_query_group, "Query group info" },
452 { "queryusergroups", cmd_samr_query_usergroups, "Query user groups" },
453 { "querygroupmem", cmd_samr_query_groupmem, "Query group membership" },