Tipy a triky v Delphi, díl 77.

V našem dnešním malém tipu si ukážeme funkci, která zjistí vlastníka (tvůrce) libovolného souboru, který na disku máme.
Všichni jsme zvyklí na to, že každý soubor, který je na disku uložen, má jisté vlastnosti - atributy. Kromě samotného názvu souboru tak můžeme zjistit rozličné časové informace (kdy byl vytvořen, změněn atd..), zda je chráněn proti zápisu a podobně. Jednou z těchto informací je též vlastník souboru, tedy osoba, která soubor na disku vytvořila. A jeho jméno (loginname) se právě naučíme zjišťovat.

Náš příklad uděláme velmi jednoduše. Na formulář umístěte OpenDialog, pomocí kterého vybereme příslušný soubor, jehož vlastníka chceme znát. Dialog vyvoláme stiskem tlačítka, takže jej rovněž přidejte na formulář. A to je vlastně vše. Zavoláme příslušnou funkci, jejímž vstupním parametrem je jméno souboru a na výstupu se nám vrátí jméno uživatele a doména. Výsledek se pak zobrazí v jednoduchém ShowMessage dialogu.

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetFileOwner(const FileName: string; var Domain, Username: string): Boolean;
var
  SecDescr: PSecurityDescriptor;
  SizeNeeded, SizeNeeded2: DWORD;
  OwnerSID: PSID;
  OwnerDefault: BOOL;
  OwnerName, DomainName: PChar;
  OwnerType: SID_NAME_USE;
begin
  GetFileOwner := False;
  GetMem(SecDescr, 1024);
  GetMem(OwnerSID, SizeOf(PSID));
  GetMem(OwnerName, 1024);
  GetMem(DomainName, 1024);
  try
    if not GetFileSecurity(PChar(FileName), OWNER_SECURITY_INFORMATION, SecDescr, 1024, SizeNeeded) then Exit;
    if not GetSecurityDescriptorOwner(SecDescr, OwnerSID, OwnerDefault) then Exit;
    SizeNeeded := 1024;
    SizeNeeded2 := 1024;
    if not LookupAccountSID(nil, OwnerSID, OwnerName, SizeNeeded, DomainName, SizeNeeded2, OwnerType) then Exit;
    Domain := DomainName;
    Username := OwnerName;
  finally
    FreeMem(SecDescr);
    FreeMem(OwnerName);
    FreeMem(DomainName);
  end;
  GetFileOwner := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Domain, Username: string;
begin
  OpenDialog1.Execute;
  if OpenDialog1.FileName <> `` then
      if GetFileOwner(`soubor.txt`, Domain, Username) then ShowMessage(Username + `@` + Domain)
      else ShowMessage(`Vlastníka nelze zjistit!`);
end;

end.

Parametrem funkce může být pochopitelně libovolný soubor, takže textovým souborem použitým v našem příkladu se nedejte zmást. V případě neúspěchu funkce vrací false.

Na závěr jedna důležitá poznámka, která možná patří spíše na začátek dnešního příkladu. Tento tip bude fungovat samozřejmě pouze na systémech generace NT, neboť starší řada 9x (souborový systém) tyto informace neukládá.

Diskuze (4) Další článek: DirectX verze 9.1 již v březnu

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

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


Aktuální číslo časopisu Computer

Zachraňte nefunkční Windows

Jak nakupovat a prodávat kryptoměny

Otestovali jsme konvertibilní notebooky

Velký test 14 herních myší