Windows 64和UAC上的FileExists - 任何新的解决方案?

Guy*_*ush 0 delphi delphi-7

我使用Windows 64位与UAC,需要检查Windows系统文件夹中是否存在文件,而不提升权限.已经在过去6小时内搜索解决方案,但没有成功...... :(

根据这个问题,FileExists()返回false,即使文件存在,我也可以使用Wow64DisableWow64FsRedirection(),但我在许多其他地方看到它不推荐.

现在我正在尝试使用特殊的"Sysnative"别名,但是当使用FileExists功能时,它不起作用(例如:如果fileexists('C:\ Windows\Sysnative\dfrgui.exe')则...)

拜托,有人可以帮我吗?也许是汇编(Asm)解决方案?

谢谢!

who*_*ddy 6

Sysnative应该起作用并且是最合适的解决方案.

从MSDN引用:

32位应用程序可以通过%windir%\ Sysnative替换%windir%\ System32来访问本机系统目录.WOW64将Sysnative识别为一个特殊别名,用于指示文件系统不应重定向访问.这种机制灵活且易于使用,因此,它是推荐的绕过文件系统重定向的机制.请注意,64位应用程序无法使用Sysnative别名,因为它是虚拟目录而不是真实目录.

小型演示(Delphi XE - W7 x64):

program SO22990909;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
 STR_SYSNATIVEPATH = 'c:\windows\sysnative\';
 STR_SYSTEM32PATH = 'c:\windows\system32\';
 STR_DETECTFILE = 'wups2.dll';

procedure CheckFile(Filename : String);
begin
 if FileExists(Filename) then
   Writeln(Format('file %s found', [Filename]))
  else
   Writeln(Format('file %s not found', [Filename]));
end;


begin
  try
   CheckFile(STR_SYSTEM32PATH+STR_DETECTFILE);
   CheckFile(STR_SYSNATIVEPATH+STR_DETECTFILE);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
 ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

程序输出(文件仅存在于c:\ windows\system32中):

程序输出:

使用文件dfrgui.exe(文件存在于c:\ windows\system32和c:\ windows\syswow64中):

dfrgui