C++ 在Windows 7操作系统上创建和删除新用户帐户

C++ 在Windows 7操作系统上创建和删除新用户帐户,c++,windows,account,C++,Windows,Account,我想在我的代码中创建和删除新用户。我设法用“NetUser”类的“createUser()”函数创建了一个标准用户,但当我在创建标准用户的引用中设置选项时,它仍然创建为来宾帐户。有人知道我问题的原因吗 我正在使用以下代码: //userinfo structure: ui.usri1_name = username; ui.usri1_password = password; ui.usri1_priv = USER_PRIV_USER; ui.usri1_home_dir = NUL

我想在我的代码中创建和删除新用户。我设法用“NetUser”类的“createUser()”函数创建了一个标准用户,但当我在创建标准用户的引用中设置选项时,它仍然创建为来宾帐户。有人知道我问题的原因吗

我正在使用以下代码:

//userinfo structure:

 ui.usri1_name = username;
 ui.usri1_password = password;
 ui.usri1_priv = USER_PRIV_USER;
 ui.usri1_home_dir = NULL;
 ui.usri1_comment = NULL;
 ui.usri1_flags = UF_SCRIPT;
 ui.usri1_script_path = NULL;

//Creating user:

DWORD dwLevel = 1;
DWORD dwError = 0;
NET_API_STATUS nStatus;
nStatus = NetUserAdd(L"localhost",dwLevel,(LPBYTE)&ui,&dwError); 

这将创建一个新的用户帐户作为标准用户帐户,但它总是创建一个任务用户帐户。此函数正在凭据提供程序中运行,因此我认为问题不在于权限。有关NetUserAdd函数的详细信息。

您必须将用户添加到名为“用户”的本地组中。因此,您可以使用该函数


本地组用户的名称取决于安装的Windows版本的语言。为了获取本地组“用户”的名称,您可以使用(WinBuiltinUsersSid和WellKnownSidType)和。

以下是我在Windows中创建帐户的示例。如果要将此帐户添加到本地用户,以便登录当前计算机,则需要调用NetLocalGroupAddMembers函数。作为本地组名,您应该只键入“Users”,但它因Windows的语言版本而异。在波兰版本中,它将是“Użytkownicy”等。 如果要在远程服务器上添加帐户,则需要调用NetGetDCName,并使用ass first参数为其指定服务器地址。然后在本例中的其他功能中使用PDC。 请记住以管理员身份运行此代码(即使IDE处于调试状态),否则将出现拒绝访问错误

#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <lmcons.h>
#include <lmaccess.h>
#include <lmerr.h>
#include <lmapibuf.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "netapi32.lib")

NET_API_STATUS NetSample( LPWSTR lpszDomain,
                          LPWSTR lpszUser,
                          LPWSTR lpszPassword,
                          LPWSTR lpszLocalGroup )
{

    USER_INFO_1               user_info;
    LOCALGROUP_INFO_1         localgroup_info;
    LOCALGROUP_MEMBERS_INFO_3 localgroup_members;
    LPWSTR                    lpszPrimaryDC = NULL;
    NET_API_STATUS            err = 0;
    DWORD                     parm_err = 0;

// Get the name of the primary domain controller.
// Be sure to free the returned buffer.
// On local machine we don't need to do this

    //err = NetGetDCName( NULL,                    // local computer
    //               NULL,                   // domain name
    //               (LPBYTE *) &lpszPrimaryDC );  // returned PDC

    //if ( err != 0 )
    //{
    //    printf( "Error getting DC name: %d\n", err );
    //    return( err );
    //}

// Set up the USER_INFO_1 structure.

    user_info.usri1_name = lpszUser;
    user_info.usri1_password = lpszPassword;
    user_info.usri1_priv = USER_PRIV_USER;
    user_info.usri1_home_dir = TEXT("");
    user_info.usri1_comment = TEXT("");
    user_info.usri1_flags = UF_SCRIPT;
    user_info.usri1_script_path = TEXT("");

        //err = NetUserDel(NULL, L"NowyUse2r");  this will delete user

    err = NetUserAdd( NULL/*lpszPrimaryDC*/,        // PDC name
                      1,                    // level
                      (LPBYTE) &user_info,  // input buffer
                      &parm_err );          // parameter in error

    switch ( err )
    {
    case 0:
        printf("User successfully created.\n");
        break;
    case NERR_UserExists:
        printf("User already exists.\n");
        err = 0;
        break;
    case ERROR_INVALID_PARAMETER:
        printf("Invalid parameter error adding user; parameter index = %d\n",
                parm_err);
        NetApiBufferFree( lpszPrimaryDC );
   return( err );
    case ERROR_ACCESS_DENIED:
    printf("ERROR_ACCESS_DENIED; parameter index = %d\n",
                parm_err);
        NetApiBufferFree( lpszPrimaryDC );
        return( err );
    default:
        printf("Error adding user: %d\n", err);
        NetApiBufferFree( lpszPrimaryDC );
        return( err );
    }

// Set up the LOCALGROUP_INFO_1 structure.

    localgroup_info.lgrpi1_name = lpszLocalGroup;
    localgroup_info.lgrpi1_comment = TEXT("Sample local group.");

    err = NetLocalGroupAdd( NULL,    // PDC name
                  1,                          // level
                  (LPBYTE) &localgroup_info,  // input buffer
                  &parm_err );                // parameter in error

    switch ( err )
    {
    case 0:
        printf("Local group successfully created.\n");
        break;
    case ERROR_ALIAS_EXISTS:
        printf("Local group already exists.\n");
        err = 0;
        break;
    case ERROR_INVALID_PARAMETER:
        printf("Invalid parameter error adding local group; parameter index = %d\n",
                err, parm_err);
        NetApiBufferFree( lpszPrimaryDC );
        //return( err );
    default:
        printf("Error adding local group: %d\n", err);
        NetApiBufferFree( lpszPrimaryDC );
        //return( err );
    }

// Now add the user to the local group.

    localgroup_members.lgrmi3_domainandname = lpszUser;

    err = NetLocalGroupAddMembers( NULL,        // PDC name
                           lpszLocalGroup,               // group name
                           3,                            // name
                           (LPBYTE) &localgroup_members, // buffer
                           1 );                          // count

    switch ( err )
    {
    case 0:
        printf("User successfully added to local group.\n");
        break;
    case ERROR_MEMBER_IN_ALIAS:
        printf("User already in local group.\n");
        err = 0;
        break;
    default:
        printf("Error adding user to local group: %d\n", err);
        break;
    }

    NetApiBufferFree( lpszPrimaryDC );
    return( err );
}

