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             PrintMessageString(4381);
40             ConPuts(StdOut, L"\n");
41             PrintNetMessage(MSG_ACCOUNTS_SYNTAX);
42             return 0;
43         }
44 
45         if (_wcsicmp(argv[i], L"/help") == 0)
46         {
47             /* Print full help text*/
48             PrintMessageString(4381);
49             ConPuts(StdOut, L"\n");
50             PrintNetMessage(MSG_ACCOUNTS_SYNTAX);
51             PrintNetMessage(MSG_ACCOUNTS_HELP);
52             return 0;
53         }
54 
55         if (_wcsicmp(argv[i], L"/domain") == 0)
56         {
57             ConPuts(StdErr, L"The /DOMAIN option is not supported yet.\n");
58 #if 0
59             Domain = TRUE;
60 #endif
61         }
62     }
63 
64     Status = NetUserModalsGet(NULL, 0, (LPBYTE*)&Info0);
65     if (Status != NERR_Success)
66         goto done;
67 
68     for (i = 2; i < argc; i++)
69     {
70         if (_wcsnicmp(argv[i], L"/forcelogoff:", 13) == 0)
71         {
72             p = &argv[i][13];
73             if (wcsicmp(p, L"no") == 0)
74             {
75                 Info0->usrmod0_force_logoff = TIMEQ_FOREVER;
76                 Modified = TRUE;
77             }
78             else
79             {
80                 value = wcstoul(p, &endptr, 10);
81                 if (*endptr != 0)
82                 {
83                     PrintMessageStringV(3952, L"/FORCELOGOFF");
84                     result = 1;
85                     goto done;
86                 }
87 
88                 Info0->usrmod0_force_logoff = value * 60;
89                 Modified = TRUE;
90             }
91         }
92         else if (_wcsnicmp(argv[i], L"/minpwlen:", 10) == 0)
93         {
94             p = &argv[i][10];
95             value = wcstoul(p, &endptr, 10);
96             if (*endptr != 0)
97             {
98                 PrintMessageStringV(3952, L"/MINPWLEN");
99                 result = 1;
100                 goto done;
101             }
102 
103             Info0->usrmod0_min_passwd_len = value;
104             Modified = TRUE;
105         }
106         else if (_wcsnicmp(argv[i], L"/maxpwage:", 10) == 0)
107         {
108             p = &argv[i][10];
109 
110             if (wcsicmp(p, L"unlimited"))
111             {
112                 Info0->usrmod0_max_passwd_age = ULONG_MAX;
113                 Modified = TRUE;
114             }
115             else
116             {
117                 value = wcstoul(p, &endptr, 10);
118                 if (*endptr != 0)
119                 {
120                     PrintMessageStringV(3952, L"/MAXPWLEN");
121                     result = 1;
122                     goto done;
123                 }
124 
125                 Info0->usrmod0_max_passwd_age = value * 86400;
126                 Modified = TRUE;
127             }
128         }
129         else if (_wcsnicmp(argv[i], L"/minpwage:", 10) == 0)
130         {
131             p = &argv[i][10];
132             value = wcstoul(p, &endptr, 10);
133             if (*endptr != 0)
134             {
135                 PrintMessageStringV(3952, L"/MINPWAGE");
136                 result = 1;
137                 goto done;
138             }
139 
140             Info0->usrmod0_min_passwd_age = value * 86400;
141             Modified = TRUE;
142         }
143         else if (_wcsnicmp(argv[i], L"/uniquepw:", 10) == 0)
144         {
145             p = &argv[i][10];
146             value = wcstoul(p, &endptr, 10);
147             if (*endptr != 0)
148             {
149                 PrintMessageStringV(3952, L"/UNIQUEPW");
150                 result = 1;
151                 goto done;
152             }
153 
154             Info0->usrmod0_password_hist_len = value;
155             Modified = TRUE;
156         }
157     }
158 
159     if (Modified == TRUE)
160     {
161         Status = NetUserModalsSet(NULL, 0, (LPBYTE)Info0, &ParamErr);
162         if (Status != NERR_Success)
163             goto done;
164     }
165     else
166     {
167         Status = NetUserModalsGet(NULL, 1, (LPBYTE*)&Info1);
168         if (Status != NERR_Success)
169             goto done;
170 
171         Status = NetUserModalsGet(NULL, 3, (LPBYTE*)&Info3);
172         if (Status != NERR_Success)
173             goto done;
174 
175         RtlGetNtProductType(&ProductType);
176 
177         PrintPaddedMessageString(4570, nPaddedLength);
178         if (Info0->usrmod0_force_logoff == TIMEQ_FOREVER)
179             PrintMessageString(4305);
180         else
181             ConPrintf(StdOut, L"%lu", Info0->usrmod0_force_logoff);
182         ConPuts(StdOut, L"\n");
183 
184         PrintPaddedMessageString(4572, nPaddedLength);
185         ConPrintf(StdOut, L"%lu\n", Info0->usrmod0_min_passwd_age / 86400);
186 
187         PrintPaddedMessageString(4573, nPaddedLength);
188         ConPrintf(StdOut, L"%lu\n", Info0->usrmod0_max_passwd_age / 86400);
189 
190         PrintPaddedMessageString(4574, nPaddedLength);
191         ConPrintf(StdOut, L"%lu\n", Info0->usrmod0_min_passwd_len);
192 
193         PrintPaddedMessageString(4575, nPaddedLength);
194         if (Info0->usrmod0_password_hist_len == 0)
195             PrintMessageString(4303);
196         else
197             ConPrintf(StdOut, L"%lu", Info0->usrmod0_password_hist_len);
198         ConPuts(StdOut, L"\n");
199 
200         PrintPaddedMessageString(4578, nPaddedLength);
201         if (Info3->usrmod3_lockout_threshold == 0)
202             PrintMessageString(4305);
203         else
204             ConPrintf(StdOut, L"%lu", Info3->usrmod3_lockout_threshold);
205         ConPuts(StdOut, L"\n");
206 
207         PrintPaddedMessageString(4579, nPaddedLength);
208         ConPrintf(StdOut, L"%lu\n", Info3->usrmod3_lockout_duration / 60);
209 
210         PrintPaddedMessageString(4580, nPaddedLength);
211         ConPrintf(StdOut, L"%lu\n", Info3->usrmod3_lockout_observation_window / 60);
212 
213         PrintPaddedMessageString(4576, nPaddedLength);
214         if (Info1->usrmod1_role == UAS_ROLE_PRIMARY)
215         {
216             if (ProductType == NtProductLanManNt)
217             {
218                 PrintMessageString(5070);
219             }
220             else if (ProductType == NtProductServer)
221             {
222                 PrintMessageString(5073);
223             }
224             else
225             {
226                 PrintMessageString(5072);
227             }
228         }
229         else
230         {
231             PrintMessageString(5071);
232         }
233         ConPuts(StdOut, L"\n");
234     }
235 
236 done:
237     if (Info3 != NULL)
238         NetApiBufferFree(Info3);
239 
240     if (Info1 != NULL)
241         NetApiBufferFree(Info1);
242 
243     if (Info0 != NULL)
244         NetApiBufferFree(Info0);
245 
246     return result;
247 }
248 
249 /* EOF */
250