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,所以我真的不知道这是否是实现我想要的正确方法(获得所有者的名字).
有关文件所有权的信息未存储在版本资源中,因此您无法使用VerQueryValue()它来访问它.
所有权与文件的安全性有关,因此如果您有文件名,或者如果您有文件的打开句柄,则需要使用GetFileSecurity()或GetNamedSecurityInfo()代替GetUserObjectSecurity().
无论哪种方式,您都会提供一个SECURITY_INFORMATION值作为输入,指定要检索的信息类型.在这种情况下,您将使用OWNER_SECURITY_INFORMATION请求文件所有者的SID.如果成功,您可以使用LookupAccountSid()或WMI获取所有者的姓名.
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |