【问题标题】:FileExists is false at network drives when UAC is used?使用 UAC 时,FileExists 在网络驱动器上是否为假?
【发布时间】:2014-05-07 17:03:34
【问题描述】:

我发现一个通过拖放接受文件的 CLI 工具存在以下问题。

文件 X:\MyApp.exe 是一个 CLI 工具,需要 UAC 提升(将被授予)。

操作系统是Win7 32位。

X:是 NAS 的网络驱动器。

当我将 X:\MyDLL.dll 拖入 X:\MyApp.exe 时, FileExists(ParamStr(1)) 将为 false。 RaiseLastOSError() 将显示代码 3。我做错了什么?

当源文件存储在 C:(并拖入 EXE 文件中)时,它确实有效。

WriteLn('ParamStr 1 = '+ParamStr(1)); // X:\MyDLL.dll
if not FileExists(ParamStr(1)) then
begin
  try
    RaiseLastOSError;
  except
    on E: exception do
    begin
      Writeln(E.message); // (Translated) System error 3. The file could not be found.
    end;
  end;
  exit;
end;

【问题讨论】:

  • 它在没有海拔的情况下工作吗?
  • 我认为驱动器在提升状态下没有被视为应用程序的映射。
  • 您使用的是哪个版本的 Delphi?根据版本,FileExists() 可能会尝试不同的方法来尝试解决不同类型路径的存在问题。另外,在 UAC 中提升应用程序时,您是使用相同的用户帐户,还是登录到不同的用户帐户?映射的驱动器号是特定于用户的,因此如果您以不同的用户身份升级,它甚至可能根本不知道 X: 驱动器。
  • 我使用 Delphi XE4 编译。提升是使用清单资源强制执行的。由于我已经登录了具有管理员权限的帐户(在 RDP 连接中),因此我只需在 UAC 对话框中单击“是”。由于用户相同,我假设网络驱动映射应该仍然存在?
  • @rinntech 不一定。映射驱动器是那些并不总是存在的东西之一。即使是同一个用户。例如,如果我有一个以特定用户登录的服务并尝试访问为同一用户映射但登录到桌面的驱动器,那么它将无法工作。

标签: delphi uac


【解决方案1】:

提升的应用程序确实可以看到用户的映射驱动器。这类似于在用户帐户下登录服务和用户使用相同用户帐户登录桌面。该服务将无法查看用户的映射驱动器。

解决这种情况的方法是创建一个以您需要的权限运行的服务,然后创建一个运行非提升权限的标准应用程序。应用程序向服务发送消息,以便它可以执行需要提升的操作。

【讨论】:

猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2010-09-14
  • 2016-02-12
  • 2011-02-14
  • 2015-02-09
相关资源
最近更新 更多