5

我有一个应用程序需要在用户的 %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,这似乎也是一个令人满意的位置。

4

1 回答 1

0

Windows 有一组不同的(和大量的)用于更改安全上下文的函数。看这里一些。

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

于 2012-04-22T11:40:12.917 回答