winapi_ui_automation/um/
lmaccess.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms
6// This file contains structures, function prototypes, and definitions
7// for the NetUser, NetUserModals, NetGroup, NetAccess, and NetLogon API.
8use shared::basetsd::PDWORD_PTR;
9use shared::lmcons::{ENCRYPTED_PWLEN, NET_API_STATUS, PARMNUM_BASE_INFOLEVEL, PWLEN};
10use shared::minwindef::{BOOL, BYTE, DWORD, FILETIME, LPBYTE, LPDWORD, LPVOID, PBYTE, ULONG};
11use um::winnt::{BOOLEAN, LONG, LPCWSTR, LPWSTR, PSID, PVOID, PZPWSTR, SID_NAME_USE};
12extern "system" {
13    pub fn NetUserAdd(
14        servername: LPCWSTR,
15        level: DWORD,
16        buf: LPBYTE,
17        parm_err: LPDWORD,
18    ) -> NET_API_STATUS;
19    pub fn NetUserEnum(
20        servername: LPCWSTR,
21        level: DWORD,
22        filter: DWORD,
23        bufptr: *mut LPBYTE,
24        prefmaxlen: DWORD,
25        entriesread: LPDWORD,
26        totalentries: LPDWORD,
27        resumehandle: LPDWORD,
28    ) -> NET_API_STATUS;
29    pub fn NetUserGetInfo(
30        servername: LPCWSTR,
31        username: LPCWSTR,
32        level: DWORD,
33        bufptr: *mut LPBYTE,
34    ) -> NET_API_STATUS;
35    pub fn NetUserSetInfo(
36        servername: LPCWSTR,
37        username: LPCWSTR,
38        level: DWORD,
39        buf: LPBYTE,
40        parm_err: LPDWORD,
41    ) -> NET_API_STATUS;
42    pub fn NetUserDel(
43        servername: LPCWSTR,
44        username: LPCWSTR,
45    ) -> NET_API_STATUS;
46    pub fn NetUserGetGroups(
47        servername: LPCWSTR,
48        username: LPCWSTR,
49        level: DWORD,
50        bufptr: *mut LPBYTE,
51        prefmaxlen: DWORD,
52        entriesread: LPDWORD,
53        totalentries: LPDWORD,
54    ) -> NET_API_STATUS;
55    pub fn NetUserSetGroups(
56        servername: LPCWSTR,
57        username: LPCWSTR,
58        level: DWORD,
59        buf: LPBYTE,
60        num_entries: DWORD,
61    ) -> NET_API_STATUS;
62    pub fn NetUserGetLocalGroups(
63        servername: LPCWSTR,
64        username: LPCWSTR,
65        level: DWORD,
66        flags: DWORD,
67        bufptr: *mut LPBYTE,
68        prefmaxlen: DWORD,
69        entriesread: LPDWORD,
70        totalentries: LPDWORD,
71    ) -> NET_API_STATUS;
72    pub fn NetUserModalsGet(
73        servername: LPCWSTR,
74        level: DWORD,
75        bufptr: *mut LPBYTE,
76    ) -> NET_API_STATUS;
77    pub fn NetUserModalsSet(
78        servername: LPCWSTR,
79        level: DWORD,
80        buf: LPBYTE,
81        parm_err: LPDWORD,
82    ) -> NET_API_STATUS;
83    pub fn NetUserChangePassword(
84        domainname: LPCWSTR,
85        username: LPCWSTR,
86        oldpassword: LPCWSTR,
87        newpassword: LPCWSTR,
88    ) -> NET_API_STATUS;
89}
90STRUCT!{struct USER_INFO_0 {
91    usri0_name: LPWSTR,
92}}
93pub type PUSER_INFO_0 = *mut USER_INFO_0;
94pub type LPUSER_INFO_0 = *mut USER_INFO_0;
95STRUCT!{struct USER_INFO_1 {
96    usri1_name: LPWSTR,
97    usri1_password: LPWSTR,
98    usri1_password_age: DWORD,
99    usri1_priv: DWORD,
100    usri1_home_dir: LPWSTR,
101    usri1_comment: LPWSTR,
102    usri1_flags: DWORD,
103    usri1_script_path: LPWSTR,
104}}
105pub type PUSER_INFO_1 = *mut USER_INFO_1;
106pub type LPUSER_INFO_1 = *mut USER_INFO_1;
107STRUCT!{struct USER_INFO_2 {
108    usri2_name: LPWSTR,
109    usri2_password: LPWSTR,
110    usri2_password_age: DWORD,
111    usri2_priv: DWORD,
112    usri2_home_dir: LPWSTR,
113    usri2_comment: LPWSTR,
114    usri2_flags: DWORD,
115    usri2_script_path: LPWSTR,
116    usri2_auth_flags: DWORD,
117    usri2_full_name: LPWSTR,
118    usri2_usr_comment: LPWSTR,
119    usri2_parms: LPWSTR,
120    usri2_workstations: LPWSTR,
121    usri2_last_logon: DWORD,
122    usri2_last_logoff: DWORD,
123    usri2_acct_expires: DWORD,
124    usri2_max_storage: DWORD,
125    usri2_units_per_week: DWORD,
126    usri2_logon_hours: PBYTE,
127    usri2_bad_pw_count: DWORD,
128    usri2_num_logons: DWORD,
129    usri2_logon_server: LPWSTR,
130    usri2_country_code: DWORD,
131    usri2_code_page: DWORD,
132}}
133pub type PUSER_INFO_2 = *mut USER_INFO_2;
134pub type LPUSER_INFO_2 = *mut USER_INFO_2;
135STRUCT!{struct USER_INFO_3 {
136    usri3_name: LPWSTR,
137    usri3_password: LPWSTR,
138    usri3_password_age: DWORD,
139    usri3_priv: DWORD,
140    usri3_home_dir: LPWSTR,
141    usri3_comment: LPWSTR,
142    usri3_flags: DWORD,
143    usri3_script_path: LPWSTR,
144    usri3_auth_flags: DWORD,
145    usri3_full_name: LPWSTR,
146    usri3_usr_comment: LPWSTR,
147    usri3_parms: LPWSTR,
148    usri3_workstations: LPWSTR,
149    usri3_last_logon: DWORD,
150    usri3_last_logoff: DWORD,
151    usri3_acct_expires: DWORD,
152    usri3_max_storage: DWORD,
153    usri3_units_per_week: DWORD,
154    usri3_logon_hours: PBYTE,
155    usri3_bad_pw_count: DWORD,
156    usri3_num_logons: DWORD,
157    usri3_logon_server: LPWSTR,
158    usri3_country_code: DWORD,
159    usri3_code_page: DWORD,
160    usri3_user_id: DWORD,
161    usri3_primary_group_id: DWORD,
162    usri3_profile: LPWSTR,
163    usri3_home_dir_drive: LPWSTR,
164    usri3_password_expired: DWORD,
165}}
166pub type PUSER_INFO_3 = *mut USER_INFO_3;
167pub type LPUSER_INFO_3 = *mut USER_INFO_3;
168STRUCT!{struct USER_INFO_4 {
169    usri4_name: LPWSTR,
170    usri4_password: LPWSTR,
171    usri4_password_age: DWORD,
172    usri4_priv: DWORD,
173    usri4_home_dir: LPWSTR,
174    usri4_comment: LPWSTR,
175    usri4_flags: DWORD,
176    usri4_script_path: LPWSTR,
177    usri4_auth_flags: DWORD,
178    usri4_full_name: LPWSTR,
179    usri4_usr_comment: LPWSTR,
180    usri4_parms: LPWSTR,
181    usri4_workstations: LPWSTR,
182    usri4_last_logon: DWORD,
183    usri4_last_logoff: DWORD,
184    usri4_acct_expires: DWORD,
185    usri4_max_storage: DWORD,
186    usri4_units_per_week: DWORD,
187    usri4_logon_hours: PBYTE,
188    usri4_bad_pw_count: DWORD,
189    usri4_num_logons: DWORD,
190    usri4_logon_server: LPWSTR,
191    usri4_country_code: DWORD,
192    usri4_code_page: DWORD,
193    usri4_user_sid: PSID,
194    usri4_primary_group_id: DWORD,
195    usri4_profile: LPWSTR,
196    usri4_home_dir_drive: LPWSTR,
197    usri4_password_expired: DWORD,
198}}
199pub type PUSER_INFO_4 = *mut USER_INFO_4;
200pub type LPUSER_INFO_4 = *mut USER_INFO_4;
201STRUCT!{struct USER_INFO_10 {
202    usri10_name: LPWSTR,
203    usri10_comment: LPWSTR,
204    usri10_usr_comment: LPWSTR,
205    usri10_full_name: LPWSTR,
206}}
207pub type PUSER_INFO_10 = *mut USER_INFO_10;
208pub type LPUSER_INFO_10 = *mut USER_INFO_10;
209STRUCT!{struct USER_INFO_11 {
210    usri11_name: LPWSTR,
211    usri11_comment: LPWSTR,
212    usri11_usr_comment: LPWSTR,
213    usri11_full_name: LPWSTR,
214    usri11_priv: DWORD,
215    usri11_auth_flags: DWORD,
216    usri11_password_age: DWORD,
217    usri11_home_dir: LPWSTR,
218    usri11_parms: LPWSTR,
219    usri11_last_logon: DWORD,
220    usri11_last_logoff: DWORD,
221    usri11_bad_pw_count: DWORD,
222    usri11_num_logons: DWORD,
223    usri11_logon_server: LPWSTR,
224    usri11_country_code: DWORD,
225    usri11_workstations: LPWSTR,
226    usri11_max_storage: DWORD,
227    usri11_units_per_week: DWORD,
228    usri11_logon_hours: PBYTE,
229    usri11_code_page: DWORD,
230}}
231pub type PUSER_INFO_11 = *mut USER_INFO_11;
232pub type LPUSER_INFO_11 = *mut USER_INFO_11;
233STRUCT!{struct USER_INFO_20 {
234    usri20_name: LPWSTR,
235    usri20_full_name: LPWSTR,
236    usri20_comment: LPWSTR,
237    usri20_flags: DWORD,
238    usri20_user_id: DWORD,
239}}
240pub type PUSER_INFO_20 = *mut USER_INFO_20;
241pub type LPUSER_INFO_20 = *mut USER_INFO_20;
242STRUCT!{struct USER_INFO_21 {
243    usri21_password: [BYTE; ENCRYPTED_PWLEN],
244}}
245pub type PUSER_INFO_21 = *mut USER_INFO_21;
246pub type LPUSER_INFO_21 = *mut USER_INFO_21;
247STRUCT!{struct USER_INFO_22 {
248    usri22_name: LPWSTR,
249    usri22_password: [BYTE; ENCRYPTED_PWLEN],
250    usri22_password_age: DWORD,
251    usri22_priv: DWORD,
252    usri22_home_dir: LPWSTR,
253    usri22_comment: LPWSTR,
254    usri22_flags: DWORD,
255    usri22_script_path: LPWSTR,
256    usri22_auth_flags: DWORD,
257    usri22_full_name: LPWSTR,
258    usri22_usr_comment: LPWSTR,
259    usri22_parms: LPWSTR,
260    usri22_workstations: LPWSTR,
261    usri22_last_logon: DWORD,
262    usri22_last_logoff: DWORD,
263    usri22_acct_expires: DWORD,
264    usri22_max_storage: DWORD,
265    usri22_units_per_week: DWORD,
266    usri22_logon_hours: PBYTE,
267    usri22_bad_pw_count: DWORD,
268    usri22_num_logons: DWORD,
269    usri22_logon_server: LPWSTR,
270    usri22_country_code: DWORD,
271    usri22_code_page: DWORD,
272}}
273pub type PUSER_INFO_22 = *mut USER_INFO_22;
274pub type LPUSER_INFO_22 = *mut USER_INFO_22;
275STRUCT!{struct USER_INFO_23 {
276    usri23_name: LPWSTR,
277    usri23_full_name: LPWSTR,
278    usri23_comment: LPWSTR,
279    usri23_flags: DWORD,
280    usri23_user_sid: PSID,
281}}
282pub type PUSER_INFO_23 = *mut USER_INFO_23;
283pub type LPUSER_INFO_23 = *mut USER_INFO_23;
284STRUCT!{struct USER_INFO_24 {
285    usri24_internet_identity: BOOL,
286    usri24_flags: DWORD,
287    usri24_internet_provider_name: LPWSTR,
288    usri24_internet_principal_name: LPWSTR,
289    usri24_user_sid: PSID,
290}}
291pub type PUSER_INFO_24 = *mut USER_INFO_24;
292pub type LPUSER_INFO_24 = *mut USER_INFO_24;
293STRUCT!{struct USER_INFO_1003 {
294    usri1003_password: LPWSTR,
295}}
296pub type PUSER_INFO_1003 = *mut USER_INFO_1003;
297pub type LPUSER_INFO_1003 = *mut USER_INFO_1003;
298STRUCT!{struct USER_INFO_1005 {
299    usri1005_priv: DWORD,
300}}
301pub type PUSER_INFO_1005 = *mut USER_INFO_1005;
302pub type LPUSER_INFO_1005 = *mut USER_INFO_1005;
303STRUCT!{struct USER_INFO_1006 {
304    usri1006_home_dir: LPWSTR,
305}}
306pub type PUSER_INFO_1006 = *mut USER_INFO_1006;
307pub type LPUSER_INFO_1006 = *mut USER_INFO_1006;
308STRUCT!{struct USER_INFO_1007 {
309    usri1007_comment: LPWSTR,
310}}
311pub type PUSER_INFO_1007 = *mut USER_INFO_1007;
312pub type LPUSER_INFO_1007 = *mut USER_INFO_1007;
313STRUCT!{struct USER_INFO_1008 {
314    usri1008_flags: DWORD,
315}}
316pub type PUSER_INFO_1008 = *mut USER_INFO_1008;
317pub type LPUSER_INFO_1008 = *mut USER_INFO_1008;
318STRUCT!{struct USER_INFO_1009 {
319    usri1009_script_path: LPWSTR,
320}}
321pub type PUSER_INFO_1009 = *mut USER_INFO_1009;
322pub type LPUSER_INFO_1009 = *mut USER_INFO_1009;
323STRUCT!{struct USER_INFO_1010 {
324    usri1010_auth_flags: DWORD,
325}}
326pub type PUSER_INFO_1010 = *mut USER_INFO_1010;
327pub type LPUSER_INFO_1010 = *mut USER_INFO_1010;
328STRUCT!{struct USER_INFO_1011 {
329    usri1011_full_name: LPWSTR,
330}}
331pub type PUSER_INFO_1011 = *mut USER_INFO_1011;
332pub type LPUSER_INFO_1011 = *mut USER_INFO_1011;
333STRUCT!{struct USER_INFO_1012 {
334    usri1012_usr_comment: LPWSTR,
335}}
336pub type PUSER_INFO_1012 = *mut USER_INFO_1012;
337pub type LPUSER_INFO_1012 = *mut USER_INFO_1012;
338STRUCT!{struct USER_INFO_1013 {
339    usri1013_parms: LPWSTR,
340}}
341pub type PUSER_INFO_1013 = *mut USER_INFO_1013;
342pub type LPUSER_INFO_1013 = *mut USER_INFO_1013;
343STRUCT!{struct USER_INFO_1014 {
344    usri1014_workstations: LPWSTR,
345}}
346pub type PUSER_INFO_1014 = *mut USER_INFO_1014;
347pub type LPUSER_INFO_1014 = *mut USER_INFO_1014;
348STRUCT!{struct USER_INFO_1017 {
349    usri1017_acct_expires: DWORD,
350}}
351pub type PUSER_INFO_1017 = *mut USER_INFO_1017;
352pub type LPUSER_INFO_1017 = *mut USER_INFO_1017;
353STRUCT!{struct USER_INFO_1018 {
354    usri1018_max_storage: DWORD,
355}}
356pub type PUSER_INFO_1018 = *mut USER_INFO_1018;
357pub type LPUSER_INFO_1018 = *mut USER_INFO_1018;
358STRUCT!{struct USER_INFO_1020 {
359    usri1020_units_per_week: DWORD,
360    usri1020_logon_hours: LPBYTE,
361}}
362pub type PUSER_INFO_1020 = *mut USER_INFO_1020;
363pub type LPUSER_INFO_1020 = *mut USER_INFO_1020;
364STRUCT!{struct USER_INFO_1023 {
365    usri1023_logon_server: LPWSTR,
366}}
367pub type PUSER_INFO_1023 = *mut USER_INFO_1023;
368pub type LPUSER_INFO_1023 = *mut USER_INFO_1023;
369STRUCT!{struct USER_INFO_1024 {
370    usri1024_country_code: DWORD,
371}}
372pub type PUSER_INFO_1024 = *mut USER_INFO_1024;
373pub type LPUSER_INFO_1024 = *mut USER_INFO_1024;
374STRUCT!{struct USER_INFO_1025 {
375    usri1025_code_page: DWORD,
376}}
377pub type PUSER_INFO_1025 = *mut USER_INFO_1025;
378pub type LPUSER_INFO_1025 = *mut USER_INFO_1025;
379STRUCT!{struct USER_INFO_1051 {
380    usri1051_primary_group_id: DWORD,
381}}
382pub type PUSER_INFO_1051 = *mut USER_INFO_1051;
383pub type LPUSER_INFO_1051 = *mut USER_INFO_1051;
384STRUCT!{struct USER_INFO_1052 {
385    usri1052_profile: LPWSTR,
386}}
387pub type PUSER_INFO_1052 = *mut USER_INFO_1052;
388pub type LPUSER_INFO_1052 = *mut USER_INFO_1052;
389STRUCT!{struct USER_INFO_1053 {
390    usri1053_home_dir_drive: LPWSTR,
391}}
392pub type PUSER_INFO_1053 = *mut USER_INFO_1053;
393pub type LPUSER_INFO_1053 = *mut USER_INFO_1053;
394STRUCT!{struct USER_MODALS_INFO_0 {
395    usrmod0_min_passwd_len: DWORD,
396    usrmod0_max_passwd_age: DWORD,
397    usrmod0_min_passwd_age: DWORD,
398    usrmod0_force_logoff: DWORD,
399    usrmod0_password_hist_len: DWORD,
400}}
401pub type PUSER_MODALS_INFO_0 = *mut USER_MODALS_INFO_0;
402pub type LPUSER_MODALS_INFO_0 = *mut USER_MODALS_INFO_0;
403STRUCT!{struct USER_MODALS_INFO_1 {
404    usrmod1_role: DWORD,
405    usrmod1_primary: LPWSTR,
406}}
407pub type PUSER_MODALS_INFO_1 = *mut USER_MODALS_INFO_1;
408pub type LPUSER_MODALS_INFO_1 = *mut USER_MODALS_INFO_1;
409STRUCT!{struct USER_MODALS_INFO_2 {
410    usrmod2_domain_name: LPWSTR,
411    usrmod2_domain_id: PSID,
412}}
413pub type PUSER_MODALS_INFO_2 = *mut USER_MODALS_INFO_2;
414pub type LPUSER_MODALS_INFO_2 = *mut USER_MODALS_INFO_2;
415STRUCT!{struct USER_MODALS_INFO_3 {
416    usrmod3_lockout_duration: DWORD,
417    usrmod3_lockout_observation_window: DWORD,
418    usrmod3_lockout_threshold: DWORD,
419}}
420pub type PUSER_MODALS_INFO_3 = *mut USER_MODALS_INFO_3;
421pub type LPUSER_MODALS_INFO_3 = *mut USER_MODALS_INFO_3;
422STRUCT!{struct USER_MODALS_INFO_1001 {
423    usrmod1001_min_passwd_len: DWORD,
424}}
425pub type PUSER_MODALS_INFO_1001 = *mut USER_MODALS_INFO_1001;
426pub type LPUSER_MODALS_INFO_1001 = *mut USER_MODALS_INFO_1001;
427STRUCT!{struct USER_MODALS_INFO_1002 {
428    usrmod1002_max_passwd_age: DWORD,
429}}
430pub type PUSER_MODALS_INFO_1002 = *mut USER_MODALS_INFO_1002;
431pub type LPUSER_MODALS_INFO_1002 = *mut USER_MODALS_INFO_1002;
432STRUCT!{struct USER_MODALS_INFO_1003 {
433    usrmod1003_min_passwd_age: DWORD,
434}}
435pub type PUSER_MODALS_INFO_1003 = *mut USER_MODALS_INFO_1003;
436pub type LPUSER_MODALS_INFO_1003 = *mut USER_MODALS_INFO_1003;
437STRUCT!{struct USER_MODALS_INFO_1004 {
438    usrmod1004_force_logoff: DWORD,
439}}
440pub type PUSER_MODALS_INFO_1004 = *mut USER_MODALS_INFO_1004;
441pub type LPUSER_MODALS_INFO_1004 = *mut USER_MODALS_INFO_1004;
442STRUCT!{struct USER_MODALS_INFO_1005 {
443    usrmod1005_password_hist_len: DWORD,
444}}
445pub type PUSER_MODALS_INFO_1005 = *mut USER_MODALS_INFO_1005;
446pub type LPUSER_MODALS_INFO_1005 = *mut USER_MODALS_INFO_1005;
447STRUCT!{struct USER_MODALS_INFO_1006 {
448    usrmod1006_role: DWORD,
449}}
450pub type PUSER_MODALS_INFO_1006 = *mut USER_MODALS_INFO_1006;
451pub type LPUSER_MODALS_INFO_1006 = *mut USER_MODALS_INFO_1006;
452STRUCT!{struct USER_MODALS_INFO_1007 {
453    usrmod1007_primary: LPWSTR,
454}}
455pub type PUSER_MODALS_INFO_1007 = *mut USER_MODALS_INFO_1007;
456pub type LPUSER_MODALS_INFO_1007 = *mut USER_MODALS_INFO_1007;
457pub const UF_SCRIPT: DWORD = 0x0001;
458pub const UF_ACCOUNTDISABLE: DWORD = 0x0002;
459pub const UF_HOMEDIR_REQUIRED: DWORD = 0x0008;
460pub const UF_LOCKOUT: DWORD = 0x0010;
461pub const UF_PASSWD_NOTREQD: DWORD = 0x0020;
462pub const UF_PASSWD_CANT_CHANGE: DWORD = 0x0040;
463pub const UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED: DWORD = 0x0080;
464pub const UF_TEMP_DUPLICATE_ACCOUNT: DWORD = 0x0100;
465pub const UF_NORMAL_ACCOUNT: DWORD = 0x0200;
466pub const UF_INTERDOMAIN_TRUST_ACCOUNT: DWORD = 0x0800;
467pub const UF_WORKSTATION_TRUST_ACCOUNT: DWORD = 0x1000;
468pub const UF_SERVER_TRUST_ACCOUNT: DWORD = 0x2000;
469pub const UF_MACHINE_ACCOUNT_MASK: DWORD = UF_INTERDOMAIN_TRUST_ACCOUNT
470    | UF_WORKSTATION_TRUST_ACCOUNT | UF_SERVER_TRUST_ACCOUNT;
471pub const UF_ACCOUNT_TYPE_MASK: DWORD = UF_TEMP_DUPLICATE_ACCOUNT | UF_NORMAL_ACCOUNT
472    | UF_INTERDOMAIN_TRUST_ACCOUNT | UF_WORKSTATION_TRUST_ACCOUNT | UF_SERVER_TRUST_ACCOUNT;
473pub const UF_DONT_EXPIRE_PASSWD: DWORD = 0x10000;
474pub const UF_MNS_LOGON_ACCOUNT: DWORD = 0x20000;
475pub const UF_SMARTCARD_REQUIRED: DWORD = 0x40000;
476pub const UF_TRUSTED_FOR_DELEGATION: DWORD = 0x80000;
477pub const UF_NOT_DELEGATED: DWORD = 0x100000;
478pub const UF_USE_DES_KEY_ONLY: DWORD = 0x200000;
479pub const UF_DONT_REQUIRE_PREAUTH: DWORD = 0x400000;
480pub const UF_PASSWORD_EXPIRED: DWORD = 0x800000;
481pub const UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION: DWORD = 0x1000000;
482pub const UF_NO_AUTH_DATA_REQUIRED: DWORD = 0x2000000;
483pub const UF_PARTIAL_SECRETS_ACCOUNT: DWORD = 0x4000000;
484pub const UF_USE_AES_KEYS: DWORD = 0x8000000;
485pub const UF_SETTABLE_BITS: DWORD = UF_SCRIPT | UF_ACCOUNTDISABLE | UF_LOCKOUT
486    | UF_HOMEDIR_REQUIRED | UF_PASSWD_NOTREQD | UF_PASSWD_CANT_CHANGE | UF_ACCOUNT_TYPE_MASK
487    | UF_DONT_EXPIRE_PASSWD | UF_MNS_LOGON_ACCOUNT | UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED
488    | UF_SMARTCARD_REQUIRED | UF_TRUSTED_FOR_DELEGATION | UF_NOT_DELEGATED | UF_USE_DES_KEY_ONLY
489    | UF_DONT_REQUIRE_PREAUTH | UF_PASSWORD_EXPIRED | UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION
490    | UF_NO_AUTH_DATA_REQUIRED | UF_USE_AES_KEYS | UF_PARTIAL_SECRETS_ACCOUNT;
491pub const FILTER_TEMP_DUPLICATE_ACCOUNT: DWORD = 0x0001;
492pub const FILTER_NORMAL_ACCOUNT: DWORD = 0x0002;
493pub const FILTER_INTERDOMAIN_TRUST_ACCOUNT: DWORD = 0x0008;
494pub const FILTER_WORKSTATION_TRUST_ACCOUNT: DWORD = 0x0010;
495pub const FILTER_SERVER_TRUST_ACCOUNT: DWORD = 0x0020;
496pub const LG_INCLUDE_INDIRECT: DWORD = 0x0001;
497pub const AF_OP_PRINT: DWORD = 0x1;
498pub const AF_OP_COMM: DWORD = 0x2;
499pub const AF_OP_SERVER: DWORD = 0x4;
500pub const AF_OP_ACCOUNTS: DWORD = 0x8;
501pub const AF_SETTABLE_BITS: DWORD = AF_OP_PRINT | AF_OP_COMM | AF_OP_SERVER | AF_OP_ACCOUNTS;
502pub const UAS_ROLE_STANDALONE: DWORD = 0;
503pub const UAS_ROLE_MEMBER: DWORD = 1;
504pub const UAS_ROLE_BACKUP: DWORD = 2;
505pub const UAS_ROLE_PRIMARY: DWORD = 3;
506pub const USER_NAME_PARMNUM: DWORD = 1;
507pub const USER_PASSWORD_PARMNUM: DWORD = 3;
508pub const USER_PASSWORD_AGE_PARMNUM: DWORD = 4;
509pub const USER_PRIV_PARMNUM: DWORD = 5;
510pub const USER_HOME_DIR_PARMNUM: DWORD = 6;
511pub const USER_COMMENT_PARMNUM: DWORD = 7;
512pub const USER_FLAGS_PARMNUM: DWORD = 8;
513pub const USER_SCRIPT_PATH_PARMNUM: DWORD = 9;
514pub const USER_AUTH_FLAGS_PARMNUM: DWORD = 10;
515pub const USER_FULL_NAME_PARMNUM: DWORD = 11;
516pub const USER_USR_COMMENT_PARMNUM: DWORD = 12;
517pub const USER_PARMS_PARMNUM: DWORD = 13;
518pub const USER_WORKSTATIONS_PARMNUM: DWORD = 14;
519pub const USER_LAST_LOGON_PARMNUM: DWORD = 15;
520pub const USER_LAST_LOGOFF_PARMNUM: DWORD = 16;
521pub const USER_ACCT_EXPIRES_PARMNUM: DWORD = 17;
522pub const USER_MAX_STORAGE_PARMNUM: DWORD = 18;
523pub const USER_UNITS_PER_WEEK_PARMNUM: DWORD = 19;
524pub const USER_LOGON_HOURS_PARMNUM: DWORD = 20;
525pub const USER_PAD_PW_COUNT_PARMNUM: DWORD = 21;
526pub const USER_NUM_LOGONS_PARMNUM: DWORD = 22;
527pub const USER_LOGON_SERVER_PARMNUM: DWORD = 23;
528pub const USER_COUNTRY_CODE_PARMNUM: DWORD = 24;
529pub const USER_CODE_PAGE_PARMNUM: DWORD = 25;
530pub const USER_PRIMARY_GROUP_PARMNUM: DWORD = 51;
531pub const USER_PROFILE: DWORD = 52;
532pub const USER_PROFILE_PARMNUM: DWORD = 52;
533pub const USER_HOME_DIR_DRIVE_PARMNUM: DWORD = 53;
534pub const USER_NAME_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_NAME_PARMNUM;
535pub const USER_PASSWORD_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_PASSWORD_PARMNUM;
536pub const USER_PASSWORD_AGE_INFOLEVEL: DWORD =
537    PARMNUM_BASE_INFOLEVEL + USER_PASSWORD_AGE_PARMNUM;
538pub const USER_PRIV_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_PRIV_PARMNUM;
539pub const USER_HOME_DIR_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_HOME_DIR_PARMNUM;
540pub const USER_COMMENT_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_COMMENT_PARMNUM;
541pub const USER_FLAGS_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_FLAGS_PARMNUM;
542pub const USER_SCRIPT_PATH_INFOLEVEL: DWORD =
543    PARMNUM_BASE_INFOLEVEL + USER_SCRIPT_PATH_PARMNUM;
544pub const USER_AUTH_FLAGS_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_AUTH_FLAGS_PARMNUM;
545pub const USER_FULL_NAME_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_FULL_NAME_PARMNUM;
546pub const USER_USR_COMMENT_INFOLEVEL: DWORD =
547    PARMNUM_BASE_INFOLEVEL + USER_USR_COMMENT_PARMNUM;
548pub const USER_PARMS_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_PARMS_PARMNUM;
549pub const USER_WORKSTATIONS_INFOLEVEL: DWORD =
550    PARMNUM_BASE_INFOLEVEL + USER_WORKSTATIONS_PARMNUM;
551pub const USER_LAST_LOGON_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_LAST_LOGON_PARMNUM;
552pub const USER_LAST_LOGOFF_INFOLEVEL: DWORD =
553    PARMNUM_BASE_INFOLEVEL + USER_LAST_LOGOFF_PARMNUM;
554pub const USER_ACCT_EXPIRES_INFOLEVEL: DWORD =
555    PARMNUM_BASE_INFOLEVEL + USER_ACCT_EXPIRES_PARMNUM;
556pub const USER_MAX_STORAGE_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_MAX_STORAGE_PARMNUM;
557pub const USER_UNITS_PER_WEEK_INFOLEVEL: DWORD =
558    PARMNUM_BASE_INFOLEVEL + USER_UNITS_PER_WEEK_PARMNUM;
559pub const USER_LOGON_HOURS_INFOLEVEL: DWORD =
560    PARMNUM_BASE_INFOLEVEL + USER_LOGON_HOURS_PARMNUM;
561pub const USER_PAD_PW_COUNT_INFOLEVEL: DWORD =
562    PARMNUM_BASE_INFOLEVEL + USER_PAD_PW_COUNT_PARMNUM;
563pub const USER_NUM_LOGONS_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_NUM_LOGONS_PARMNUM;
564pub const USER_LOGON_SERVER_INFOLEVEL: DWORD =
565    PARMNUM_BASE_INFOLEVEL + USER_LOGON_SERVER_PARMNUM;
566pub const USER_COUNTRY_CODE_INFOLEVEL: DWORD =
567    PARMNUM_BASE_INFOLEVEL + USER_COUNTRY_CODE_PARMNUM;
568pub const USER_CODE_PAGE_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + USER_CODE_PAGE_PARMNUM;
569pub const USER_PRIMARY_GROUP_INFOLEVEL: DWORD =
570    PARMNUM_BASE_INFOLEVEL + USER_PRIMARY_GROUP_PARMNUM;
571pub const USER_HOME_DIR_DRIVE_INFOLEVEL: DWORD =
572    PARMNUM_BASE_INFOLEVEL + USER_HOME_DIR_DRIVE_PARMNUM;
573pub const NULL_USERSETINFO_PASSWD: &'static str = "              ";
574pub const TIMEQ_FOREVER: DWORD = -1i32 as u32;
575pub const USER_MAXSTORAGE_UNLIMITED: DWORD = -1i32 as u32;
576pub const USER_NO_LOGOFF: DWORD = -1i32 as u32;
577pub const UNITS_PER_DAY: DWORD = 24;
578pub const UNITS_PER_WEEK: DWORD = UNITS_PER_DAY * 7;
579pub const USER_PRIV_MASK: DWORD = 0x3;
580pub const USER_PRIV_GUEST: DWORD = 0;
581pub const USER_PRIV_USER: DWORD = 1;
582pub const USER_PRIV_ADMIN: DWORD = 2;
583pub const MAX_PASSWD_LEN: DWORD = PWLEN;
584pub const DEF_MIN_PWLEN: DWORD = 6;
585pub const DEF_PWUNIQUENESS: DWORD = 5;
586pub const DEF_MAX_PWHIST: DWORD = 8;
587pub const DEF_MAX_PWAGE: DWORD = TIMEQ_FOREVER;
588pub const DEF_MIN_PWAGE: DWORD = 0;
589pub const DEF_FORCE_LOGOFF: DWORD = 0xffffffff;
590pub const DEF_MAX_BADPW: DWORD = 0;
591pub const ONE_DAY: DWORD = 1 * 24 * 3600;
592pub const VALIDATED_LOGON: DWORD = 0;
593pub const PASSWORD_EXPIRED: DWORD = 2;
594pub const NON_VALIDATED_LOGON: DWORD = 3;
595pub const VALID_LOGOFF: DWORD = 1;
596pub const MODALS_MIN_PASSWD_LEN_PARMNUM: DWORD = 1;
597pub const MODALS_MAX_PASSWD_AGE_PARMNUM: DWORD = 2;
598pub const MODALS_MIN_PASSWD_AGE_PARMNUM: DWORD = 3;
599pub const MODALS_FORCE_LOGOFF_PARMNUM: DWORD = 4;
600pub const MODALS_PASSWD_HIST_LEN_PARMNUM: DWORD = 5;
601pub const MODALS_ROLE_PARMNUM: DWORD = 6;
602pub const MODALS_PRIMARY_PARMNUM: DWORD = 7;
603pub const MODALS_DOMAIN_NAME_PARMNUM: DWORD = 8;
604pub const MODALS_DOMAIN_ID_PARMNUM: DWORD = 9;
605pub const MODALS_LOCKOUT_DURATION_PARMNUM: DWORD = 10;
606pub const MODALS_LOCKOUT_OBSERVATION_WINDOW_PARMNUM: DWORD = 11;
607pub const MODALS_LOCKOUT_THRESHOLD_PARMNUM: DWORD = 12;
608pub const MODALS_MIN_PASSWD_LEN_INFOLEVEL: DWORD =
609    PARMNUM_BASE_INFOLEVEL + MODALS_MIN_PASSWD_LEN_PARMNUM;
610pub const MODALS_MAX_PASSWD_AGE_INFOLEVEL: DWORD =
611    PARMNUM_BASE_INFOLEVEL + MODALS_MAX_PASSWD_AGE_PARMNUM;
612pub const MODALS_MIN_PASSWD_AGE_INFOLEVEL: DWORD =
613    PARMNUM_BASE_INFOLEVEL + MODALS_MIN_PASSWD_AGE_PARMNUM;
614pub const MODALS_FORCE_LOGOFF_INFOLEVEL: DWORD =
615    PARMNUM_BASE_INFOLEVEL + MODALS_FORCE_LOGOFF_PARMNUM;
616pub const MODALS_PASSWD_HIST_LEN_INFOLEVEL: DWORD =
617    PARMNUM_BASE_INFOLEVEL + MODALS_PASSWD_HIST_LEN_PARMNUM;
618pub const MODALS_ROLE_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + MODALS_ROLE_PARMNUM;
619pub const MODALS_PRIMARY_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + MODALS_PRIMARY_PARMNUM;
620pub const MODALS_DOMAIN_NAME_INFOLEVEL: DWORD =
621    PARMNUM_BASE_INFOLEVEL + MODALS_DOMAIN_NAME_PARMNUM;
622pub const MODALS_DOMAIN_ID_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + MODALS_DOMAIN_ID_PARMNUM;
623extern "system" {
624    pub fn NetGroupAdd(
625        servername: LPCWSTR,
626        level: DWORD,
627        buf: LPBYTE,
628        parm_err: LPDWORD,
629    ) -> NET_API_STATUS;
630    pub fn NetGroupAddUser(
631        servername: LPCWSTR,
632        GroupName: LPCWSTR,
633        username: LPCWSTR,
634    ) -> NET_API_STATUS;
635    pub fn NetGroupEnum(
636        servername: LPCWSTR,
637        level: DWORD,
638        bufptr: *mut LPBYTE,
639        prefmaxlen: DWORD,
640        entriesread: LPDWORD,
641        totalentries: LPDWORD,
642        resume_handle: PDWORD_PTR,
643    ) -> NET_API_STATUS;
644    pub fn NetGroupGetInfo(
645        servername: LPCWSTR,
646        groupname: LPCWSTR,
647        level: DWORD,
648        bufptr: *mut LPBYTE,
649    ) -> NET_API_STATUS;
650    pub fn NetGroupSetInfo(
651        servername: LPCWSTR,
652        groupname: LPCWSTR,
653        level: DWORD,
654        buf: LPBYTE,
655        parm_err: LPDWORD,
656    ) -> NET_API_STATUS;
657    pub fn NetGroupDel(
658        servername: LPCWSTR,
659        groupname: LPCWSTR,
660    ) -> NET_API_STATUS;
661    pub fn NetGroupDelUser(
662        servername: LPCWSTR,
663        GroupName: LPCWSTR,
664        Username: LPCWSTR,
665    ) -> NET_API_STATUS;
666    pub fn NetGroupGetUsers(
667        servername: LPCWSTR,
668        groupname: LPCWSTR,
669        level: DWORD,
670        bufptr: *mut LPBYTE,
671        prefmaxlen: DWORD,
672        entriesread: LPDWORD,
673        totalentries: LPDWORD,
674        ResumeHandle: PDWORD_PTR,
675    ) -> NET_API_STATUS;
676    pub fn NetGroupSetUsers(
677        servername: LPCWSTR,
678        groupname: LPCWSTR,
679        level: DWORD,
680        buf: LPBYTE,
681        totalentries: DWORD,
682    ) -> NET_API_STATUS;
683}
684STRUCT!{struct GROUP_INFO_0 {
685    grpi0_name: LPWSTR,
686}}
687pub type PGROUP_INFO_0 = *mut GROUP_INFO_0;
688pub type LPGROUP_INFO_0 = *mut GROUP_INFO_0;
689STRUCT!{struct GROUP_INFO_1 {
690    grpi1_name: LPWSTR,
691    grpi1_comment: LPWSTR,
692}}
693pub type PGROUP_INFO_1 = *mut GROUP_INFO_1;
694pub type LPGROUP_INFO_1 = *mut GROUP_INFO_1;
695STRUCT!{struct GROUP_INFO_2 {
696    grpi2_name: LPWSTR,
697    grpi2_comment: LPWSTR,
698    grpi2_group_id: DWORD,
699    grpi2_attributes: DWORD,
700}}
701pub type PGROUP_INFO_2 = *mut GROUP_INFO_2;
702STRUCT!{struct GROUP_INFO_3 {
703    grpi3_name: LPWSTR,
704    grpi3_comment: LPWSTR,
705    grpi3_group_sid: PSID,
706    grpi3_attributes: DWORD,
707}}
708pub type PGROUP_INFO_3 = *mut GROUP_INFO_3;
709STRUCT!{struct GROUP_INFO_1002 {
710    grpi1002_comment: LPWSTR,
711}}
712pub type PGROUP_INFO_1002 = *mut GROUP_INFO_1002;
713pub type LPGROUP_INFO_1002 = *mut GROUP_INFO_1002;
714STRUCT!{struct GROUP_INFO_1005 {
715    grpi1005_attributes: DWORD,
716}}
717pub type PGROUP_INFO_1005 = *mut GROUP_INFO_1005;
718pub type LPGROUP_INFO_1005 = *mut GROUP_INFO_1005;
719STRUCT!{struct GROUP_USERS_INFO_0 {
720    grui0_name: LPWSTR,
721}}
722pub type PGROUP_USERS_INFO_0 = *mut GROUP_USERS_INFO_0;
723pub type LPGROUP_USERS_INFO_0 = *mut GROUP_USERS_INFO_0;
724STRUCT!{struct GROUP_USERS_INFO_1 {
725    grui1_name: LPWSTR,
726    grui1_attributes: DWORD,
727}}
728pub type PGROUP_USERS_INFO_1 = *mut GROUP_USERS_INFO_1;
729pub type LPGROUP_USERS_INFO_1 = *mut GROUP_USERS_INFO_1;
730pub const GROUPIDMASK: DWORD = 0x8000;
731pub const GROUP_SPECIALGRP_USERS: &'static str = "USERS";
732pub const GROUP_SPECIALGRP_ADMINS: &'static str = "ADMINS";
733pub const GROUP_SPECIALGRP_GUESTS: &'static str = "GUESTS";
734pub const GROUP_SPECIALGRP_LOCAL: &'static str = "LOCAL";
735pub const GROUP_ALL_PARMNUM: DWORD = 0;
736pub const GROUP_NAME_PARMNUM: DWORD = 1;
737pub const GROUP_COMMENT_PARMNUM: DWORD = 2;
738pub const GROUP_ATTRIBUTES_PARMNUM: DWORD = 3;
739pub const GROUP_ALL_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + GROUP_ALL_PARMNUM;
740pub const GROUP_NAME_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + GROUP_NAME_PARMNUM;
741pub const GROUP_COMMENT_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + GROUP_COMMENT_PARMNUM;
742pub const GROUP_ATTRIBUTES_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + GROUP_ATTRIBUTES_PARMNUM;
743extern "system" {
744    pub fn NetLocalGroupAdd(
745        servername: LPCWSTR,
746        level: DWORD,
747        buf: LPBYTE,
748        parm_err: LPDWORD,
749    ) -> NET_API_STATUS;
750    pub fn NetLocalGroupAddMember(
751        servername: LPCWSTR,
752        groupname: LPCWSTR,
753        membersid: PSID,
754    ) -> NET_API_STATUS;
755    pub fn NetLocalGroupEnum(
756        servername: LPCWSTR,
757        level: DWORD,
758        bufptr: *mut LPBYTE,
759        prefmaxlen: DWORD,
760        entriesread: LPDWORD,
761        totalentries: LPDWORD,
762        resumehandle: PDWORD_PTR,
763    ) -> NET_API_STATUS;
764    pub fn NetLocalGroupGetInfo(
765        servername: LPCWSTR,
766        groupname: LPCWSTR,
767        level: DWORD,
768        bufptr: *mut LPBYTE,
769    ) -> NET_API_STATUS;
770    pub fn NetLocalGroupSetInfo(
771        servername: LPCWSTR,
772        groupname: LPCWSTR,
773        level: DWORD,
774        buf: LPBYTE,
775        parm_err: LPDWORD,
776    ) -> NET_API_STATUS;
777    pub fn NetLocalGroupDel(
778        servername: LPCWSTR,
779        groupname: LPCWSTR,
780    ) -> NET_API_STATUS;
781    pub fn NetLocalGroupDelMember(
782        servername: LPCWSTR,
783        groupname: LPCWSTR,
784        membersid: PSID,
785    ) -> NET_API_STATUS;
786    pub fn NetLocalGroupGetMembers(
787        servername: LPCWSTR,
788        localgroupname: LPCWSTR,
789        level: DWORD,
790        bufptr: *mut LPBYTE,
791        prefmaxlen: DWORD,
792        entriesread: LPDWORD,
793        totalentries: LPDWORD,
794        resumehandle: PDWORD_PTR,
795    ) -> NET_API_STATUS;
796    pub fn NetLocalGroupSetMembers(
797        servername: LPCWSTR,
798        groupname: LPCWSTR,
799        level: DWORD,
800        buf: LPBYTE,
801        totalentries: DWORD,
802    ) -> NET_API_STATUS;
803    pub fn NetLocalGroupAddMembers(
804        servername: LPCWSTR,
805        groupname: LPCWSTR,
806        level: DWORD,
807        buf: LPBYTE,
808        totalentries: DWORD,
809    ) -> NET_API_STATUS;
810    pub fn NetLocalGroupDelMembers(
811        servername: LPCWSTR,
812        groupname: LPCWSTR,
813        level: DWORD,
814        buf: LPBYTE,
815        totalentries: DWORD,
816    ) -> NET_API_STATUS;
817}
818STRUCT!{struct LOCALGROUP_INFO_0 {
819    lgrpi0_name: LPWSTR,
820}}
821pub type PLOCALGROUP_INFO_0 = *mut LOCALGROUP_INFO_0;
822pub type LPLOCALGROUP_INFO_0 = *mut LOCALGROUP_INFO_0;
823STRUCT!{struct LOCALGROUP_INFO_1 {
824    lgrpi1_name: LPWSTR,
825    lgrpi1_comment: LPWSTR,
826}}
827pub type PLOCALGROUP_INFO_1 = *mut LOCALGROUP_INFO_1;
828pub type LPLOCALGROUP_INFO_1 = *mut LOCALGROUP_INFO_1;
829STRUCT!{struct LOCALGROUP_INFO_1002 {
830    lgrpi1002_comment: LPWSTR,
831}}
832pub type PLOCALGROUP_INFO_1002 = *mut LOCALGROUP_INFO_1002;
833pub type LPLOCALGROUP_INFO_1002 = *mut LOCALGROUP_INFO_1002;
834STRUCT!{struct LOCALGROUP_MEMBERS_INFO_0 {
835    lgrmi0_sid: PSID,
836}}
837pub type PLOCALGROUP_MEMBERS_INFO_0 = *mut LOCALGROUP_MEMBERS_INFO_0;
838pub type LPLOCALGROUP_MEMBERS_INFO_0 = *mut LOCALGROUP_MEMBERS_INFO_0;
839STRUCT!{struct LOCALGROUP_MEMBERS_INFO_1 {
840    lgrmi1_sid: PSID,
841    lgrmi1_sidusage: SID_NAME_USE,
842    lgrmi1_name: LPWSTR,
843}}
844pub type PLOCALGROUP_MEMBERS_INFO_1 = *mut LOCALGROUP_MEMBERS_INFO_1;
845pub type LPLOCALGROUP_MEMBERS_INFO_1 = *mut LOCALGROUP_MEMBERS_INFO_1;
846STRUCT!{struct LOCALGROUP_MEMBERS_INFO_2 {
847    lgrmi2_sid: PSID,
848    lgrmi2_sidusage: SID_NAME_USE,
849    lgrmi2_domainandname: LPWSTR,
850}}
851pub type PLOCALGROUP_MEMBERS_INFO_2 = *mut LOCALGROUP_MEMBERS_INFO_2;
852pub type LPLOCALGROUP_MEMBERS_INFO_2 = *mut LOCALGROUP_MEMBERS_INFO_2;
853STRUCT!{struct LOCALGROUP_MEMBERS_INFO_3 {
854    lgrmi3_domainandname: LPWSTR,
855}}
856pub type PLOCALGROUP_MEMBERS_INFO_3 = *mut LOCALGROUP_MEMBERS_INFO_3;
857pub type LPLOCALGROUP_MEMBERS_INFO_3 = *mut LOCALGROUP_MEMBERS_INFO_3;
858STRUCT!{struct LOCALGROUP_USERS_INFO_0 {
859    lgrui0_name: LPWSTR,
860}}
861pub type PLOCALGROUP_USERS_INFO_0 = *mut LOCALGROUP_USERS_INFO_0;
862pub type LPLOCALGROUP_USERS_INFO_0 = *mut LOCALGROUP_USERS_INFO_0;
863pub const LOCALGROUP_NAME_PARMNUM: DWORD = 1;
864pub const LOCALGROUP_COMMENT_PARMNUM: DWORD = 2;
865extern "system" {
866    pub fn NetQueryDisplayInformation(
867        ServerName: LPCWSTR,
868        Level: DWORD,
869        Index: DWORD,
870        EntriesRequested: DWORD,
871        PreferredMaximumLength: DWORD,
872        ReturnedEntryCount: LPDWORD,
873        SortedBuffer: *mut PVOID,
874    ) -> NET_API_STATUS;
875    pub fn NetGetDisplayInformationIndex(
876        ServerName: LPCWSTR,
877        Level: DWORD,
878        Prefix: LPCWSTR,
879        Index: LPDWORD,
880    ) -> NET_API_STATUS;
881}
882STRUCT!{struct NET_DISPLAY_USER {
883    usri1_name: LPWSTR,
884    usri1_comment: LPWSTR,
885    usri1_flags: DWORD,
886    usri1_full_name: LPWSTR,
887    usri1_user_id: DWORD,
888    usri1_next_index: DWORD,
889}}
890pub type PNET_DISPLAY_USER = *mut NET_DISPLAY_USER;
891STRUCT!{struct NET_DISPLAY_MACHINE {
892    usri2_name: LPWSTR,
893    usri2_comment: LPWSTR,
894    usri2_flags: DWORD,
895    usri2_user_id: DWORD,
896    usri2_next_index: DWORD,
897}}
898pub type PNET_DISPLAY_MACHINE = *mut NET_DISPLAY_MACHINE;
899STRUCT!{struct NET_DISPLAY_GROUP {
900    usri3_name: LPWSTR,
901    usri3_comment: LPWSTR,
902    grpi3_group_id: DWORD,
903    grpi3_attributes: DWORD,
904    grpi3_next_index: DWORD,
905}}
906pub type PNET_DISPLAY_GROUP = *mut NET_DISPLAY_GROUP;
907extern "system" {
908    pub fn NetAccessAdd(
909        servername: LPCWSTR,
910        level: DWORD,
911        buf: LPBYTE,
912        parm_err: LPDWORD,
913    ) -> NET_API_STATUS;
914    pub fn NetAccessEnum(
915        servername: LPCWSTR,
916        BasePath: LPCWSTR,
917        Recursive: DWORD,
918        level: DWORD,
919        bufptr: *mut LPBYTE,
920        prefmaxlen: DWORD,
921        entriesread: LPDWORD,
922        totalentries: LPDWORD,
923        resume_handle: LPDWORD,
924    ) -> NET_API_STATUS;
925    pub fn NetAccessGetInfo(
926        servername: LPCWSTR,
927        resource: LPCWSTR,
928        level: DWORD,
929        bufptr: *mut LPBYTE,
930    ) -> NET_API_STATUS;
931    pub fn NetAccessSetInfo(
932        servername: LPCWSTR,
933        resource: LPCWSTR,
934        level: DWORD,
935        buf: LPBYTE,
936        parm_err: LPDWORD,
937    ) -> NET_API_STATUS;
938    pub fn NetAccessDel(
939        servername: LPCWSTR,
940        resource: LPCWSTR,
941    ) -> NET_API_STATUS;
942    pub fn NetAccessGetUserPerms(
943        servername: LPCWSTR,
944        UGname: LPCWSTR,
945        resource: LPCWSTR,
946        Perms: LPDWORD,
947    ) -> NET_API_STATUS;
948}
949STRUCT!{struct ACCESS_INFO_0 {
950    acc0_resource_name: LPWSTR,
951}}
952pub type PACCESS_INFO_0 = *mut ACCESS_INFO_0;
953pub type LPACCESS_INFO_0 = *mut ACCESS_INFO_0;
954STRUCT!{struct ACCESS_INFO_1 {
955    acc1_resource_name: LPWSTR,
956    acc1_attr: DWORD,
957    acc1_count: DWORD,
958}}
959pub type PACCESS_INFO_1 = *mut ACCESS_INFO_1;
960pub type LPACCESS_INFO_1 = *mut ACCESS_INFO_1;
961STRUCT!{struct ACCESS_INFO_1002 {
962    acc1002_attr: DWORD,
963}}
964pub type PACCESS_INFO_1002 = *mut ACCESS_INFO_1002;
965pub type LPACCESS_INFO_1002 = *mut ACCESS_INFO_1002;
966STRUCT!{struct ACCESS_LIST {
967    acl_ugname: LPWSTR,
968    acl_access: DWORD,
969}}
970pub type PACCESS_LIST = *mut ACCESS_LIST;
971pub type LPACCESS_LIST = *mut ACCESS_LIST;
972pub const MAXPERMENTRIES: DWORD = 64;
973pub const ACCESS_NONE: DWORD = 0;
974pub const ACCESS_ALL: DWORD = ACCESS_READ | ACCESS_WRITE | ACCESS_CREATE | ACCESS_EXEC
975    | ACCESS_DELETE | ACCESS_ATRIB | ACCESS_PERM;
976pub const ACCESS_READ: DWORD = 0x01;
977pub const ACCESS_WRITE: DWORD = 0x02;
978pub const ACCESS_CREATE: DWORD = 0x04;
979pub const ACCESS_EXEC: DWORD = 0x08;
980pub const ACCESS_DELETE: DWORD = 0x10;
981pub const ACCESS_ATRIB: DWORD = 0x20;
982pub const ACCESS_PERM: DWORD = 0x40;
983pub const ACCESS_GROUP: DWORD = 0x8000;
984pub const ACCESS_AUDIT: DWORD = 0x1;
985pub const ACCESS_SUCCESS_OPEN: DWORD = 0x10;
986pub const ACCESS_SUCCESS_WRITE: DWORD = 0x20;
987pub const ACCESS_SUCCESS_DELETE: DWORD = 0x40;
988pub const ACCESS_SUCCESS_ACL: DWORD = 0x80;
989pub const ACCESS_SUCCESS_MASK: DWORD = 0xF0;
990pub const ACCESS_FAIL_OPEN: DWORD = 0x100;
991pub const ACCESS_FAIL_WRITE: DWORD = 0x200;
992pub const ACCESS_FAIL_DELETE: DWORD = 0x400;
993pub const ACCESS_FAIL_ACL: DWORD = 0x800;
994pub const ACCESS_FAIL_MASK: DWORD = 0xF00;
995pub const ACCESS_FAIL_SHIFT: DWORD = 4;
996pub const ACCESS_RESOURCE_NAME_PARMNUM: DWORD = 1;
997pub const ACCESS_ATTR_PARMNUM: DWORD = 2;
998pub const ACCESS_COUNT_PARMNUM: DWORD = 3;
999pub const ACCESS_ACCESS_LIST_PARMNUM: DWORD = 4;
1000pub const ACCESS_RESOURCE_NAME_INFOLEVEL: DWORD =
1001    PARMNUM_BASE_INFOLEVEL + ACCESS_RESOURCE_NAME_PARMNUM;
1002pub const ACCESS_ATTR_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + ACCESS_ATTR_PARMNUM;
1003pub const ACCESS_COUNT_INFOLEVEL: DWORD = PARMNUM_BASE_INFOLEVEL + ACCESS_COUNT_PARMNUM;
1004pub const ACCESS_ACCESS_LIST_INFOLEVEL: DWORD =
1005    PARMNUM_BASE_INFOLEVEL + ACCESS_ACCESS_LIST_PARMNUM;
1006pub const ACCESS_LETTERS: &'static str = "RWCXDAP         ";
1007ENUM!{enum NET_VALIDATE_PASSWORD_TYPE {
1008    NetValidateAuthentication = 1,
1009    NetValidatePasswordChange,
1010    NetValidatePasswordReset,
1011}}
1012pub type PNET_VALIDATE_PASSWORD_TYPE = *mut NET_VALIDATE_PASSWORD_TYPE;
1013STRUCT!{struct NET_VALIDATE_PASSWORD_HASH {
1014    Length: ULONG,
1015    Hash: LPBYTE,
1016}}
1017pub type PNET_VALIDATE_PASSWORD_HASH = *mut NET_VALIDATE_PASSWORD_HASH;
1018pub const NET_VALIDATE_PASSWORD_LAST_SET: ULONG = 0x00000001;
1019pub const NET_VALIDATE_BAD_PASSWORD_TIME: ULONG = 0x00000002;
1020pub const NET_VALIDATE_LOCKOUT_TIME: ULONG = 0x00000004;
1021pub const NET_VALIDATE_BAD_PASSWORD_COUNT: ULONG = 0x00000008;
1022pub const NET_VALIDATE_PASSWORD_HISTORY_LENGTH: ULONG = 0x00000010;
1023pub const NET_VALIDATE_PASSWORD_HISTORY: ULONG = 0x00000020;
1024STRUCT!{struct NET_VALIDATE_PERSISTED_FIELDS {
1025    PresentFields: ULONG,
1026    PasswordLastSet: FILETIME,
1027    BadPasswordTime: FILETIME,
1028    LockoutTime: FILETIME,
1029    BadPasswordCount: ULONG,
1030    PasswordHistoryLength: ULONG,
1031    PasswordHistory: PNET_VALIDATE_PASSWORD_HASH,
1032}}
1033pub type PNET_VALIDATE_PERSISTED_FIELDS = *mut NET_VALIDATE_PERSISTED_FIELDS;
1034STRUCT!{struct NET_VALIDATE_OUTPUT_ARG {
1035    ChangedPersistedFields: NET_VALIDATE_PERSISTED_FIELDS,
1036    ValidationStatus: NET_API_STATUS,
1037}}
1038pub type PNET_VALIDATE_OUTPUT_ARG = *mut NET_VALIDATE_OUTPUT_ARG;
1039STRUCT!{struct NET_VALIDATE_AUTHENTICATION_INPUT_ARG {
1040    InputPersistedFields: NET_VALIDATE_PERSISTED_FIELDS,
1041    PasswordMatched: BOOLEAN,
1042}}
1043pub type PNET_VALIDATE_AUTHENTICATION_INPUT_ARG = *mut NET_VALIDATE_AUTHENTICATION_INPUT_ARG;
1044STRUCT!{struct NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG {
1045    InputPersistedFields: NET_VALIDATE_PERSISTED_FIELDS,
1046    ClearPassword: LPWSTR,
1047    UserAccountName: LPWSTR,
1048    HashedPassword: NET_VALIDATE_PASSWORD_HASH,
1049    PasswordMatch: BOOLEAN,
1050}}
1051pub type PNET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG = *mut NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG;
1052STRUCT!{struct NET_VALIDATE_PASSWORD_RESET_INPUT_ARG {
1053    InputPersistedFields: NET_VALIDATE_PERSISTED_FIELDS,
1054    ClearPassword: LPWSTR,
1055    UserAccountName: LPWSTR,
1056    HashedPassword: NET_VALIDATE_PASSWORD_HASH,
1057    PasswordMustChangeAtNextLogon: BOOLEAN,
1058    ClearLockout: BOOLEAN,
1059}}
1060pub type PNET_VALIDATE_PASSWORD_RESET_INPUT_ARG = *mut NET_VALIDATE_PASSWORD_RESET_INPUT_ARG;
1061extern "system" {
1062    pub fn NetValidatePasswordPolicy(
1063        ServerName: LPCWSTR,
1064        Qualifier: LPVOID,
1065        ValidationType: NET_VALIDATE_PASSWORD_TYPE,
1066        InputArg: LPVOID,
1067        OutputArg: *mut LPVOID,
1068    ) -> NET_API_STATUS;
1069    pub fn NetValidatePasswordPolicyFree(
1070        OutputArg: *mut LPVOID,
1071    ) -> NET_API_STATUS;
1072    pub fn NetGetDCName(
1073        servername: LPCWSTR,
1074        domainname: LPCWSTR,
1075        bufptr: *mut LPBYTE,
1076    ) -> NET_API_STATUS;
1077    pub fn NetGetAnyDCName(
1078        servername: LPCWSTR,
1079        domainname: LPCWSTR,
1080        bufptr: *mut LPBYTE,
1081    ) -> NET_API_STATUS;
1082    pub fn I_NetLogonControl(
1083        ServerName: LPCWSTR,
1084        FunctionCode: DWORD,
1085        QueryLevel: DWORD,
1086        Buffer: *mut LPBYTE,
1087    ) -> NET_API_STATUS;
1088    pub fn I_NetLogonControl2(
1089        ServerName: LPCWSTR,
1090        FunctionCode: DWORD,
1091        QueryLevel: DWORD,
1092        Data: LPBYTE,
1093        Buffer: *mut LPBYTE,
1094    ) -> NET_API_STATUS;
1095}
1096pub type NTSTATUS = LONG;
1097pub type PNTSTATUS = *mut LONG;
1098extern "system" {
1099    pub fn NetEnumerateTrustedDomains(
1100        ServerName: LPWSTR,
1101        DomainNames: *mut LPWSTR,
1102    ) -> NTSTATUS;
1103}
1104pub const NETLOGON_CONTROL_QUERY: DWORD = 1;
1105pub const NETLOGON_CONTROL_REPLICATE: DWORD = 2;
1106pub const NETLOGON_CONTROL_SYNCHRONIZE: DWORD = 3;
1107pub const NETLOGON_CONTROL_PDC_REPLICATE: DWORD = 4;
1108pub const NETLOGON_CONTROL_REDISCOVER: DWORD = 5;
1109pub const NETLOGON_CONTROL_TC_QUERY: DWORD = 6;
1110pub const NETLOGON_CONTROL_TRANSPORT_NOTIFY: DWORD = 7;
1111pub const NETLOGON_CONTROL_FIND_USER: DWORD = 8;
1112pub const NETLOGON_CONTROL_CHANGE_PASSWORD: DWORD = 9;
1113pub const NETLOGON_CONTROL_TC_VERIFY: DWORD = 10;
1114pub const NETLOGON_CONTROL_FORCE_DNS_REG: DWORD = 11;
1115pub const NETLOGON_CONTROL_QUERY_DNS_REG: DWORD = 12;
1116pub const NETLOGON_CONTROL_QUERY_ENC_TYPES: DWORD = 13;
1117pub const NETLOGON_CONTROL_UNLOAD_NETLOGON_DLL: DWORD = 0xFFFB;
1118pub const NETLOGON_CONTROL_BACKUP_CHANGE_LOG: DWORD = 0xFFFC;
1119pub const NETLOGON_CONTROL_TRUNCATE_LOG: DWORD = 0xFFFD;
1120pub const NETLOGON_CONTROL_SET_DBFLAG: DWORD = 0xFFFE;
1121pub const NETLOGON_CONTROL_BREAKPOINT: DWORD = 0xFFFF;
1122STRUCT!{struct NETLOGON_INFO_1 {
1123    netlog1_flags: DWORD,
1124    netlog1_pdc_connection_status: NET_API_STATUS,
1125}}
1126pub type PNETLOGON_INFO_1 = *mut NETLOGON_INFO_1;
1127STRUCT!{struct NETLOGON_INFO_2 {
1128    netlog2_flags: DWORD,
1129    netlog2_pdc_connection_status: NET_API_STATUS,
1130    netlog2_trusted_dc_name: LPWSTR,
1131    netlog2_tc_connection_status: NET_API_STATUS,
1132}}
1133pub type PNETLOGON_INFO_2 = *mut NETLOGON_INFO_2;
1134STRUCT!{struct NETLOGON_INFO_3 {
1135    netlog3_flags: DWORD,
1136    netlog3_logon_attempts: DWORD,
1137    netlog3_reserved1: DWORD,
1138    netlog3_reserved2: DWORD,
1139    netlog3_reserved3: DWORD,
1140    netlog3_reserved4: DWORD,
1141    netlog3_reserved5: DWORD,
1142}}
1143pub type PNETLOGON_INFO_3 = *mut NETLOGON_INFO_3;
1144STRUCT!{struct NETLOGON_INFO_4 {
1145    netlog4_trusted_dc_name: LPWSTR,
1146    netlog4_trusted_domain_name: LPWSTR,
1147}}
1148pub type PNETLOGON_INFO_4 = *mut NETLOGON_INFO_4;
1149pub const NETLOGON_REPLICATION_NEEDED: DWORD = 0x01;
1150pub const NETLOGON_REPLICATION_IN_PROGRESS: DWORD = 0x02;
1151pub const NETLOGON_FULL_SYNC_REPLICATION: DWORD = 0x04;
1152pub const NETLOGON_REDO_NEEDED: DWORD = 0x08;
1153pub const NETLOGON_HAS_IP: DWORD = 0x10;
1154pub const NETLOGON_HAS_TIMESERV: DWORD = 0x20;
1155pub const NETLOGON_DNS_UPDATE_FAILURE: DWORD = 0x40;
1156pub const NETLOGON_VERIFY_STATUS_RETURNED: DWORD = 0x80;
1157pub const SERVICE_ACCOUNT_PASSWORD: &'static str = "_SA_{262E99C9-6160-4871-ACEC-4E61736B6F21}";
1158pub const SERVICE_ACCOUNT_SECRET_PREFIX: &'static str
1159    = "_SC_{262E99C9-6160-4871-ACEC-4E61736B6F21}_";
1160DEFINE_GUID!{ServiceAccountPasswordGUID,
1161    0x262E99C9, 0x6160, 0x4871, 0xAC, 0xEC, 0x4E, 0x61, 0x73, 0x6B, 0x6F, 0x21}
1162extern "system" {
1163    pub fn NetAddServiceAccount(
1164        ServerName: LPWSTR,
1165        AccountName: LPWSTR,
1166        Password: LPWSTR,
1167        Flags: DWORD,
1168    ) -> NTSTATUS;
1169}
1170pub const SERVICE_ACCOUNT_FLAG_LINK_TO_HOST_ONLY: DWORD = 0x00000001;
1171pub const SERVICE_ACCOUNT_FLAG_ADD_AGAINST_RODC: DWORD = 0x00000002;
1172pub const SERVICE_ACCOUNT_FLAG_UNLINK_FROM_HOST_ONLY: DWORD = 0x00000001;
1173pub const SERVICE_ACCOUNT_FLAG_REMOVE_OFFLINE: DWORD = 0x00000002;
1174extern "system" {
1175    pub fn NetRemoveServiceAccount(
1176        ServerName: LPWSTR,
1177        AccountName: LPWSTR,
1178        Flags: DWORD,
1179    ) -> NTSTATUS;
1180    pub fn NetEnumerateServiceAccounts(
1181        ServerName: LPWSTR,
1182        Flags: DWORD,
1183        AccountsCount: *mut DWORD,
1184        Accounts: *mut PZPWSTR,
1185    ) -> NTSTATUS;
1186    pub fn NetIsServiceAccount(
1187        ServerName: LPWSTR,
1188        AccountName: LPWSTR,
1189        IsService: *mut BOOL,
1190    ) -> NTSTATUS;
1191    pub fn NetQueryServiceAccount(
1192        ServerName: LPWSTR,
1193        AccountName: LPWSTR,
1194        InfoLevel: DWORD,
1195        Buffer: *mut PBYTE,
1196    ) -> NTSTATUS;
1197}
1198ENUM!{enum MSA_INFO_LEVEL {
1199    MsaInfoLevel0 = 0,
1200    MsaInfoLevelMax,
1201}}
1202pub type PMSA_INFO_LEVEL = *mut MSA_INFO_LEVEL;
1203ENUM!{enum MSA_INFO_STATE {
1204    MsaInfoNotExist = 1,
1205    MsaInfoNotService,
1206    MsaInfoCannotInstall,
1207    MsaInfoCanInstall,
1208    MsaInfoInstalled,
1209}}
1210pub type PMSA_INFO_STATE = *mut MSA_INFO_STATE;
1211STRUCT!{struct MSA_INFO_0 {
1212    State: MSA_INFO_STATE,
1213}}
1214pub type PMSA_INFO_0 = *mut MSA_INFO_0;
1215pub type LPMSA_INFO_0 = *mut MSA_INFO_0;