C++ - 将图像复制到 System32
C++ - Copying an image to System32
我正在用 C++/CLI 编写一个程序来更改 Windows 7 上的锁屏背景。 (我知道这是个坏主意,但此时此刻我别无选择。)在修改相应的注册表项并创建必要的文件夹。
问题是当我启动这段代码时它没有被复制: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);
}
我应该尝试什么?
您的程序没有写入 System32 目录所需的权限 - 这是设计使然 - 想象一下如果任何程序可以访问和替换受保护的文件会发生什么系统目录....
就是说,您可以通过多种方式尝试这样做,您首先需要获得管理权限,例如通过 embedded application manifest, or using ShellExecute
with the runas
argument - example here。
运行 管理权限不会自动授予您访问所有内容的权限 - 它 会 但允许您请求设置某些权限。您可以尝试使用授予
的 AdjustTokenPrivileges
function to acquire the SE_RESTORE_NAME
(SeRestorePrivilege) 权限
[Microsoft]... write access control to any file, regardless of the ACL specified for the file
获取 SE_RESTORE_NAME
权限可能涉及以下工作流程 - 授予(或启动)您作为管理员组成员的进程,使用 [=22] 查找 luid
权限=].
您的里程数可能会有所不同,但这应该可以帮助您到达那里 ;)
我正在用 C++/CLI 编写一个程序来更改 Windows 7 上的锁屏背景。 (我知道这是个坏主意,但此时此刻我别无选择。)在修改相应的注册表项并创建必要的文件夹。
问题是当我启动这段代码时它没有被复制: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);
}
我应该尝试什么?
您的程序没有写入 System32 目录所需的权限 - 这是设计使然 - 想象一下如果任何程序可以访问和替换受保护的文件会发生什么系统目录....
就是说,您可以通过多种方式尝试这样做,您首先需要获得管理权限,例如通过 embedded application manifest, or using ShellExecute
with the runas
argument - example here。
运行 管理权限不会自动授予您访问所有内容的权限 - 它 会 但允许您请求设置某些权限。您可以尝试使用授予
的AdjustTokenPrivileges
function to acquire the SE_RESTORE_NAME
(SeRestorePrivilege) 权限
[Microsoft]... write access control to any file, regardless of the ACL specified for the file
获取 SE_RESTORE_NAME
权限可能涉及以下工作流程 - 授予(或启动)您作为管理员组成员的进程,使用 [=22] 查找 luid
权限=].
您的里程数可能会有所不同,但这应该可以帮助您到达那里 ;)