Delphi 2009 - 获取文件的所有者名称

Ali*_*son 3 delphi winapi delphi-2009

如何在Delphi 2009中获取文件的所有者?

性能

我有一个函数,它获取这样的文件属性:

type
  TCustomFileInfo= record
    CompanyName,
    Owner,
    SpecialBuild: string;
    procedure Clear;
  end;

function GetFileInfo(const FileName: string): TCustomFileInfo;
type
  PLandCodepage = ^TLandCodepage;
  TLandCodepage = record
    wLanguage,
    wCodePage: word;
  end;
var
  dummy,
  len: cardinal;
  buf, pntr: pointer;
  lang: string;
begin
  len := GetFileVersionInfoSize(PChar(FileName), dummy);
  if len = 0 then
    RaiseLastOSError;
  GetMem(buf, len);
  try
    if not GetFileVersionInfo(PChar(FileName), 0, len, buf) then
      RaiseLastOSError;

    if not VerQueryValue(buf, '\VarFileInfo\Translation\', pntr, len) then
      RaiseLastOSError;

    lang := Format('%.4x%.4x', [PLandCodepage(pntr)^.wLanguage, PLandCodepage(pntr)^.wCodePage]);

    // Get Company's name, if available...
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\CompanyName'), pntr, len){ and (@len <> nil)} then
      result.CompanyName := PChar(pntr);
  finally
    FreeMem(buf);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

...适用于此CompanyName属性,但我不知道如何获取所有者.

此外,当我尝试使用同样的方法,一个文件没有一个文件的版本号,GetFileVersionInfoSize没有工作,这是有道理的,因为该文件没有版本号都没有.

是否有另一种方法GetFileVersionInfoSize或其他方式来获取文件的所有者?我不太熟悉windows apis,所以我真的不知道这是否是实现我想要的正确方法(获得所有者的名字).

Rem*_*eau 7

有关文件所有权的信息未存储在版本资源中,因此您无法使用VerQueryValue()它来访问它.

所有权与文件的安全性有关,因此如果您有文件名,或者如果您有文件的打开句柄,则需要使用GetFileSecurity()GetNamedSecurityInfo()代替GetUserObjectSecurity().

无论哪种方式,您都会提供一个SECURITY_INFORMATION值作为输入,指定要检索的信息类型.在这种情况下,您将使用OWNER_SECURITY_INFORMATION请求文件所有者的SID.如果成功,您可以使用LookupAccountSid()或WMI获取所有者的姓名.