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 文件的路径。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 下,但该节点显示为空,因此没有可用的子节点。这怎么可能发生?这个问题快把我逼疯了。

4

1 回答 1

0

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

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

于 2012-05-10T05:20:45.463 回答