新创建用户的 RegOpenCurrentUser(KEY_WRITE)

RegOpenCurrentUser(KEY_WRITE) on newly created user

成功创建新用户后,将用户添加到内置管理员组,我想编辑新创建的用户的注册表(该程序是一个提升为管理员的程序)。我调用了 NetUserAdd()NetLocalGroupAddMembers()LogonUser(),然后,最后 LoadUserProfile() 所以用户的目录存在。

请原谅草率的代码,但这就是我之后所做的:

DuplicateTokenEx(hToken,TOKEN_ALL_ACCESS,&sa,SecurityImpersonation,TokenPrimary,&hNewToken);
ImpersonateLoggedOnUser(hNewToken);

HKEY hKey;
LSTATUS stat = RegOpenCurrentUser(KEY_READ|KEY_WRITE, &hKey);
// stat is 5 (ACCESS_DENIED) when KEY_WRITE is added, it
// returns 0 (ERROR_SUCCESS) when it's just KEY_READ

RegCloseKey(hKey);
RevertToSelf();

CloseHandle(hNewToken);

错误在 RegOpenCurrentUser() 行。当我要求写入该用户的 HKU 注册表时出错。如果我只使用 KEY_READ

,它工作得很好

这甚至可能是我想要做的吗?用户的注册表配置单元是否已经创建?还是用户必须亲自登录才能创建它?

最终我想做的是为新用户创建 GPO。

如果您已经使用 LoadUserProfile() 加载了用户配置文件,则根本不需要使用 RegOpenCurrentUser()。您可以改为使用 PROFILEINFOhProfile 字段,即 LoadUserProfile() returns:

hProfile
Type: HANDLE

A handle to the HKEY_CURRENT_USER registry subtree.

...

When the LoadUserProfile call returns successfully, the hProfile member receives a registry key handle opened to the root of the user's subtree, opened with full access (KEY_ALL_ACCESS).