我有一个特定的注册表项(由我们的软件创建),有时需要在每个本地用户帐户上删除它。因此,我尝试加载用户配置单元,然后使用 SHDeleteKey(因为密钥不为空)来完成工作。但是,SHDeleteKey 始终返回 LSTATUS 2 (ERROR_FILE_NOT_FOUND)。
每个用户的注册表项放在 HKCU\Software\XYZ 下
首先,我在我的代码中设置了所需的权限,这似乎有效(返回 val 为 TRUE):
(...)
HANDLE th;
LUID rsto;
LUID bckp;
TOKEN_PRIVILEGES tp;
TOKEN_PRIVILEGES tp2;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &th);
LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &rsto);
LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &bckp);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid = rsto;
tp2.PrivilegeCount = 1;
tp2.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tp2.Privileges[0].Luid = bckp;
BOOL p = AdjustTokenPrivileges(th, 0, &tp, 1024, 0, 0);
BOOL p2 = AdjustTokenPrivileges(th, 0, &tp2, 1024, 0, 0);
(...)
然后我使用 RegloadKey 加载用户配置单元。std::string 连接包含相应 ntuser.dat 文件的路径。username 是本地用户帐户名。所以 hive 应该在 HKEY_USERS\username 下加载:
(...)
DWORD result = RegLoadKey(HKEY_USERS, username.c_str(), connection.c_str());
return result == ERROR_SUCCESS;
(...)
现在,我尝试删除:
(...)
k = username + "\\Software\\XYZ";
result = SHDeleteKey(HKEY_USERS, k.c_str());
现在结果的值为 2。但密钥存在。
我究竟做错了什么?先感谢您...
更新信息:我意识到问题需要在 RegLoadKey 的某个地方。当我通过命令行加载配置单元时(REG.exe load "HKU\username" ...),我可以在 regedit.exe 中的 HKEY_USERS 下看到节点“username”。所有子节点都加载到该节点下。当我在 RegLoadKey 之后暂停我的程序时,节点“用户名”也显示在 HKEY_USERS 下,但该节点显示为空,因此没有可用的子节点。这怎么可能发生?这个问题快把我逼疯了。