在我成功创建一个新用户,将用户添加到内置admins组后,我想编辑新创建的用户的注册表(这个程序是一个提升为admin的程序)。我调用了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()
行。当我要求写入该用户的香港大学注册表时,它出错了。如果我只使用KEY_READ
这可能是我想要做的吗?用户的注册表单元是否已经创建?或者用户必须物理登录才能创建它?
最终我想做的是为新用户创建GPO
如果您已经用LoadUserProfile()
加载了用户配置文件,那么您实际上根本不需要使用RegOpenCurrentUser()
。您可以使用LoadUserProfile()
返回的PROFILEINFO
的hProfile
字段:
hProfile
类型:处理HKEY_CURRENT_USER注册表子树的句柄。
…
当LoadUserProfile调用成功返回时,hProfile成员接收到一个注册表键句柄打开到用户子树的根,以完全访问(KEY_ALL_ACCESS)打开。