Добрый день!
Стоит задача - получить список учеток компьютера. Нижеприведенный код хоть и работает, но выводит много лишнего. Например у меня одна учетка на компе "Olga", а он выводит:
Помогите пожалуйста понять что не так и исправить этот код, чтобы отображались только те учетки, которые показываются на экране во время приветствия при включении компьютера.
Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const
FILTER_TEMP_DUPLICATE_ACCOUNT = $0001;
FILTER_NORMAL_ACCOUNT = $0002;
FILTER_PROXY_ACCOUNT = $0004;
FILTER_INTERDOMAIN_TRUST_ACCOUNT = $0008;
FILTER_WORKSTATION_TRUST_ACCOUNT = $0010;
FILTER_SERVER_TRUST_ACCOUNT = $0020;
MAX_PREFERRED_LENGTH = -1;
NERR_Success = 0; // Success
type
TForm2 = class(TForm)
memo1: TMemo;
button1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TUserAccountType = (
fltrDuplicate, // Enumerates local user account data on a domain controller.
fltrNormal, // Enumerates global user account data on a computer.
fltrProxy, // ???
fltrInterdomainTrust, // Enumerates domain trust account data on a domain controller.
fltrWorkstationTrust, // Enumerates workstation or member server account data on a domain controller.
fltrServerTrust // Enumerates domain controller account data on a domain controller.
);
TUserAccountFilter = set of TUserAccountType;
USER_INFO_0 = record
usri0_name : PWideChar;
end;
PUSER_INFO_0 = ^USER_INFO_0;
NetAPIStatus = Integer;
function NetUserEnum (serverName : PWideChar; level, filter : Integer; var buffer : Pointer; prefmaxlen : Integer;
var entriesRead, totalEntries, resumeHandle : Integer) : NetAPIStatus; stdcall;
function NetApiBufferFree (buffer : Pointer) : NetAPIStatus; stdcall;
var
Form2: TForm2;
NIL_HANDLE : Integer = 0;
implementation
{$R *.dfm}
function NetUserEnum; external 'NETAPI32.DLL';
function NetApiBufferFree; external 'NETAPI32.dLL';
function UserAccountFilterToDWORD (filter : TUserAccountFilter) : DWORD;
begin
result := 0;
if fltrDuplicate in filter then result := result or FILTER_TEMP_DUPLICATE_ACCOUNT;
if fltrNormal in filter then result := result or FILTER_NORMAL_ACCOUNT;
if fltrProxy in filter then result := result or FILTER_PROXY_ACCOUNT;
if fltrInterdomainTrust in filter then result := result or FILTER_INTERDOMAIN_TRUST_ACCOUNT;
if fltrWorkstationTrust in filter then result := result or FILTER_WORKSTATION_TRUST_ACCOUNT;
if fltrServerTrust in filter then result := result or FILTER_SERVER_TRUST_ACCOUNT
end;
function GetComputerName: string;
var
buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: Cardinal;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
Windows.GetComputerName(@buffer, Size);
Result := StrPas(buffer);
end;
procedure TForm2.button1Click(Sender: TObject);
var
wServerName : WideString;
rv : NetAPIStatus;
buffer : pointer;
i, entriesRead, totalEntries : Integer;
p : PUSER_INFO_0;
begin
memo1.lines.Clear;
wServerName:=GetComputerName;
rv := NetUserEnum (PWideChar (wServerName), 0, UserAccountFilterToDWORD ([fltrNormal]), buffer, MAX_PREFERRED_LENGTH,
entriesRead, totalEntries, NIL_HANDLE);
if rv = NERR_Success then
try
p := PUSER_INFO_0 (buffer);
for i := 0 to entriesRead - 1 do
begin
memo1.lines.Add (p^.usri0_name);
Inc (p)
end
finally
NetAPIBufferFree (buffer)
end
else
ShowMessage('Error');
end;
end.