如何使用UAC在Vista中获取文件的实际路径?

时间:2009-01-05 16:18:13

标签: windows-vista path uac createfile

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

我有一个Vista用户,CreateFile()返回错误5(拒绝访问)。如果我知道CreateFile()实际上是在尝试创建文件,那么我们可以检查他的文件夹权限。 Vista(UAC)的问题是,它没有尝试在我传入的目录中创建文件。它也可能位于VirtualStore目录中。另一个混乱的来源是这个用户是德语,虽然SHGetSpecialFolderPath()返回“C:\ Program Data \ blah blah”作为路径,但我认为这实际上并不是路径所在。我认为德国Vista使用德语单词“Program Data”。我希望能够告诉用户“这是我们尝试创建文件的确切路径。请检查您对此文件夹的权限。”

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

3 个答案:

答案 0 :(得分:2)

启动进程监视器并观察它的作用: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

答案 1 :(得分:1)

如果使用UAC所使用的路径不是您想要的路径,则重定向有效。 要确保不会发生重定向,请在应用程序中添加manifest,向Vista表明您的应用程序已正确编码并了解访问限制(即,您不写入例如HKLM或程序文件夹如果您的应用不需要管理员权限运行)。

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

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

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

答案 2 :(得分:1)

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