gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:42:57 25 4
gpt4 key购买 nike

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

properties

我有一个函数可以获取如下文件属性:

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;

...这对于这个 CompanyName 属性效果很好,但我不知道如何获取所有者。

此外,当我尝试对没有文件版本号的文件使用相同的方法时,GetFileVersionInfoSize不起作用,这是有道理的,因为该文件根本没有版本号。

是否有 GetFileVersionInfoSize 的替代方法,或者获取文件所有者的其他方法?我不太习惯 Windows api,所以我真的不知道这是否是实现我想要的(获取所有者名称)的正确方法。

最佳答案

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

所有权关系到文件的安全,因此需要使用GetFileSecurity()GetNamedSecurityInfo()相反,如果您有文件名,或 GetUserObjectSecurity()如果您有该文件的打开句柄。

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

关于Delphi 2009 - 获取文件的所有者名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com