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;