winapi - RegSaveKey 返回 ERROR_PRIVILEGE_NOT_HELD

标签 winapi

我正在尝试使用 RegSaveKey() API 将特定注册表项的内容保存到文件中:

HKEY key;
LRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\MyProduct", 0, KEY_ACCESS_ALL, &key);
result = RegSaveKey(key, L"c:\\temp\\saved.reg", NULL);

但是,RegSaveKey() 正在返回 ERROR_PRIVILEGE_NOT_HELD . SDK 文档说“调用进程必须启用 SE_BACKUP_NAME 权限”。该进程以本地管理员或服务的身份运行。

有任何想法吗?

最佳答案

尽管作为本地管理员或服务运行,您可能没有默认启用“备份”权限。在尝试保存注册表项之前,您需要启用此权限。

MSDN 有一个关于如何在 C/C++ 中启用安全权限的好例子:http://msdn.microsoft.com/en-us/library/aa446619(VS.85).aspx .如果包含在该页面上定义的示例函数,则可以调用:

HANDLE ProcessToken;

if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &ProcessToken)) {

    SetPrivilege(ProcessToken, SE_BACKUP_NAME, TRUE);

    // Save reg key now...
    ...
}

或者,还有一个基于 VB 的示例 on the wayback machine .

关于winapi - RegSaveKey 返回 ERROR_PRIVILEGE_NOT_HELD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/381055/

相关文章:

visual-studio - MSBuild "The windows SDK version 10.0.19041.0 was not found",即使已安装

c++ - 设置 WH_KEYBOARD Hook 失败并出现错误 1428

winapi - 哪些原因会导致 ShellExecute 失败?

c# - 如何从通过 FtpCommand 运行的 FTP 命令获取结果?

c++ - 包含 windows.h 和 wingdi.h 时出现 "GradientFill was not declared in this scope"错误

c - 没有收到 WM_DISPLAYCHANGE

c++ - 使用 ListView_HitTest 检查具有扩展样式 LVS_EX_FULLROWSELECT 的 LVHT_ONITEMSTATEICON 标志的虚拟 ListView 出现不需要的复选框行为

c++ - 在 Node.js C++ 插件中,永远不会调用 SetWindowsHookEx 的回调

windows - 如何使用 Delphi 查找 Windows 用户(不是当前用户)的配置文件目录?

c - 需要帮助在控制台应用程序中使用 Windows API 在 C 中创建我自己的 getch() 函数