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

5 windows winapi appdata visual-c++

我有一个应用程序需要在用户的%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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

更新

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

Mic*_*ade 0

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

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