Tipy a triky v Delphi, díl 106. – správa účtů

I tentokrát budeme pokračovat v tipech pro NT systémy a stejně jako minule bude i dnešní tip souviset se správou uživatelských účtů.
Minule jsme si ukazovali, jak zjistit rozličná práva, kterými uživatel může disponovat a dnes se naučíme zjišťovat seznam uživatelských účtů. Zkušenějším z vás to jistě nemusím vysvětlovat, ale některé méně znalé uživatele by možná překvapilo, že mají v počítači účty, o jejichž existenci ani netuší. Hovoříme-li konkrétně například o Windows XP, máme zde kromě námi vytvořených účtů též kupříkladu účet hosta (Guest) nebo účet technické podpory. Byť nemusí být tyto účty aktivní, přesto je v počítači máme a pomocí běžných nástrojů nejdou odstranit, pokud vůbec nějak (teď mám tedy na mysli konkrétně účet hosta). Ale to bylo jen tak na okraj. Dnes se právě naučíme zjišťovat seznam uživatelských účtů a to všech, tedy i těch "skrytých".

K celé akci využijeme funkce externí systémové knihovny netapi32.dll a raději znovu připomínám, že příklad je celkem logicky určen pouze pro NT systémy. Na formulář umístěte tlačítko, na jehož událost OnClick bude celá akce spuštěna. Dále si přidejte na formulář komponentu ListBox, která nám poslouží pro výpis výsledků. Pokud vše proběhne jak má, dostaneme na výstupu (v komponentě ListBox) seznam všech uživatelských účtů a zároveň jejich slovní popis, vyjadřující funkci účtu.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  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;

  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`;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  ERead: DWORD;
  TotalEntries: DWORD;
  UserInfo: lpUSER_INFO_1;
  lpBuffer: Pointer;
  ResumeHandle: DWORD;
  Counter: Integer;
  NetApiStatus: LongWord;
begin
  ResumeHandle := 0;
  repeat
    NetApiStatus := NetUserEnum(nil, 1, 0, lpBuffer, 0, ERead, TotalEntries, ResumeHandle);
    UserInfo := lpBuffer;
    for Counter := 0 to ERead - 1 do
    begin
      listbox1.Items.Add(WideCharToString(UserInfo^.usri1_name) + ` --> ` + WideCharToString(UserInfo^.usri1_comment));
      Inc(UserInfo);
    end;
    NetApiBufferFree(lpBuffer);
  until (NetApiStatus <> ERROR_MORE_DATA);
end;

end.

Správnou funkčnost si můžete opět ověřit přímo v systému. Pod Windows XP tento seznam najdete přes Ovládací panely -> Nástroje pro správu -> Správa počítače, kde v levém sloupci vyberete položku Místní uživatelé a skupiny.

Diskuze (3) Další článek: Istanbul hostí CeBIT Bilisim Eurasia 2003

Témata článku: Software, Windows, Programování, Díl, Správa, Běžný nástroj, Účet, Trik, Pointer, Counter

Určitě si přečtěte


Aktuální číslo časopisu Computer

Test 6 odolných telefonů a 22 powerbank

Srovnání technologií QLED a OLED

Měřte své sportovní výkony

Sady pro chytrou domácnost