【问题标题】:Application cannot write into %APPDATA% (but user can)应用程序无法写入 %APPDATA%(但用户可以)
【发布时间】:2012-05-03 06:58:57
【问题描述】:

我有一个应用程序需要在用户的 %APPDATA% 目录中创建其设置目录。为此,它使用类似于以下的代码:

std::string appDataBase = getenv("APPDATA");
std::string appDir = appDataBase + "\\MyDir";

std::cerr << "About to invoke _mkdir(" << appDir << ")" << std::endl;
int rv = _mkdir(appDir.c_str());
std::cerr << "_mkdir returned " << rv << ", errno = " << errno << std::endl;

但是,当此代码运行时,_mkdir 调用失败并且errno 设置为EACCES

About to invoke _mkdir(C:\Users\mdm\AppData\Roaming\MyDir)
_mkdir returned -1, errno = 13

我会假设这是一个简单的权限问题,除了 (1) 我可以在资源管理器中手动创建目录而没有任何权限问题,以及 (2) 如果我将完全相同的代码复制到一个项目本身。

我已广泛搜索有关此问题的信息,但只能找到有关一般权限问题的讨论,例如用户无法使用资源管理器访问/写入此文件夹。如果我以管理员身份运行我的应用程序中的代码,它就可以工作,所以很明显它的权限有些奇怪,但我不知道还有什么要检查的。我已使用 Process Explorer 检查并确认该应用程序正在使用我的用户帐户运行,该用户帐户对 %APPDATA% 目录具有完全写入权限,并且我已确保 %APPDATA% 树未设置为隐藏或只读。

是否可以在 Windows 应用程序上设置某种“有效用户 ID”或“有效权限”,这可能取决于构建配置或进程初始化中的某些内容?是否有任何其他因素会阻止特定应用程序写入 %APPDATA% 而其他用户进程可以?

更新

进一步调查显示,行为差异与代码内容无关,而与文件系统中可执行文件的位置有关。我的应用程序是从我的用户目录中 Development 文件夹内的源代码树构建的,并且该目录中的可执行文件的 _mkdir 调用失败;但是,将 .exe 文件复制到新目录 C:\Development 可以使其正常工作(尽管移动现有的 Development 目录不会)。简单的测试程序在Documents\Visual Studio\Projects里面,这似乎也是一个令人满意的位置。

【问题讨论】:

  • “如果我将完全相同的代码单独复制到项目中,则可以正常工作” - 那么您可能正在对周围的代码做一些有趣的事情。不过真的猜不出是什么。
  • @Mat:这也是我的猜测——不幸的是,我在 Windows 上开发的经验很少,所以我不确定在周围的代码中寻找什么。
  • 作为调试措施,尝试使用进程监视器(搜索 MS 网站)仔细检查系统实际​​尝试创建的路径以及文件系统返回的错误代码。可能会发生某种重定向,尽管我不明白为什么会出现这种情况。
  • 听起来防病毒/间谍软件正在干扰这里。 Windows 本身没有任何“每个可执行位置权限”。
  • @HarryJohnston:我试过了,路径肯定是正确的,结果是拒绝访问。

标签: windows winapi visual-c++ appdata


【解决方案1】:

Windows 有一组不同的(和大量的)用于更改安全上下文的函数。请参阅here 了解一些信息。

也许包含该代码的项目正在改变安全上下文?例如,如果程序作为公共访问服务器运行,我希望它会调用ImpersonateAnonymousToken()

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 2021-11-03
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2018-02-22
    • 2011-07-04
    • 2011-10-25
    • 2018-11-29
    相关资源
    最近更新 更多