1 /*
2  *  Unix SMB/CIFS implementation.
3  *  NetUserGetInfo query
4  *  Copyright (C) Guenther Deschner 2008
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <sys/types.h>
21 #include <inttypes.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 
26 #include <netapi.h>
27 
28 #include "common.h"
29 
main(int argc,const char ** argv)30 int main(int argc, const char **argv)
31 {
32 	NET_API_STATUS status;
33 	struct libnetapi_ctx *ctx = NULL;
34 	const char *hostname = NULL;
35 	const char *username = NULL;
36 	uint8_t *buffer = NULL;
37 	uint32_t level = 0;
38 	char *sid_str = NULL;
39 	int i;
40 
41 	struct USER_INFO_0 *u0;
42 	struct USER_INFO_1 *u1;
43 	struct USER_INFO_2 *u2;
44 	struct USER_INFO_3 *u3;
45 	struct USER_INFO_4 *u4;
46 	struct USER_INFO_10 *u10;
47 	struct USER_INFO_11 *u11;
48 	struct USER_INFO_20 *u20;
49 	struct USER_INFO_23 *u23;
50 
51 	poptContext pc;
52 	int opt;
53 
54 	struct poptOption long_options[] = {
55 		POPT_AUTOHELP
56 		POPT_COMMON_LIBNETAPI_EXAMPLES
57 		POPT_TABLEEND
58 	};
59 
60 	status = libnetapi_init(&ctx);
61 	if (status != 0) {
62 		return status;
63 	}
64 
65 	pc = poptGetContext("user_getinfo", argc, argv, long_options, 0);
66 
67 	poptSetOtherOptionHelp(pc, "hostname username level");
68 	while((opt = poptGetNextOpt(pc)) != -1) {
69 	}
70 
71 	if (!poptPeekArg(pc)) {
72 		poptPrintHelp(pc, stderr, 0);
73 		goto out;
74 	}
75 	hostname = poptGetArg(pc);
76 
77 	if (!poptPeekArg(pc)) {
78 		poptPrintHelp(pc, stderr, 0);
79 		goto out;
80 	}
81 	username = poptGetArg(pc);
82 
83 	if (poptPeekArg(pc)) {
84 		level = atoi(poptGetArg(pc));
85 	}
86 
87 	/* NetUserGetInfo */
88 
89 	status = NetUserGetInfo(hostname,
90 				username,
91 				level,
92 				&buffer);
93 	if (status != 0) {
94 		printf("NetUserGetInfo failed with: %s\n",
95 			libnetapi_get_error_string(ctx, status));
96 		goto out;
97 	}
98 
99 	switch (level) {
100 		case 0:
101 			u0 = (struct USER_INFO_0 *)buffer;
102 			printf("name: %s\n", u0->usri0_name);
103 			break;
104 		case 1:
105 			u1 = (struct USER_INFO_1 *)buffer;
106 			printf("name: %s\n", u1->usri1_name);
107 			printf("password: %s\n", u1->usri1_password);
108 			printf("password_age: %d\n", u1->usri1_password_age);
109 			printf("priv: %d\n", u1->usri1_priv);
110 			printf("homedir: %s\n", u1->usri1_home_dir);
111 			printf("comment: %s\n", u1->usri1_comment);
112 			printf("flags: 0x%08x\n", u1->usri1_flags);
113 			printf("script: %s\n", u1->usri1_script_path);
114 			break;
115 		case 2:
116 			u2 = (struct USER_INFO_2 *)buffer;
117 			printf("name: %s\n", u2->usri2_name);
118 			printf("password: %s\n", u2->usri2_password);
119 			printf("password_age: %d\n", u2->usri2_password_age);
120 			printf("priv: %d\n", u2->usri2_priv);
121 			printf("homedir: %s\n", u2->usri2_home_dir);
122 			printf("comment: %s\n", u2->usri2_comment);
123 			printf("flags: 0x%08x\n", u2->usri2_flags);
124 			printf("script: %s\n", u2->usri2_script_path);
125 			printf("auth flags: 0x%08x\n", u2->usri2_auth_flags);
126 			printf("full name: %s\n", u2->usri2_full_name);
127 			printf("user comment: %s\n", u2->usri2_usr_comment);
128 			printf("user parameters: %s\n", u2->usri2_parms);
129 			printf("workstations: %s\n", u2->usri2_workstations);
130 			printf("last logon (seconds since jan. 1, 1970 GMT): %d\n",
131 				u2->usri2_last_logon);
132 			printf("last logoff (seconds since jan. 1, 1970 GMT): %d\n",
133 				u2->usri2_last_logoff);
134 			printf("account expires (seconds since jan. 1, 1970 GMT): %d\n",
135 				u2->usri2_acct_expires);
136 			printf("max storage: %d\n", u2->usri2_max_storage);
137 			printf("units per week: %d\n", u2->usri2_units_per_week);
138 			printf("logon hours:");
139 			for (i=0; i<21; i++) {
140 				printf(" %x", (uint8_t)u2->usri2_logon_hours[i]);
141 			}
142 			printf("\n");
143 			printf("bad password count: %d\n", u2->usri2_bad_pw_count);
144 			printf("logon count: %d\n", u2->usri2_num_logons);
145 			printf("logon server: %s\n", u2->usri2_logon_server);
146 			printf("country code: %d\n", u2->usri2_country_code);
147 			printf("code page: %d\n", u2->usri2_code_page);
148 			break;
149 		case 3:
150 			u3 = (struct USER_INFO_3 *)buffer;
151 			printf("name: %s\n", u3->usri3_name);
152 			printf("password_age: %d\n", u3->usri3_password_age);
153 			printf("priv: %d\n", u3->usri3_priv);
154 			printf("homedir: %s\n", u3->usri3_home_dir);
155 			printf("comment: %s\n", u3->usri3_comment);
156 			printf("flags: 0x%08x\n", u3->usri3_flags);
157 			printf("script: %s\n", u3->usri3_script_path);
158 			printf("auth flags: 0x%08x\n", u3->usri3_auth_flags);
159 			printf("full name: %s\n", u3->usri3_full_name);
160 			printf("user comment: %s\n", u3->usri3_usr_comment);
161 			printf("user parameters: %s\n", u3->usri3_parms);
162 			printf("workstations: %s\n", u3->usri3_workstations);
163 			printf("last logon (seconds since jan. 1, 1970 GMT): %d\n",
164 				u3->usri3_last_logon);
165 			printf("last logoff (seconds since jan. 1, 1970 GMT): %d\n",
166 				u3->usri3_last_logoff);
167 			printf("account expires (seconds since jan. 1, 1970 GMT): %d\n",
168 				u3->usri3_acct_expires);
169 			printf("max storage: %d\n", u3->usri3_max_storage);
170 			printf("units per week: %d\n", u3->usri3_units_per_week);
171 			printf("logon hours:");
172 			for (i=0; i<21; i++) {
173 				printf(" %x", (uint8_t)u3->usri3_logon_hours[i]);
174 			}
175 			printf("\n");
176 			printf("bad password count: %d\n", u3->usri3_bad_pw_count);
177 			printf("logon count: %d\n", u3->usri3_num_logons);
178 			printf("logon server: %s\n", u3->usri3_logon_server);
179 			printf("country code: %d\n", u3->usri3_country_code);
180 			printf("code page: %d\n", u3->usri3_code_page);
181 			printf("user id: %d\n", u3->usri3_user_id);
182 			printf("primary group id: %d\n", u3->usri3_primary_group_id);
183 			printf("profile: %s\n", u3->usri3_profile);
184 			printf("home dir drive: %s\n", u3->usri3_home_dir_drive);
185 			printf("password expired: %d\n", u3->usri3_password_expired);
186 			break;
187 		case 4:
188 			u4 = (struct USER_INFO_4 *)buffer;
189 			printf("name: %s\n", u4->usri4_name);
190 			printf("password: %s\n", u4->usri4_password);
191 			printf("password_age: %d\n", u4->usri4_password_age);
192 			printf("priv: %d\n", u4->usri4_priv);
193 			printf("homedir: %s\n", u4->usri4_home_dir);
194 			printf("comment: %s\n", u4->usri4_comment);
195 			printf("flags: 0x%08x\n", u4->usri4_flags);
196 			printf("script: %s\n", u4->usri4_script_path);
197 			printf("auth flags: 0x%08x\n", u4->usri4_auth_flags);
198 			printf("full name: %s\n", u4->usri4_full_name);
199 			printf("user comment: %s\n", u4->usri4_usr_comment);
200 			printf("user parameters: %s\n", u4->usri4_parms);
201 			printf("workstations: %s\n", u4->usri4_workstations);
202 			printf("last logon (seconds since jan. 1, 1970 GMT): %d\n",
203 				u4->usri4_last_logon);
204 			printf("last logoff (seconds since jan. 1, 1970 GMT): %d\n",
205 				u4->usri4_last_logoff);
206 			printf("account expires (seconds since jan. 1, 1970 GMT): %d\n",
207 				u4->usri4_acct_expires);
208 			printf("max storage: %d\n", u4->usri4_max_storage);
209 			printf("units per week: %d\n", u4->usri4_units_per_week);
210 			printf("logon hours:");
211 			for (i=0; i<21; i++) {
212 				printf(" %x", (uint8_t)u4->usri4_logon_hours[i]);
213 			}
214 			printf("\n");
215 			printf("bad password count: %d\n", u4->usri4_bad_pw_count);
216 			printf("logon count: %d\n", u4->usri4_num_logons);
217 			printf("logon server: %s\n", u4->usri4_logon_server);
218 			printf("country code: %d\n", u4->usri4_country_code);
219 			printf("code page: %d\n", u4->usri4_code_page);
220 			if (ConvertSidToStringSid(u4->usri4_user_sid,
221 						  &sid_str)) {
222 				printf("user_sid: %s\n", sid_str);
223 				free(sid_str);
224 			}
225 			printf("primary group id: %d\n", u4->usri4_primary_group_id);
226 			printf("profile: %s\n", u4->usri4_profile);
227 			printf("home dir drive: %s\n", u4->usri4_home_dir_drive);
228 			printf("password expired: %d\n", u4->usri4_password_expired);
229 			break;
230 		case 10:
231 			u10 = (struct USER_INFO_10 *)buffer;
232 			printf("name: %s\n", u10->usri10_name);
233 			printf("comment: %s\n", u10->usri10_comment);
234 			printf("usr_comment: %s\n", u10->usri10_usr_comment);
235 			printf("full_name: %s\n", u10->usri10_full_name);
236 			break;
237 		case 11:
238 			u11 = (struct USER_INFO_11 *)buffer;
239 			printf("name: %s\n", u11->usri11_name);
240 			printf("comment: %s\n", u11->usri11_comment);
241 			printf("user comment: %s\n", u11->usri11_usr_comment);
242 			printf("full name: %s\n", u11->usri11_full_name);
243 			printf("priv: %d\n", u11->usri11_priv);
244 			printf("auth flags: 0x%08x\n", u11->usri11_auth_flags);
245 			printf("password_age: %d\n", u11->usri11_password_age);
246 			printf("homedir: %s\n", u11->usri11_home_dir);
247 			printf("user parameters: %s\n", u11->usri11_parms);
248 			printf("last logon (seconds since jan. 1, 1970 GMT): %d\n",
249 				u11->usri11_last_logon);
250 			printf("last logoff (seconds since jan. 1, 1970 GMT): %d\n",
251 				u11->usri11_last_logoff);
252 			printf("bad password count: %d\n", u11->usri11_bad_pw_count);
253 			printf("logon count: %d\n", u11->usri11_num_logons);
254 			printf("logon server: %s\n", u11->usri11_logon_server);
255 			printf("country code: %d\n", u11->usri11_country_code);
256 			printf("workstations: %s\n", u11->usri11_workstations);
257 			printf("max storage: %d\n", u11->usri11_max_storage);
258 			printf("units per week: %d\n", u11->usri11_units_per_week);
259 			printf("logon hours:");
260 			for (i=0; i<21; i++) {
261 				printf(" %x", (uint8_t)u11->usri11_logon_hours[i]);
262 			}
263 			printf("\n");
264 			printf("code page: %d\n", u11->usri11_code_page);
265 			break;
266 		case 20:
267 			u20 = (struct USER_INFO_20 *)buffer;
268 			printf("name: %s\n", u20->usri20_name);
269 			printf("comment: %s\n", u20->usri20_comment);
270 			printf("flags: 0x%08x\n", u20->usri20_flags);
271 			printf("rid: %d\n", u20->usri20_user_id);
272 			break;
273 		case 23:
274 			u23 = (struct USER_INFO_23 *)buffer;
275 			printf("name: %s\n", u23->usri23_name);
276 			printf("comment: %s\n", u23->usri23_comment);
277 			printf("flags: 0x%08x\n", u23->usri23_flags);
278 			if (ConvertSidToStringSid(u23->usri23_user_sid,
279 						  &sid_str)) {
280 				printf("user_sid: %s\n", sid_str);
281 				free(sid_str);
282 			}
283 			break;
284 		default:
285 			break;
286 	}
287 
288  out:
289 	libnetapi_free(ctx);
290 	poptFreeContext(pc);
291 
292 	return status;
293 }
294