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