int main()
{
    NET_API_STATUS err = 0;

    printf( "Calling NetSample.\n" );
    err = NetSample( L"",
                     L"NewUser",
                     L"SamplePswd",
                     L"Users" );
    printf( "NetSample returned %d\n", err );
    return( 0 );
}
#ifndef UNICODE
#定义UNICODE
#恩迪夫
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“netapi32.lib”)
NET_API_状态NetSample(LPWSTR lpszDomain,
LPWSTR lpszUser,
LPWSTR LPSZ密码,
LPWSTR(本地组)
{
用户信息1用户信息;
本地组信息1本地组信息;
本地组成员\u信息\u 3本地组成员;
LPWSTR lpszPrimaryDC=NULL;
净API状态错误=0;
DWORD parm_err=0;
//获取主域控制器的名称。
//确保释放返回的缓冲区。
//在本地机器上,我们不需要这样做
//err=NetGetDCName(NULL,//本地计算机
//NULL,//域名
//(LPBYTE*)&lpszPrimaryDC);//返回的PDC
//如果(错误!=0)
//{
//printf(“获取DC名称时出错:%d\n”,错误);
//返回(err);
//}
//设置用户信息结构。
user_info.usri1_name=lpszUser;
user_info.usri1_password=lpszPassword;
user_info.usri1_priv=user_priv_user;
user\u info.usri1\u home\u dir=文本(“”);
user_info.usri1_comment=文本(“”);
user_info.usri1_flags=UF_脚本;
user_info.usri1_script_path=TEXT(“”);
//err=NetUserDel(NULL,L“NowyUse2r”);这将删除用户
err=NetUserAdd(NULL/*lpszPrimaryDC*/,//PDC name
1,//级别
(LPBYTE)&用户信息,//输入缓冲区
&parm_err);//参数出错
开关(错误)
{
案例0:
printf(“用户已成功创建。\n”);
打破
案例NERR_用户存在:
printf(“用户已存在。\n”);
误差=0;
打破
案例错误\u无效\u参数:
printf(“添加用户时参数错误无效;参数索引=%d\n”,
帕尔穆埃尔);
NetApiBufferFree(lpszPrimaryDC);
返回(err);
案例错误\u访问\u被拒绝:
printf(“错误\u访问被拒绝;参数索引=%d\n”,
帕尔穆埃尔);
NetApiBufferFree(lpszPrimaryDC);
返回(err);
违约:
printf(“添加用户时出错:%d\n”,错误);
NetApiBufferFree(lpszPrimaryDC);
返回(err);
}
//设置LOCALGROUP\u INFO\u 1结构。
localgroup_info.lgrpi1_name=lpszLocalGroup;
localgroup_info.lgrpi1_comment=TEXT(“示例本地组”);
err=NetLocalGroupAdd(NULL,//PDC名称
1,//级别
(LPBYTE)&localgroup\u info,//输入缓冲区
&parm_err);//参数出错
开关(错误)
{
案例0:
printf(“已成功创建本地组。\n”);
打破
案例错误\u别名\u存在:
printf(“本地组已存在。\n”);
误差=0;
打破
案例错误\u无效\u参数:
printf(“添加本地组时参数错误无效;参数索引=%d\n”,
呃,帕尔默(parm_err),;
NetApiBufferFree(lpszPrimaryDC);
//返回(err);
违约:
printf(“添加本地组时出错:%d\n”,错误);
NetApiBufferFree(lpszPrimaryDC);
//返回(err);
}
//现在将用户添加到本地组。
localgroup_members.lgrmi3_domainandname=lpszUser;
err=NetLocalGroupAddMembers(NULL,//PDC名称
lpszLocalGroup,//组名
3、//名称
(LPBYTE)&localgroup_成员,//缓冲区
1);//计数
开关(错误)
{
案例0:
printf(“用户已成功添加到本地组。\n”);
打破
案例错误\u成员\u在\u别名中:
printf(“用户已在本地组中。\n”);
误差=0;
打破
违约:
printf(“将用户添加到本地组时出错:%d\n”,错误);
打破
}
NetApiBufferFree(lpszPrimaryDC);
返回(err);
}
int main()
{
净API状态错误=0;
printf(“调用NetSample。\n”);
err=NetSample(L“”,
L“新用户”,
L“样本编号”,