首页 > 解决方案 > 将创建的 Windows 用户添加到组时遇到问题

问题描述

我正在使用以下库 Lmaccess.h 库 netapi32.lib

所以我试图通过 Windows 桌面应用程序以编程方式创建用户。我可以使用 netUserAdd 调用创建一个本地用户。

USER_INFO_1 ui1_userInfo;
USER_INFO_2 ui2_userInfo;
DWORD dwLevel = 2;
//DWORD dwLevel = 1;
DWORD dwError = 0;
NET_API_STATUS nStatus;

String sServerName = NULL;
if (edit_Server->Text.Trim() != "")
{
    sServerName = edit_Server->Text.Trim();
}

populateUserInfo(ui2_userInfo);
//populateUserInfo(ui1_userInfo);
try
{
    nStatus = NetUserAdd(sServerName.c_str(), dwLevel, (LPBYTE)&ui2_userInfo, &dwError );
    //nStatus = NetUserAdd(sServerName.c_str(), dwLevel, (LPBYTE)&ui1_userInfo, &dwError );
    printStatusResult(nStatus, dwError);
}
catch (...)      //Non Delphi Exception
{
    ShowMessage("BOOM");
    //return;
}

问题是当我尝试使用 NetUserGetGroups 将用户添加到组时,我得到一个 2220,即未找到组。

NET_API_STATUS nStatus;
DWORD dwError = 1;
String sGroup = "Power Users";
String sServerName = edit_Server->Text.Trim();

nStatus = NetGroupAddUser(sServerName.c_str(), sGroup.c_str(), edit_Username->Text.c_str());
//nStatus = NetLocalGroupAddMembers(sServerName.c_str(), sGroup.c_str(), 3, (LPBYTE)&ui2_userInfo
printStatusResult(nStatus, dwError); 

我退后一步,决定尝试使用我没有以编程方式创建的用户。我还调用了 NetUserGetGroups

//Does work
sServerName = "vm-Win7Pro32";
String sUserName= "myUser";
DWORD dlevel = 0;
LPGROUP_USERS_INFO_0 hiME = NULL;
DWORD perfmaxlen = MAX_PREFERRED_LENGTH;
DWORD entriesread;
DWORD totalentries;
PDWORD_PTR resume_handle = NULL;
nStatus = NetUserGetGroups(sServerName.c_str(), sUserName.c_str(), dlevel, (LPBYTE*) &hiME, perfmaxlen, &entriesread, &totalentries);

if (nStatus != NERR_Success)
{
    printStatusResult(nStatus, NULL);
}
else
{
    ShowMessage(hiME->grui0_name);
}

即使用户在一个组中,这个人也总是返回成功并将 None 显示为我的组。(至少它应该在用户组中。)

我在这里缺少什么。我应该调用一个不同的函数吗?

参考 添加用户 https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/ns-lmaccess-user_info_2 https://docs.microsoft.com/en-us/windows/win32/api/ lmaccess/nf-lmaccess-netuseradd?redirectedfrom=MSDN

NetGroupAddUser https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netgroupadduser

NetUserGetGroups https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netusergetgroups

标签: c++windows

解决方案


应该使用 netlocalgroupaddmembers

//
//NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers(
//  LPCWSTR servername,
//  LPCWSTR groupname,
//  DWORD   level,
//  LPBYTE  buf,
//  DWORD   totalentries
//);
dlevel = 3;
LOCALGROUP_MEMBERS_INFO_3 why;
String sDomainAndUser = sServerName + "\\\\" + sUserName;
why.lgrmi3_domainandname = sDomainAndUser.c_str();
nStatus = NetLocalGroupAddMembers(sServerName.c_str(), sGroup.c_str(), dlevel, (LPBYTE) &why, 1);

推荐阅读