NetUserAdd - 权限问题,不正确的参数

时间:2015-12-26 21:01:28

标签: c++ windows winapi

我正在使用NetUserAdd添加新管理员。但我收到一个我无法弄清楚的错误。

失败方法返回的错误是:

NET_API_STATUS: 87
PARAM_ERR: 5

NET_API_STATUS的值87ERROR_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;
}

我通过Run As运行可执行文件作为管理员。

修改

我将USER_PRIV_ADMIN更改为USER_PRIV_USER并且有效。但为什么我无法创建管理员用户?我有管理员权限。我使用Run As进行了修改,并通过UAC请求权限,我已将其包含在Manifest中。

1 个答案:

答案 0 :(得分:2)

useri1.priv成员是只读的。 (我怀疑它只存在与旧的基于DOS的LAN Manager的早期版本的兼容性,我认为它确实通过帐户上的标志而不是组成员资格来确定管理员权限。)

无论如何,它是只读的事实是documented under USER_INFO_1

  

分配给usri1_name成员的权限级别。当您调用NetUserAdd函数时,此成员必须是USER_PRIV_USER。当您调用NetUserSetInfo函数时,此成员必须是NetUserGetInfo函数或NetUserEnum函数返回的值。

创建新管理用户的正确方法是首先创建没有管理员权限的用户,然后调用NetLocalGroupAddMembers将用户添加到Administrators组。 (或者在域环境中,您可以使用NetGroupAddUser将用户添加到Domain Admins组,或者在您的域中获得管理员权限的其他组。)