我想在我的代码上创建和删除新用户。我设法使用“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函数click的详细信息。
答案 0 :(得分:1)
您必须将用户添加到名为“Users”的本地组。因此,您可以使用NetLocalGroupAddMembers功能。
本地组用户的名称取决于已安装的Windows版本的语言。要获取本地组“用户”的名称,您可以使用CreateWellKnownSid(使用WinBuiltinUsersSid作为 WellKnownSidType )和LookupAccountSid。
答案 1 :(得分:1)
以下是我在Windows中创建帐户的示例。如果您要将此帐户添加到本地用户,以便您可以登录当前计算机,则需要调用NetLocalGroupAddMembers函数。作为本地组名称您应该只键入“用户”,但它在Windows的语言版本上有所不同。在波兰语版本上它将是“Użytkownicy”等。 如果要在远程服务器上添加帐户,则需要调用NetGetDCName并使用第一个参数为其提供服务器地址。然后在此示例中的其他函数中使用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 );
}