最近有变态需求要求把企业无盘的用户帐号和Windows帐号一体化,就研究了下Windows帐号的创建,有几个坑,第一是Windows内置帐号是不能改名的,Windows自己能改名其实其内部机制也是先创建新的再删除老的,并且要关联注册表和用户文件, 第二是当创建新的管理员帐号时要先创建成普通用户,再加入到Administrators组里。话不多说,上示例代码(为了省事,代码是chatGPT生成的,只简单调试就OK了).
#include <windows.h>
#include <lm.h>
#include <lmaccess.h>
#pragma comment(lib, "NETapi32.lib")
BOOL RemoveUserAccount(LPCWSTR username) {
NET_API_STATUS status = NetUserDel(nullptr, username);
if (status == NERR_Success) {
// Account removed successfully
return TRUE;
}
else {
// Error occurred while removing account
return FALSE;
}
}
bool DoesUserExist(const wchar_t* username)
{
USER_INFO_0* user_info = NULL;
bool exists = false;
NET_API_STATUS result = NetUserGetInfo(NULL, username, 0, (LPBYTE*)&user_info);
if (result == NERR_Success)
{
exists = true;
NetApiBufferFree(user_info);
}
return exists;
}
bool CreateAdminUser(const wchar_t* username, const wchar_t* password)
{
USER_INFO_1 user_info = {};
user_info.usri1_name = const_cast<wchar_t*>(username);
user_info.usri1_password = const_cast<wchar_t*>(password);
user_info.usri1_priv = USER_PRIV_USER;
user_info.usri1_flags = UF_script | UF_DONT_EXPIRE_PASSWD | UF_PASSWD_CANT_CHANGE;
user_info.usri1_home_dir = NULL;
user_info.usri1_comment = NULL;
user_info.usri1_script_path = NULL;
NET_API_STATUS result = NetUserAdd(NULL, 1, (LPBYTE)&user_info, NULL);
if (result == NERR_Success)
{
LOCALGROUP_MEMBERS_INFO_3 account_info{};
account_info.lgrmi3_domainandname = const_cast<LPWSTR>(username);
result = NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account_info, 1);
if (result == NERR_Success)
{
}
else
{
}
}
return true;
}
DWORD RenameUserAccount(LPWSTR oldUsername, const LPWSTR newUsername)
{
USER_INFO_0 userInfo;
DWORD result;
// Set the new username in the USER_INFO_1003 structure
userInfo.usri0_name = newUsername;
// Call NetUserSetInfo to rename the user account
result = NetUserSetInfo(NULL, oldUsername, 0, (LPBYTE)&userInfo, NULL);
if (result == NERR_Success) {
// Success!
return ERROR_SUCCESS;
}
else {
// There was an error
return result;
}
}
int main()
{
if (!DoesUserExist(L"TestAdmin")) {
CreateAdminUser(L"TestAdmin", L"123~@#7890");
}
else {
RemoveUserAccount(L"AdminTest");
RenameUserAccount((LPWSTR)L"TestAdmin", (LPWSTR)L"AdminTest");
//RemoveUserAccount(L"TestAdmin");
}
// name successfully changed
return 0;
}