Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 77. - Zjištění vlastníka (tvůrce) libovolného souboru na disku

Jan Šindelář - 12.2.2003

Zjištění vlastníka (tvůrce) libovolného souboru na disku

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á.