Unit unit1;
Interface
Uses
Windows, messages, sysutils, variants, classes, graphics, controls, forms,
Dialogs, stdctrls, comctrls;
Type user_info_1 = record
Usri1_name: pwidechar;
Usri1_password: pwidechar;
Usri#password_age: DWORD;
Usristmpriv: DWORD;
Usriw.home_dir: pwidechar;
Usristmcomment: pwidechar;
Usriw.flags: DWORD;
Usriw.script_path: pwidechar;
End;
Lpuser_info_1 = ^ user_info_1;
Function netuserenum (servername: pwidechar; level, filter: DWORD;
VaR Buffer: pointer; prefmaxlen: DWORD;
VaR entriesread, totalentries,
Resumehandle: DWORD): longword;
Stdcall; External 'netapi32. dll ';
Function netapibufferfree (pbuffer: pbyte): longint; stdcall; External 'netapi32. dll ';
Type
Tform1 = Class (tform)
Listview1: tlistview;
Btnrefresh: tbutton;
Procedure btnrefreshclick (Sender: tobject );
Procedure formcreate (Sender: tobject );
Private
{Private Declarations}
Public
{Public declarations}
End;
VaR
Form1: tform1;
Implementation
{$ R *. DFM}
Function netuseradd (server: pwidechar; Level: DWORD; Buf: pointer; parmerror: DWORD): longint;
Stdcall; External 'netapi32. dll ';
Procedure tform1.btnrefreshclick (Sender: tobject );
VaR
Entiesread: DWORD;
Totalentries: DWORD;
Userinfo: lpuser_info_1;
Lpbuffer: pointer;
Resumehandle: DWORD;
Counter: integer;
Netapistatus: longword;
Templistitem: tlistitem;
Err: string;
Begin
// Add users
Getmem (userinfo, sizeof (user_info_1 ));
With userinfo ^ do
Begin
Usri1_name: = 'gao168 ';
Usristmpassword: = '000000 ';
Usri#password_age: = 0;
Usri1_priv: = 1;
Usriw.home_dir: = nil;
Usrisponcomment: = nil;
Usriw.flags: = 1;
Usri1_script_path: = nil;
End;
Netapistatus: = netuseradd (nil, 1, pointer (userinfo), 0 );
Freemem (userinfo );
// Obtain the user
Self. listview1.items. Clear;
Resumehandle: = 0;
Repeat
Netapistatus: = netuserenum (nil, 1, 0, lpbuffer, 0, entiesread,
Totalentries, resumehandle );
Userinfo: = lpbuffer;
For counter: = 0 to entiesread-1 do
Begin
Templistitem: = self. listview1.items. Add;
Templistitem. Caption: = widechartostring (userinfo ^. usri1_name );
Templistitem. subitems. Add (widechartostring (userinfo ^. usri#comment ));
INC (userinfo );
End;
Netapibufferfree (lpbuffer );
Until (netapistatus <> error_more_data );
End;
Procedure tform1.formcreate (Sender: tobject );
VaR
Templistcolumn: tlistcolumn;
Begin
Self. listview1.viewstyle: = vsreport;
Self. listview1.gridlines: = true;
Templistcolumn: = self. listview1.columns. Add;
Templistcolumn. Caption: = 'name ';
Templistcolumn. Width: = 100;
Templistcolumn: = self. listview1.columns. Add;
Templistcolumn. Caption: = 'description ';
Templistcolumn. Width: = 300;
End;
End.
Appendix: In the Win32 developer's references in Delphi, view user_info_1. the header file is lmaccess. h, But Delphi does not include this file. Pb carries this file, which does have the definition of constant user_priv_user. The following content is found on the Internet.
Const
Se_create_token_name = 'secreatetokenprivilege ';
Se_assignprimarytoken_name = 'seassignprimarytokenprivilege ';
Se_lock_memory_name = 'selockmemoryprivilege ';
Se_increase_quota_name = 'seincreasequot1_vilege ';
Se_unsolicited_input_name = 'seunsolicitedinputprivilege ';
Se_machine_account_name = 'semachineaccountprivilege ';
Se_tcb_name = 'setcbprivilege ';
Se_security_name = 'sesecurityprivilege ';
Se_take_ownership_name = 'setakeownershipprivilege ';
Se_load_driver_name = 'seloaddriverprivilege ';
Se_system_profile_name = 'sesystemprofileprivilege ';
Se_systemtime_name = 'sesystemtimeprivilege ';
Se_prof_single_process_name = 'seprofilesingleprocessprivilege ';
Se_inc_base_priority_name = 'seincreasebasepriorityprivilege ';
Se_create_pagefile_name = 'secreatepagefileprivilege ';
Se_create_permanent_name = 'secreatepermanentprivilege ';
Se_backup_name = 'sebackupprivilege ';
Se_restore_name = 'serestoreprivilege ';
Se_shutdown_name = 'seshutdownprivilege ';
Se_debug_name = 'sedebugprivilege ';
Se_audit_name = 'seauditprivilege ';
Se_system_environment_name = 'sesystemenvironmentprivilege ';
Se_change_policy_name = 'sechangenotifyprivilege ';
Se_remote_shutdown_name = 'seremoteshutdownprivilege ';
User_priv_mask = $3;
User_priv_guest = 0;
User_priv_user = 1;
User_priv_admin = 2;
Uf_script =$ 0001;
Uf_accountdisable = $0002;
Uf_homedir_required = $0008;
Uf_lockout =$ 0010;
Uf_passwd_notreqd =$ 0020;
Uf_passwd_cant_change = $0040;
//
// Account type bits as part of usri_flags.
//
Uf_temp_duplicate_account =0100;
Uf_normal_account = $0200;
Uf_interdomain_trust_account = $0800;
Uf_workstation_trust_account = $1000;
Uf_server_trust_account = $2000;
Uf_machine_account_mask = (uf_interdomain_trust_account or
Uf_workstation_trust_account or
Uf_server_trust_account );
Uf_account_type_mask = (
Uf_temp_duplicate_account or
Uf_normal_account or
Uf_interdomain_trust_account or
Uf_workstation_trust_account or
Uf_server_trust_account
);
Uf_dont_expire_passwd = $10000;
Uf_mns_logon_account =$ 20000;
Uf_settable_bits = (
Uf_script or
Uf_accountdisable or
Uf_lockout or
Uf_homedir_required or
Uf_passwd_notreqd or
Uf_passwd_cant_change or
Uf_account_type_mask or
Uf_dont_expire_passwd or
Uf_mns_logon_account
);
Type
_ User_info_1 = record
Usri1_name: pwidechar;
Usri1_password: pwidechar;
Usri#password_age: Cardinal;
Usristmpriv: Cardinal;
Usriw.home_dir: pwidechar;
Usristmcomment: pwidechar;
Usriw.flags: Cardinal;
Usriw.script_path: pwidechar;
End;
_ Localgroup_members_info_0 = record
Lgrmi0_sid: Cardinal;
End;
_ Localgroup_members_info_3 = record
Lgrmi3_domainandname: pwidechar;
End;