gpt4 book ai didi

c++ - 通过服务启动进程后 SHGetKnownFolderPath 出现错误 0x80070005

转载 作者:行者123 更新时间:2023-11-30 02:19:37 24 4
gpt4 key购买 nike

我使用下面的代码获取 appdata 文件夹。通常它可以工作,但是如果我使用与 this 类似的方式通过服务启动相同的进程我收到错误 0x80070005,这意味着 Access Denied

HRESULT result;
if ((result = SHGetKnownFolderPath(
FOLDERID_RoamingAppData,
NULL,
NULL,
&appdate)) != S_OK)
{
std::cout << result << std::endl

return false;
}

创建进程的函数是

if (!CreateProcessAsUser(
token,
executablePath,
executableName,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
0,
&startupInfo,
&processInformation))
{
SHOW_SERVICE_ERROR;
}

我还没有在互联网上找到与此相关的任何内容。谁能帮忙?

最佳答案

您的错误是您没有将 lpEnvironment 参数传递给 CreateProcess 调用。

lpEnvironment [in, optional]

A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process.

结果子进程使用调用进程的环境。这对 FOLDERID_RoamingAppData 有什么影响?在解析 FOLDERID_RoamingAppData 期间 - 我们通常得到 %USERPROFILE%\AppData\Roaming - 最终结果将取决于 %USERPROFILE% 的值。在您的情况下 - 它将继承自服务 (LocalSystem) 并且看起来像 C:\WINDOWS\system32\config\systemprofile - 所以最终路径必须像 C:\WINDOWS\system32\config\systemprofile\AppData\Roaming。在将此路径返回给调用者之前 - 系统检查路径是否存在 - 调用 GetFileAttributes。在这里它失败了(由于安全许可) - 最后一个错误 - 5 - ERROR_ACCESS_DENIED。 api 最终返回 HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED),即 80070005

结论 - 在调用 CreateProcessAsUser 时使用指向由 CreateEnvironmentBlock 返回的环境 block 的指针.稍后通过 DestroyEnvironmentBlock 释放此 block .也不要忘记 CREATE_UNICODE_ENVIRONMENT 标志在调用 CreateProcessAsUser

您的错误也可以很容易地通过下一个代码在本地(未提升)过程中重现:

SetEnvironmentVariableW(L"USERPROFILE", L"C:\\WINDOWS\\system32\\config\\systemprofile");
PWSTR appdate;
HRESULT result;
if ((result = SHGetKnownFolderPath(
FOLDERID_RoamingAppData,
NULL,
NULL,
&appdate)) == S_OK)
{
CoTaskMemFree(appdate);
}

如果我们将在 USERPROFILE 中设置无效路径 - 我们会收到 80070003 错误 - HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)

关于c++ - 通过服务启动进程后 SHGetKnownFolderPath 出现错误 0x80070005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com