应用程序无法写入%APPDATA%(但用户可以)

时间:2012-04-22 11:12:06

标签: windows winapi visual-c++ appdata

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

1 个答案:

答案 0 :(得分:0)

Windows具有用于更改安全上下文的不同(和大)功能集。有些人请参见here

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