我得到了某个注册表项(由我们的软件创建),需要在每个本地用户帐户上删除某个注册表项。 因此,我尝试加载用户配置单元,然后使用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文件的路径。用户名是本地用户帐户名称。 所以蜂巢应在HKEY_USERS \用户名被加载:
(...)
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加载“HKU \ username”...)时,我可以在regedit.exe中的HKEY_USERS下看到节点“用户名”。所有子节点都加载在该节点下。 当我在RegLoadKey之后暂停我的程序时,节点“username”也显示在HKEY_USERS下,但节点可视化为空,所以没有子节点可用。 这是怎么发生的?这个问题使我疯狂。
您是否试过\\ Software \\ Wow6432Node \\ XYZ? – PhilMY
这是一个32位系统,忘记提及。抱歉。 – mbue
我写了一个小助手EXE来做到这一点(从所有配置文件中删除键),但它有很多硬编码的信息。如果没有其他人提供解决方案,我可以将其清理并在今晚晚些时候发布)。 –