Como obter o domínio e o dono do arquivo

 

Adicione em um formulário, três Edits (“edtFileName”, “edtDomain” e “edtOwner”), um OpenDialog e um Button. Implemente a função GetFileOwner conforme o código a seguir:

 

function GetFileOwner(FileName: string; var Domain, Username: string): Boolean;

var

  SecDescr: PSecurityDescriptor;

  SizeNeeded, SizeNeeded2: DWORD;

  OwnerSID: PSID;

  OwnerDefault: BOOL;

  OwnerName, Group: PChar;

  OwnerType: SID_NAME_USE;

begin

  { alocar e inicializar }

  GetMem(SecDescr, 255);

  GetMem(OwnerSID, SizeOf(PSID));

  GetMem(OwnerName, 255);

  GetMem(Group, 255);

  try

    { Temos permissao para obter informacoes? }

    Result := GetFileSecurity( PChar(FileName),

      OWNER_SECURITY_INFORMATION, SecDescr, 255, SizeNeeded );

    if Result then

    begin

      { Obtendo o dono e o descritor de segurança }

      Result := GetSecurityDescriptorOwner(SecDescr, OwnerSID, OwnerDefault);

      if Result then

      begin

        SizeNeeded  := 255;

        SizeNeeded2 := 255;

        { Obtendo as informacoes de usuario e dominio via o SID.

          O primeiro parametro eh lpSystemName, o qual pode ser um sistema local ou remoto.}

        Result := LookupAccountSID(nil, OwnerSID, OwnerName, SizeNeeded,

          Group, SizeNeeded2, OwnerType );

        if Result then

        begin

          Domain := Group;

          Username := OwnerName;

        end;

      end;

    end;

 

    if not Result then

      RaiseLastOSError;

  finally

    FreeMem(Group);

    FreeMem(OwnerName);

    OwnerSID := nil;

    FreeMem(SecDescr);

  end;

end;

 

No evento OnClick do botão, adicione o seguinte código:

 

procedure TForm1.btOpenClick(Sender: TObject);

var

  Domain, Username: string;

begin

  if not OpenDialog1.Execute then

    Exit;

  if GetFileOwner(OpenDialog1.FileName, Domain, Username) then

  begin

    edtFileName.Text := OpenDialog1.FileName;

    edtDomain.Text := Domain;

    edtOwner.Text := Username;

  end

  else

  begin

    ShowMessage(Format('Impossível obter as informações do arquivo para: %s ',

      [OpenDialog1.FileName]));

  end;

end;