A MŰVELET gomb segítségével indíthatjuk el a lekérdezést, melynek eredményeképpen a TListBox kontrolban lesznek megtalálhatók a rendszerben bejegyzett felhasználók nevei. A TMemo kontrolban az aktuálisan kijelölt felhasználóhoz kapcsolódó kísérőinformáció jelenik meg. Lássuk, mit kell tennünk, hogy a művelet végrehajtódjon.
A lekérdezéshez két API metódusra van szükségünk. A NetUserenum függvény végzi el a lekérdezést. Deklarációja a következő:
function NetUserEnum(ServerName: PWideChar;
Level,
Filter: DWORD;
var Buffer: Pointer;
PrefMaxLen: DWORD;
var EntriesRead,
TotalEntries,
ResumeHandle: DWORD): Longword; stdcall; external 'netapi32.dll';
A művelet végén a NetApiBufferFree metódussal fel kell szabadítani a bufPtr mutató által lefoglalt memóriaterületet, a memóriaszivárgás elkerülése végett (memory leak).
function NetApiBufferFree(pBuffer: PByte): Longint; stdcall; external 'netapi32.dll';
A felhasználói információkat a USER_INFO_1 nevű rekordban kapjuk vissza a metódus meghívása után. Ezt is deklaráljuk:
USER_INFO_1 = record
usri1_name: LPWSTR;
usri1_password: LPWSTR;
usri1_password_age: DWORD;
usri1_priv: DWORD;
usri1_home_dir: LPWSTR;
usri1_comment: LPWSTR;
usri1_flags: DWORD;
usri1_script_path: LPWSTR;
end;
lpUSER_INFO_1 = ^USER_INFO_1;
A rekord tárolja a felhasználó jelszavát, annak lejáratára vonatkozó információt, illetve a felhasználó mappájának elérési útvonalát. A gomb megnyomása után nincs más teendőnk, mint meghívni a függvényt a megfelelő metódusokkal. A függvény negyedik paramétere tartalmazza azt a pointer-t, mely majd az adatokkal teli rekordra mutat.
status := NetUserEnum(nil, 1, 0, lpBuffer, 0, er, total, rh);
A hívás után végigmegyünk a pointer által mutatott memóriaterületen, és a listába írjuk a rekord usri1_name mezőjének tartalmát.
userinfo := lpBuffer;
for Counter := 0 to er - 1 do
begin
listbox1.Items.Add(WideCharToString(userinfo^.usri1_name));
list.Add(WideCharToString(userinfo^.usri1_comment));
Inc(userinfo);
end;
Majd felszabadítjuk a memóriaterületet.
NetApiBufferFree(lpBuffer);
A usri1_comment mező értékeit egy TStringList listába írjuk, és a ListBox kontrol egy-egy új elemének kijelölésekor megjelenítjük az azonos sorszámú elemet a TMemo kontrolban.
memo1.Text := list[listbox1.ItemIndex];