[NET] Implement the group command
[reactos.git] / base / applications / network / net / cmdAccounts.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS net command
4 * FILE: base/applications/network/net/cmdAccounts.c
5 * PURPOSE:
6 *
7 * PROGRAMMERS: Eric Kohl
8 */
9
10 #include "net.h"
11
12 INT
13 cmdAccounts(
14 INT argc,
15 WCHAR **argv)
16 {
17 PUSER_MODALS_INFO_0 Info0 = NULL;
18 PUSER_MODALS_INFO_1 Info1 = NULL;
19 PUSER_MODALS_INFO_3 Info3 = NULL;
20 NT_PRODUCT_TYPE ProductType;
21 LPWSTR p;
22 LPWSTR endptr;
23 DWORD ParamErr;
24 ULONG value;
25 INT i;
26 BOOL Modified = FALSE;
27 #if 0
28 BOOL Domain = FALSE;
29 #endif
30 INT nPaddedLength = 58;
31 NET_API_STATUS Status;
32 INT result = 0;
33
34 for (i = 2; i < argc; i++)
35 {
36 if (_wcsicmp(argv[i], L"help") == 0)
37 {
38 /* Print short syntax help */
39 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
40 ConResPuts(StdOut, IDS_ACCOUNTS_SYNTAX);
41 return 0;
42 }
43
44 if (_wcsicmp(argv[i], L"/help") == 0)
45 {
46 /* Print full help text*/
47 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
48 ConResPuts(StdOut, IDS_ACCOUNTS_SYNTAX);
49 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_1);
50 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_2);
51 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_3);
52 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_4);
53 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_5);
54 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_6);
55 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_7);
56 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_8);
57 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_9);
58 ConResPuts(StdOut, IDS_ACCOUNTS_HELP_10);
59 ConResPuts(StdOut, IDS_GENERIC_PAGE);
60 return 0;
61 }
62
63 if (_wcsicmp(argv[i], L"/domain") == 0)
64 {
65 ConResPrintf(StdErr, IDS_ERROR_OPTION_NOT_SUPPORTED, L"/DOMAIN");
66 #if 0
67 Domain = TRUE;
68 #endif
69 }
70 }
71
72 Status = NetUserModalsGet(NULL, 0, (LPBYTE*)&Info0);
73 if (Status != NERR_Success)
74 goto done;
75
76 for (i = 2; i < argc; i++)
77 {
78 if (_wcsnicmp(argv[i], L"/forcelogoff:", 13) == 0)
79 {
80 p = &argv[i][13];
81 if (wcsicmp(p, L"no"))
82 {
83 Info0->usrmod0_force_logoff = TIMEQ_FOREVER;
84 Modified = TRUE;
85 }
86 else
87 {
88 value = wcstoul(p, &endptr, 10);
89 if (*endptr != 0)
90 {
91 ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/FORCELOGOFF");
92 result = 1;
93 goto done;
94 }
95
96 Info0->usrmod0_force_logoff = value * 60;
97 Modified = TRUE;
98 }
99 }
100 else if (_wcsnicmp(argv[i], L"/minpwlen:", 10) == 0)
101 {
102 p = &argv[i][10];
103 value = wcstoul(p, &endptr, 10);
104 if (*endptr != 0)
105 {
106 ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/MINPWLEN");
107 result = 1;
108 goto done;
109 }
110
111 Info0->usrmod0_min_passwd_len = value;
112 Modified = TRUE;
113 }
114 else if (_wcsnicmp(argv[i], L"/maxpwage:", 10) == 0)
115 {
116 p = &argv[i][10];
117
118 if (wcsicmp(p, L"unlimited"))
119 {
120 Info0->usrmod0_max_passwd_age = ULONG_MAX;
121 Modified = TRUE;
122 }
123 else
124 {
125 value = wcstoul(p, &endptr, 10);
126 if (*endptr != 0)
127 {
128 ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/MAXPWLEN");
129 result = 1;
130 goto done;
131 }
132
133 Info0->usrmod0_max_passwd_age = value * 86400;
134 Modified = TRUE;
135 }
136 }
137 else if (_wcsnicmp(argv[i], L"/minpwage:", 10) == 0)
138 {
139 p = &argv[i][10];
140 value = wcstoul(p, &endptr, 10);
141 if (*endptr != 0)
142 {
143 ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/MINPWAGE");
144 result = 1;
145 goto done;
146 }
147
148 Info0->usrmod0_min_passwd_age = value * 86400;
149 Modified = TRUE;
150 }
151 else if (_wcsnicmp(argv[i], L"/uniquepw:", 10) == 0)
152 {
153 p = &argv[i][10];
154 value = wcstoul(p, &endptr, 10);
155 if (*endptr != 0)
156 {
157 ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/UNIQUEPW");
158 result = 1;
159 goto done;
160 }
161
162 Info0->usrmod0_password_hist_len = value;
163 Modified = TRUE;
164 }
165 }
166
167 if (Modified == TRUE)
168 {
169 Status = NetUserModalsSet(NULL, 0, (LPBYTE)Info0, &ParamErr);
170 if (Status != NERR_Success)
171 goto done;
172 }
173 else
174 {
175 Status = NetUserModalsGet(NULL, 1, (LPBYTE*)&Info1);
176 if (Status != NERR_Success)
177 goto done;
178
179 Status = NetUserModalsGet(NULL, 3, (LPBYTE*)&Info3);
180 if (Status != NERR_Success)
181 goto done;
182
183 RtlGetNtProductType(&ProductType);
184
185 PrintPaddedResourceString(IDS_ACCOUNTS_FORCE_LOGOFF, nPaddedLength);
186 if (Info0->usrmod0_force_logoff == TIMEQ_FOREVER)
187 ConResPuts(StdOut, IDS_GENERIC_NEVER);
188 else
189 ConResPrintf(StdOut, IDS_ACCOUNTS_LOGOFF_SECONDS, Info0->usrmod0_force_logoff);
190 ConPuts(StdOut, L"\n");
191
192 PrintPaddedResourceString(IDS_ACCOUNTS_MIN_PW_AGE, nPaddedLength);
193 ConPrintf(StdOut, L"%lu\n", Info0->usrmod0_min_passwd_age / 86400);
194
195 PrintPaddedResourceString(IDS_ACCOUNTS_MAX_PW_AGE, nPaddedLength);
196 ConPrintf(StdOut, L"%lu\n", Info0->usrmod0_max_passwd_age / 86400);
197
198 PrintPaddedResourceString(IDS_ACCOUNTS_MIN_PW_LENGTH, nPaddedLength);
199 ConPrintf(StdOut, L"%lu\n", Info0->usrmod0_min_passwd_len);
200
201 PrintPaddedResourceString(IDS_ACCOUNTS_PW_HIST_LENGTH, nPaddedLength);
202 if (Info0->usrmod0_password_hist_len == 0)
203 ConResPuts(StdOut, IDS_GENERIC_NONE);
204 else
205 ConPrintf(StdOut, L"%lu", Info0->usrmod0_password_hist_len);
206 ConPuts(StdOut, L"\n");
207
208 PrintPaddedResourceString(IDS_ACCOUNTS_LOCKOUT_THRESHOLD, nPaddedLength);
209 if (Info3->usrmod3_lockout_threshold == 0)
210 ConResPuts(StdOut, IDS_GENERIC_NEVER);
211 else
212 ConPrintf(StdOut, L"%lu", Info3->usrmod3_lockout_threshold);
213 ConPuts(StdOut, L"\n");
214
215 PrintPaddedResourceString(IDS_ACCOUNTS_LOCKOUT_DURATION, nPaddedLength);
216 ConPrintf(StdOut, L"%lu\n", Info3->usrmod3_lockout_duration / 60);
217
218 PrintPaddedResourceString(IDS_ACCOUNTS_LOCKOUT_WINDOW, nPaddedLength);
219 ConPrintf(StdOut, L"%lu\n", Info3->usrmod3_lockout_observation_window / 60);
220
221 PrintPaddedResourceString(IDS_ACCOUNTS_COMPUTER_ROLE, nPaddedLength);
222 if (Info1->usrmod1_role == UAS_ROLE_PRIMARY)
223 {
224 if (ProductType == NtProductLanManNt)
225 {
226 ConResPuts(StdOut, IDS_ACCOUNTS_PRIMARY_SERVER);
227 }
228 else if (ProductType == NtProductServer)
229 {
230 ConResPuts(StdOut, IDS_ACCOUNTS_STANDALONE_SERVER);
231 }
232 else
233 {
234 ConResPuts(StdOut, IDS_ACCOUNTS_WORKSTATION);
235 }
236 }
237 else
238 {
239 ConResPuts(StdOut, IDS_ACCOUNTS_BACKUP_SERVER);
240 }
241 ConPuts(StdOut, L"\n");
242 }
243
244 done:
245 if (Info3 != NULL)
246 NetApiBufferFree(Info3);
247
248 if (Info1 != NULL)
249 NetApiBufferFree(Info1);
250
251 if (Info0 != NULL)
252 NetApiBufferFree(Info0);
253
254 return result;
255 }
256
257 /* EOF */