我正在尝试使用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/

10-09 03:52