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

时间:2014-04-10 14:25:22

标签: delphi delphi-7

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

根据这个问题FileExists() returns false, even if file exists,我可以使用Wow64DisableWow64FsRedirection(),但我在很多其他地方看到它不推荐。

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

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

谢谢!

2 个答案:

答案 0 :(得分: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.

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

program output:

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

dfrgui

答案 1 :(得分:1)

根据您的文件

的评论
c:\windows\syswow64\test\file.dll

这是在32位系统目录中。用

测试它的存在
FileExists('c:\windows\system32\test\file.dll')

仔细阅读MSDN documentation on WOW64 file system redirection,您将受益匪浅。