新创建的用户上的RegOpenCurrentUser(KEY_WRITE)

时间:2016-10-24 01:00:35

标签: c winapi windows-authentication windows-security windows-process

成功创建新用户后,将用户添加到内置管理员组,我想编辑新创建的用户注册表(此程序是一个提升管理员程序)。我拨打了NetUserAdd()NetLocalGroupAddMembers()LogonUser(),然后是LoadUserProfile(),因此用户的目录已经存在。

请原谅邋code的代码,但这就是我之后正在做的事情:

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。

1 个答案:

答案 0 :(得分:1)

如果您已将用户个人资料加载LoadUserProfile(),则根本不需要使用RegOpenCurrentUser()。您可以使用hProfile返回PROFILEINFOLoadUserProfile()字段:

  

hProfile
  类型:手柄

     

HKEY_CURRENT_USER注册表子树的句柄。

     

...

     

当LoadUserProfile调用成功返回时,hProfile成员会收到一个注册表键句柄,该句柄键打开到用户子树的根目录,以完全访问权限(KEY_ALL_ACCESS)打开。