본문 바로가기

카테고리 없음

[시스템] 파일의 소유자와 도메인 구하기2

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

function UseToString(Use: SID_NAME_USE): string;
begin
  case Use of
    SidTypeUser: Result   := 'user';
    SidTypeGroup: Result  := 'group';
    SidTypeDomain: Result := 'domain';
    SidTypeAlias: Result  := 'alias';
    SidTypeWellKnownGroup: Result := 'well-known group';
    SidTypeDeletedAccount: Result := 'deleted account';
    SidTypeInvalid: Result := 'invalid';
    SidTypeUnknown: Result := 'unknown';
    //SidTypeComputer: Result := 'computer';
  else
    Result := 'unknown';
  end;
end;

function LookupAccountBySid(Sid: PSID): string;
var
  Name, RefDomain: string;
  NameSize, RefDomainSize: DWORD;
  Use: SID_NAME_USE;
begin
  NameSize := 0;
  RefDomainSize := 0;
  LookupAccountSid(nil, Sid, nil, NameSize, nil, RefDomainSize, Use);
  SetLength(Name, NameSize);
  SetLength(RefDomain, RefDomainSize);
  LookupAccountSid(nil, Sid, PChar(Name), NameSize, PChar(RefDomain), RefDomainSize, Use);
  Result := PChar(RefDomain) + '/' + PChar(Name) + ' (' + UseToString(Use) + ')';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SD: PSecurityDescriptor;
  Owner: PSID;
begin
  if not OpenDialog1.Execute then
    Exit;
    
  if GetNamedSecurityInfo(PChar(OpenDialog1.FileName),
        SE_FILE_OBJECT,
        OWNER_SECURITY_INFORMATION, @Owner, nil, nil, nil,
        Pointer(SD)) = ERROR_SUCCESS then
  begin
    ShowMessage(LookupAccountBySid(Owner));
    LocalFree(Cardinal(SD));
  end;
end;

end.