C ++ - 将图像复制到System32

时间:2017-06-16 06:28:33

标签: windows c++-cli

我正在编写一个程序,在C ++ / CLI中更改Windows 7上的锁屏背景。 (我知道这是一个坏主意,但此刻我不能这样做。)它需要一个名为backgroundDefault.jpg的图像,并在修改相应的注册表后将其复制到C:\ Windows \ System32 \ oobe \ info \ backgrounds键和创建必要的文件夹。

问题在于,当我启动此代码时,它不会被复制:oobe \ info \ backgrounds为空。我先批量使用它,效果很好。在C ++中,这是另一个故事。我尝试了五种不同的方式,但它们都不起作用。

system("xcopy xcopy backgroundDefault.jpg %windir%\\System32\\oobe\\info\\backgrounds\\ /Y >nul");

在调试中检查命令提示符上的日志:我得到确认它有效但没有任何反应。

我尝试将此命令放在批处理文件中并运行它。我得到了确认,但实际上没有发生任何事情。

system("theme_ls_copy.bat");

(我也试图尽可能远离system()命令。)

我也尝试过使用CopyFile(),但效果不佳。

CopyFile(L"backgroundDefault.jpg", L"C:\\Windows\\System32\\oobe\\info\\backgrounds\\backgroundDefault.jpg", 0);

我也尝试ShellExectue(),但没有任何成功,因为它给了我一个LNK错误。

ShellExecuteA(GetDesktopWindow(),L"open", L"theme_ls_copy.bat", NULL, NULL, SW_SHOW);

即使CreateProcess()也无济于事。

STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
if (CreateProcess(L"theme_ls_copy.bat", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) {
    WaitForSingleObject(processInfo.hProcess, INFINITE);
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
}

我该怎么办?

1 个答案:

答案 0 :(得分:0)

您的程序没有写入System32目录所需的权限 - 这是设计的 - 想象如果任何程序只能访问和替换受保护系统目录中的文件会发生什么......

也就是说,有几种方法可以尝试执行此操作,首先需要获取管理权限,例如通过embedded application manifest或使用带有ShellExecute参数的runas - 示例here

使用管理权限运行不会自动授予您访问所有内容的权限 - 但是允许您请求设置某些权限。您可以尝试使用AdjustTokenPrivileges函数获取授予

SE_RESTORE_NAME (SeRestorePrivilege)权限
  

[Microsoft] ...将访问控制写入任何文件,而不管为文件指定的ACL

获取SE_RESTORE_NAME权限可能涉及以下工作流程 - 以管理员组成员的身份授予(或启动)您的流程,使用LookupPrivilegeValue查找权限的luid然后使用获得的luid启用(SE_PRIVILEGE_ENABLED)进程,该进程需要对目录的写访问权限 - 例如here

您的里程可能会有所不同,但这可以帮助您到达那里;)