【问题标题】:How to get the actual path of a file in Vista with UAC?如何使用 UAC 在 Vista 中获取文件的实际路径?
【发布时间】:2009-01-05 16:18:13
【问题描述】:

我正在调用 CreateFile() 在 Program Data 目录中创建一个文件。我正在使用 SHGetSpecialFolderPath() 来获取目录名称。

我有一个使用 Vista 的用户,其 CreateFile() 返回错误 5(拒绝访问)。如果我知道 CreateFile() 实际尝试创建文件的位置会有所帮助,这样我们就可以检查他的文件夹权限。 Vista(UAC)的问题是,它没有尝试在我传入的目录中创建文件。它也可能在 VirtualStore 目录中。另一个令人困惑的原因是该用户是德国人,尽管 SHGetSpecialFolderPath() 返回“C:\Program Data\blah blah”作为路径,但我认为这实际上不是路径所在的位置。我认为 German Vista 使用德语单词来表示“程序数据”。我希望能够告诉用户“这是我们尝试创建文件的确切路径。检查您对该文件夹的权限。”

我知道您可以从打开的文件句柄中获取路径,但在这种情况下 CreateFile() 失败,所以我没有打开的句柄。如何让 Vista 告诉我它尝试创建文件的实际路径?

【问题讨论】:

  • 如果用户使用的是 Windows XP 并且是标准用户,会发生什么情况?那时CSIDL_COMMON_APPDATA 指向C:\Documents & Settings\All Users,你的CreateFile 也会失败。 (换句话说,失败不是特定于 Vista,而是特定于您的应用程序。您不应该写到您不应该写的地方)
  • 仅供参考:SHGetSpecialFolderPath 自 Windows 2000 以来已被弃用;请改用SHGetFolderPath。较新的应用程序可以使用SHGetKnownFolderPath

标签: windows-vista path uac createfile


【解决方案1】:

启动 Process Monitor 并观察它的作用: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

【讨论】:

  • 这很酷,我没想到。 Process Monitor 确实显示了“真实”目录。不幸的是,运行进程监视器可能超出了典型用户的处理能力。不过,好主意。
  • 我希望在我的程序中找到一种方法来做到这一点,但由于没有人有更好的答案,我想这是赢家。
【解决方案2】:

如果使用 UAC,使用的路径不是您想要的,那么重定向是有效的。 为确保不会发生重定向,请将manifest 添加到您的应用程序中,以向 Vista 表明您的应用程序已正确编码并了解访问限制(即,如果您的应用程序不需要管理员权限即可运行)。

但您的应用程序应该能够写入 APPDATA 文件夹(如果这是您真正使用的)。

确保您使用的是 CSIDL_APPDATA 而不是 CSIDL_COMMON_APPDATA(后者只能通过管理员权限访问)。

要找到真正的路径(您所期望的),告诉用户在资源管理器栏中输入 %APPDATA%(或点击 Windows+R,然后输入 %APPDATA%,回车)。这将打开该文件夹上的资源管理器。

【讨论】:

  • 我确实需要使用 CSIDL_COMMON_APPDATA 因为这个特定的文件需要被所有用户访问。但是 CSIDL_COMMON_APPDATA 不需要管理员权限。任何用户都可以对其进行写入,但您创建的任何文件都不能被其他用户读取,除非它是使用“允许所有人”访问权限创建的。
  • 不,CSIDL_COMMON_APPDATA 需要管理员权限。此位置通常由安装程序写入,而不是由应用程序本身写入。如果一个用户可以设置选项或更糟的是,替换另一个用户必须使用的二进制文件,这将是一个安全风险。
  • 来自msdn.microsoft.com/en-us/library/ms995853.aspx:CSIDL_COMMON_APPDATA 此文件夹应该用于非用户特定的应用程序数据。 [...]。默认情况下,此位置对于普通(非管理员、非电源)用户是只读的。
  • 您可以尝试改用 CSIDL_COMMON_DOCUMENTS。
  • MSDN:“如果应用程序要求普通用户对 CSIDL_COMMON_APPDATA 的应用程序特定子目录具有写访问权限,则应用程序必须在应用程序设置期间显式修改该子目录的安全性”。安装程序不是我写的,那一定是我们正在做的。
【解决方案3】:

我的理解是,Vista 使用 ProgramData 来写入试图写入 C:\Program Files 中的文件,但失败了,因为除非您以管理员身份运行应用程序,否则您无法在程序文件中写入。也许您应该尝试将文件保存到当前用户下的 AppData 文件夹中。

【讨论】:

  • 不完全是,“程序数据”文件夹返回一个所有用户都可以访问的文件夹(CSIDL_COMMON_APPDATA)。所有用户都需要访问这个特定的文件。我希望不是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2019-05-27
  • 2021-11-15
  • 1970-01-01
  • 2018-03-27
  • 2017-09-14
相关资源
最近更新 更多