我正在使用NetUserAdd添加一个新的pipe理员。 但是我收到了一个我无法弄清楚的错误。
失败方法返回的错误是:
NET_API_STATUS: 87 PARAM_ERR: 5
NET_API_STATUS
的值是87
,这是ERROR_INVALID_PARAMETER
。 我相信5
是参数5.哪个是我感到困惑。 什么参数? 我的结构与文档中的结构相同,所以这个失败在哪里?
这是失败的方法。
bool CreateAdminUser(wchar_t *username, wchar_t *password) { _USER_INFO_1 ui; DWORD dwLevel = 1; DWORD dwError = 0; NET_API_STATUS = nStatus; ui.usri1_name = username; ui.usri1_password = password; ui.usri1_priv = USER_PRIV_ADMIN; ui.usri1_home_dir = NULL; ui.usri1_comment = NULL; ui.usri1_flags = UF_SCRIPT; ui.usri1_script_path = NULL; nStatus = NetUserAdd(NULL, dwLevel, (LPBYTE) &ui, &dwError); if(nStatus != NERR_Success) { printf("NET_API_STATUS: %s\nPARAM_ERR: %d\n", nStatus, dwError); return false; } return true; }
我正在运行可执行文件作为pipe理员通过运行。
编辑
我将USER_PRIV_ADMIN
更改为USER_PRIV_USER
,并工作。 但是,为什么我无法创buildpipe理员用户? 我有pipe理员权限。 我已经使用“运行方式”进行了修改,并通过UAC(包含在清单中)请求了权限。
useri1.priv
成员是只读的。 (我怀疑它只存在于旧的基于DOS的LAN管理器的早期版本的兼容性,我认为它确实确实通过帐户上的标志确定管理员权限,而不是通过组成员资格。)
无论如何,它是只读的事实记录在USER_INFO_1下 :
分配给usri1_name成员的特权级别。 当您调用NetUserAdd函数时,该成员必须是USER_PRIV_USER。 当您调用NetUserSetInfo函数时,此成员必须是由NetUserGetInfo函数或NetUserEnum函数返回的值。
创建新管理用户的正确方法是首先创建没有管理员权限的用户,然后调用NetLocalGroupAddMembers将用户添加到管理员组。 (或者在域环境中,您可以使用NetGroupAddUser将用户添加到域管理员组或在您的域中已被授予管理员权限的其他组)。