注册表:删除系统中每个本地用户的密钥

时间:2012-05-09 11:19:39

标签: c++ winapi registry

我得到了某个注册表项(由我们的软件创建),需要在某个时刻删除每个本地用户帐户。 因此,我尝试加载用户配置单元,然后使用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 connection包含相应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加载“HKU \用户名”...)时,我可以在regedit.exe中看到HKEY_USERS下的节点“用户名”。所有子节点都在该节点下加载。 当我在RegLoadKey之后暂停我的程序时,节点“username”也显示在HKEY_USERS下,但节点可视化为空,因此没有可用的子节点。 怎么会发生这种情况?这个问题让我疯狂。

1 个答案:

答案 0 :(得分:0)

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

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