Skip to main content

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