【问题标题】:How to return the path from ExpandUNCFileName funtion of mapped drive?如何从映射驱动器的 ExpandING FileName 函数返回路径?
【发布时间】:2017-04-24 17:06:17
【问题描述】:

我使用的是 Delphi 5。我最初在从网络映射驱动器复制文件时遇到问题。如果我使用 UNC 路径,我可以复制文件。问题是我不会总是知道 UNC 路径。我正在使用 Windows 10、64 位。有没有可以让我获得 UNC 路径的解决方案?每次我使用 ExpandUNCFileName 函数时,它都会返回路径 N:\tmp\file1.mdb 而不是 \hermes\apps\tmp\file1.mdb。如果我在 XP 或 Windows 7 上运行代码,它会正确返回 UNC 路径,但是当我在 Windows 10 上运行它时,它会失败并给我带有驱动器号的路径。

我想要做的是运行一个更新数据库文件的安装程序。为了让它工作,我需要在本地复制数据库文件。现在问题发生在我第一次启动更新程序 exe 时,我的 windows 10 强制程序以管理员身份运行。一旦我运行 exe,它就会启动管理员登录。它仅在 Windows 10 上执行此操作。对于 Windows 7,XP 不会要求或强制它以管理员身份运行。

如果可以的话请帮忙,谢谢。

【问题讨论】:

  • 有没有一种方法可以绕过 Windows 提升我的应用程序以管理员身份运行?

标签: delphi windows-10


【解决方案1】:

ExpandUNCFileName 工作正常。如果您从映射了驱动器号的上下文中调用该函数,那么它将返回所需的 UNC 名称。

因此,问题一定是当您调用该函数时,驱动器未映射。造成这种情况的常见原因是您的代码在服务中执行,或者在未映射驱动器的用户帐户下执行,但还有其他原因。

从这里不清楚如何解决您的问题。您可以通过确保始终映射驱动器号来解决它。但是,正如您所发现的那样,这是一种潜在的脆弱方法。

也许更可靠的方法是仅使用 UNC 名称进行操作。这毕竟是他们存在的理由。因此,当用户为您提供网络目录或文件的路径时,请将其转换为 UNC 名称。从那时起使用该 UNC 名称。

如果您不希望您的程序被提升,那么您需要给它一个应用程序清单,或者更改它的名称。没有应用程序清单且名称如更新或补丁的可执行文件由支持 UAC 的 Windows 版本提升。 UAC 是在 12 年前推出的,也许是时候让您了解其对开发人员的影响了。尤其是因为您的旧 Delphi 5 开发环境早于 UAC,因此不会为您生成和链接清单。

【讨论】:

  • 驱动器号已映射。问题是当 Windows 10 将用户提升为管理员时,我无法使用 ExpandUNCFileName。无论出于何种原因,当用户运行我的应用程序窗口时,它都会强制它以管理员身份运行。有人告诉我,您必须使用创建驱动器映射的同一用户运行该应用程序。有没有办法绕过 Windows 提升我的应用程序以管理员身份运行?
  • 显然驱动器没有映射到代码执行的上下文中。我就是这么说的。
  • 如果我将程序名称更改为 Program1,它仍然希望以管理员身份运行。不确定您所说的应用程序清单是什么意思。
  • 事实仍然是驱动器没有映射到执行它的代码的上下文中。可能与海拔有关。如果您的应用程序不需要提升,那么它真的不应该。我为你指路。使用 UNC 名称就没有那么脆弱了。如果您可以使用它们,请这样做。您还需要了解 UAC。现在是一项相当古老的技术。在 MSDN 上阅读它。这里没有捷径。您将需要时间来了解这一点。不要期望避免这种情况。
  • 应用程序清单是 Windows 开发的一个有据可查的部分。在 MSDN 上。它不是复制该文档的地方。你需要在这里做一些研究。你显然很沮丧。但请不要把它拿在那些帮助的人身上。我知道你想要一个快速修复,但没有。你必须花时间学习和理解 UAC。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多