2012-05-09 53 views
0

我得到了某个注册表项(由我们的软件创建),需要在每个本地用户帐户上删除某个注册表项。 因此,我尝试加载用户配置单元,然后使用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下,但节点可视化为空,所以没有子节点可用。 这是怎么发生的?这个问题使我疯狂。

+0

您是否试过\\ Software \\ Wow6432Node \\ XYZ? – PhilMY

+0

这是一个32位系统,忘记提及。抱歉。 – mbue

+1

我写了一个小助手EXE来做到这一点(从所有配置文件中删除键),但它有很多硬编码的信息。如果没有其他人提供解决方案,我可以将其清理并在今晚晚些时候发布)。 –

回答

0

今天再看看我的代码,我刚才看到我加载了“ntuser.BAT”而不是“ntuser.DAT”(这两个文件都存在)。

我真的很抱歉,我浪费了你的时间。 : -/