Tipy a triky v Delphi, díl 105. - práva uživatele

Dnes se podíváme na to, jaké informace se dají získat o přihlášeném uživateli, přesněji řečeno, o jeho právech.
Už z úvodu je jasné, že dnešní tip je opět určen pro NT systémy. Hovoříme-li o právech uživatele, jistě dobře víte, že se tím nemyslí jen právo přístupu uživatele pouze do jemu určených složek, ale administrátor může omezit počínání uživatelů i jiným způsobem. Někteří nemají přístup k ovládacím panelům počítače, uživatel rovněž nemusí mít právo instalovat aplikace a podobně. Možností je prostě celá řada a na některé by člověk na první zamyšlení ani nepřišel. Mezi taková méně známá uživatelská práva patří například právo změnit systémový čas, právo zálohovat a obnovit soubory, vytvořit stránkovací soubor, upravit kvóty paměti pro proces a podobně.

Právě takový seznam méně známých práv se naučíme u přihlášeného uživatele zjistit. Funkce bude vytvořena jako událost stisku tlačítka a na formulář rovněž přidejte komponentu ListBox, do které budou výsledky vypsány.

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;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  TokenSize = 800;
var
  hToken: THandle;
  pTokenInfo: PTOKENPRIVILEGES;
  ReturnLen, NameSize, DisplSize, LangId: Cardinal;
  i: Integer;
  PrivName, DisplayName: PChar;
begin
  try
    GetMem(pTokenInfo, TokenSize);
    GetMem(PrivName, 255);
    GetMem(DisplayName, 255);
    try
      if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
      if not GetTokenInformation(hToken, TokenPrivileges, pTokenInfo, TokenSize, ReturnLen) then Exit;
      for i := 0 to pTokenInfo.PrivilegeCount - 1 do
      begin
        DisplSize := 255;
        NameSize  := 255;
        LookupPrivilegeName(nil, pTokenInfo.Privileges[i].Luid, PrivName, Namesize);
        LookupPrivilegeDisplayName(nil, PrivName, DisplayName, DisplSize, LangId);
        ListBox1.Items.Add(PrivName + `  -  ` + DisplayName);
      end;
    finally
      FreeMem(PrivName);
      FreeMem(DisplayName);
      FreeMem(pTokenInfo);
    end;
  except
    ShowMessage(`Chyba! Nepodarilo se alokovat pamet.`);
  end;
end;

end.

Po spuštění funkce bude do připraveného ListView vypsán seznam privilegií, které uživatel má. Pokud by vás snad zajímal kompletní seznam všech dostupných možností, můžete si jej prohlédnout přímo v systému, kdy v Ovládacích panelech zvolíte položku Nástroje pro správu, zde Místní zásady zabezpečení a v otevřeném okně pak v levém stromovém seznamu vyberte položku Přiřazení uživatelských práv (tento postup platí pro Windows XP). Uvidíte zde kompletní seznam a u každé položky je uveden uživatel (či seznam uživatelů), který daným právem disponuje. Není se ani moc čemu divit, že z běžných uživatelů (pomineme-li systém jako takový) má na podobné "vychytávky" právo obvykle jen administrátor.

Ještě jednou tedy připomínám, že dnešní příklad bude fungovat pouze na NT systémech, přičemž pod systémy 9x se nestane nic.

Témata článku: Software, Windows, Programování, Exit, Trik, Díl

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


Aktuální číslo časopisu Computer

26 procesorů v důkladném testu

Zhodnotili jsme 18 bezdrátových reproduktorů

Jak fungují cash back služby?

Pohlídejte své děti na internetu