// pch.cpp: 与预编译标头对应的源文件;编译成功所必需的
#include "pch.h"
/* UNICODE */
#ifndef UNICODE
#define UNICODE
#endif
/* 头文件 */
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#include <lm.h>
#pragma comment(lib, "netapi32.lib")
#include <iostream>
using namespace std;
/*************************************
* AddUser
* 功能 增加用户
* 参数 szServerName,主机名,如果为本机增加用户,设置为NULL
* szUserName,用户名
* szPassword,密码
**************************************/
void AddUser(LPWSTR szServerName,
LPWSTR szUserName,
LPWSTR szPassword)
{
USER_INFO_1 ui;
DWORD dwLevel = 1; // 使用 USER_INFO_1 作为参数
DWORD dwError = 0;
NET_API_STATUS nStatus;
// 填充 USER_INFO_1
ui.usri1_name = szUserName; // 用户名
ui.usri1_password = szPassword; // 密码
ui.usri1_priv = USER_PRIV_USER; // privilege
ui.usri1_home_dir = NULL;
ui.usri1_comment = NULL;//描述
//UF_PASSWD_CANT_CHANGE 用户不能更改密码
//UF_SCRIPT 登陆脚本执行,UF_DONT_EXPIRE_PASSWD 表示密码永不过期,
ui.usri1_flags = UF_SCRIPT | UF_DONT_EXPIRE_PASSWD;
ui.usri1_script_path = NULL;
// 调用 NetUserAdd 增加用户
nStatus = NetUserAdd(szServerName,
dwLevel,
(LPBYTE)&ui,
&dwError);
// 判断结果
if (nStatus == NERR_Success || nStatus == NERR_UserExists)
{
wprintf((wchar_t*)stderr, L"User %s has been successfully added on %s\n",
szUserName, szServerName);
}
else
{
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
}
}
/************************************
*MondUserName
*功能 修改用户名 ,,直接可以修改
*参数 szServerName,主机名,如果为本机,设置为NULL
oldUserName 老用户名
newUserName 新用户名
*************************************/
void MondUserName(LPWSTR szServerName, LPWSTR oldUserName,LPWSTR newUserName) {
//TCHAR strName[60] = { 0 };
//DWORD he;
//::GetUserNameW(oldUserName, &he);
USER_INFO_0 ui;
ui.usri0_name = newUserName;
DWORD dwResult = ::NetUserSetInfo(NULL,oldUserName, 0, (LPBYTE)&ui, NULL);
int a = GetLastError();
if (NERR_Success == dwResult)
{
MessageBox(NULL, L"修改成功", NULL, 0);
}
else
{
char buf[100] = { 0 };
sprintf_s(buf, "错误代码是:%d", GetLastError());
MessageBoxA(NULL, buf, NULL, 0);
}
}
/*************************************
* GroupAdd
* 功能 添加用户组
* 参数 szServerName,主机名,如果为本机,设置为NULL
* szGroup,用户组名
szDescride 描述
**************************************/
int GroupAdd(LPWSTR szServerName,
LPWSTR szGroup,
LPWSTR szDescride)
{
NET_API_STATUS nStatus;
DWORD level=1;
DWORD dwError = 0;
LOCALGROUP_INFO_1 ui;
ui.lgrpi1_name = szGroup;//组名
ui.lgrpi1_comment = szDescride;//描述
// 调用 NetGroupAdd
//nStatus = NetGroupAdd(szServerName,level,(LPBYTE)&ui,&dwError);
nStatus = NetLocalGroupAdd(szServerName,level,(LPBYTE)&ui,&dwError);
// 判断结果
if (nStatus == NERR_Success)
fwprintf(stderr, L"User %s has been successfully added on %s\n",
szGroup, szDescride);
else
fprintf(stderr, "NetGroupAdd A system error has occurred: %d\n", nStatus);
return 0;
}
/*************************************
* AddUserToGroup
* 功能 为用户组增加用户
* 参数 szServerName,主机名,如果为本机,设置为NULL
* szUserName,用户名
* szGroup,用户组名
**************************************/
int AddUserToGroup(LPWSTR szServerName,
LPWSTR szUserName,
LPWSTR szGroup)
{
NET_API_STATUS nStatus;
LOCALGROUP_MEMBERS_INFO_3 account;
// 调用 NetGroupAddUser
//nStatus = NetGroupAddUser(szServerName,szGroup,szUserName);
wchar_t szAccountName[20] = { 0 };
const wchar_t *name;
name = (const wchar_t *)szUserName;
wcscpy_s(szAccountName, name);
account.lgrmi3_domainandname = szAccountName;
nStatus = NetLocalGroupAddMembers(szServerName, szGroup, 3, (LPBYTE)&account, 1);
// 判断结果
if (nStatus == NERR_Success || nStatus == ERROR_MEMBER_IN_ALIAS)
//if (nStatus == NERR_Success)
fwprintf(stderr, L"User %s has been successfully added on %s\n",
szUserName, szGroup);
else
fprintf(stderr, "NetGroupAddUser A system error has occurred: %d\n", nStatus);
return 0;
}
/*************************************
* DelUserGroup
* 功能 删除用户组
* 参数 szServerName,主机名,如果为本机,设置为NULL
* szUserName,用户组名
**************************************/
int DelUserGroup(LPWSTR szServerName, LPWSTR szGroupName)
{
DWORD dwError = 0;
NET_API_STATUS nStatus;
// 调用 NetLocalGroupDel 删除用户组
nStatus = NetLocalGroupDel(szServerName, szGroupName);
// 判断并显示结果
if (nStatus == NERR_Success)
fwprintf(stderr, L"User %s has been successfully deleted on %s\n",
szGroupName, szServerName);
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
return 0;
}
/*************************************
* DelUser
* 功能 删除用户
* 参数 szServerName,主机名,如果为本机,设置为NULL
* szUserName,用户名
**************************************/
int DelUser(LPWSTR szServerName, LPWSTR szUserName)
{
DWORD dwError = 0;
NET_API_STATUS nStatus;
// 调用 NetUserDel 删除用户
nStatus = NetUserDel(szServerName, szUserName);
// 判断并显示结果
if (nStatus == NERR_Success)
fwprintf(stderr, L"User %s has been successfully deleted on %s\n",
szUserName, szServerName);
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
return 0;
}
/*************************************
* int ListUsers(LPWSTR pszServerName)
* 功能 列举用户
* 参数 szServerName,主机名,如果为本机,设置为NULL
**************************************/
int ListUsers(LPWSTR pszServerName)
{
LPUSER_INFO_0 pBuf = NULL;
LPUSER_INFO_0 pTmpBuf;
DWORD dwLevel = 0;
DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
DWORD dwResumeHandle = 0;
DWORD i;
DWORD dwTotalCount = 0;
NET_API_STATUS nStatus;
// 循环,直到可以成功调用 NetUserEnum
do
{
// 调用NetUserEnum函数
nStatus = NetUserEnum(pszServerName,
dwLevel,// 这里设置为0,使用 LPUSER_INFO_0 返回结果
FILTER_NORMAL_ACCOUNT, // 只列举“正常”类型的用户
(LPBYTE*)&pBuf,// LPUSER_INFO_0 保存返回结果
// MAX_PREFERRED_LENGTH,内存由API分配,需要在之后调用NetApiBufferFree释放
dwPrefMaxLen,
&dwEntriesRead,// 读了的 Entries
&dwTotalEntries,// 一共的 Entries
&dwResumeHandle);
// 判断是否成功
if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
{
if ((pTmpBuf = pBuf) != NULL)
{
// 循环读取用户信息
for (i = 0; (i < dwEntriesRead); i++)
{
assert(pTmpBuf != NULL);
if (pTmpBuf == NULL)
{
fprintf(stderr, "An access violation has occurred\n");
break;
}
// 输出
wprintf(L"\t-- %s\n", pTmpBuf->usri0_name);
// 下一个
pTmpBuf++;
dwTotalCount++;
}
}
}
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
// 释放内存
if (pBuf != NULL)
{
NetApiBufferFree(pBuf);
pBuf = NULL;
}
} while (nStatus == ERROR_MORE_DATA); // end do
// 释放内存
if (pBuf != NULL)
NetApiBufferFree(pBuf);
fprintf(stderr, "Total of %d users\n\n", dwTotalCount);
return 0;
}
/*************************************
* int ListGroup(LPWSTR pszServerName)
* 功能 列举用户组
* 参数 szServerName,主机名,如果为本机,设置为NULL
**************************************/
int ListGroup(LPWSTR pszServerName)
{
DWORD dwLevel = 0;
DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
DWORD dwResumeHandle = 0;
DWORD i;
DWORD dwTotalCount = 0;
NET_API_STATUS nStatus;
LPLOCALGROUP_INFO_0 pBuf = NULL;
LPLOCALGROUP_INFO_0 pTmpBuf;
do // begin do
{
// 调用NetLocalGroupEnum 参数设置与NetLocalGroup类似
nStatus = NetLocalGroupEnum(
pszServerName,
0,
(LPBYTE*)&pBuf,
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries,
(PDWORD_PTR)&dwResumeHandle);
// 判断结果
if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
{
if ((pTmpBuf = pBuf) != NULL)
{
// 循环输出
for (i = 0; (i < dwEntriesRead); i++)
{
assert(pTmpBuf != NULL);
if (pTmpBuf == NULL)
{
fprintf(stderr, "An access violation has occurred\n");
break;
}
wprintf(L"\t-- %s\n", pTmpBuf->lgrpi0_name);
pTmpBuf++;
dwTotalCount++;
}
}
}
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
// 释放内存
if (pBuf != NULL)
{
NetApiBufferFree(pBuf);
pBuf = NULL;
}
}
while (nStatus == ERROR_MORE_DATA); // end do
if (pBuf != NULL)
NetApiBufferFree(pBuf);
fprintf(stderr, "Total of %d groups\n\n", dwTotalCount);
return 0;
}
/*************************************
* ShowUsersInfo
* 功能 显示指定用户的信息
* 参数 szServerName,主机名,如果为本机,设置为NULL
* pszUserName,用户名
**************************************/
int ShowUsersInfo(LPWSTR pszServerName, LPWSTR pszUserName)
{
DWORD dwLevel = 4;// 使用 LPUSER_INFO_4 返回结果
LPUSER_INFO_4 pBuf = NULL;
NET_API_STATUS nStatus;
nStatus = NetUserGetInfo(pszServerName,
pszUserName,
dwLevel, // pBuf参数类型
(LPBYTE *)&pBuf);
// 判断并输出结果
if (nStatus == NERR_Success)
{
if (pBuf != NULL)
{
wprintf(L"\n\tAccount: %s\n", pBuf->usri4_name);
wprintf(L"\tComment: %s\n", pBuf->usri4_comment);
wprintf(L"\tUser comment: %s\n", pBuf->usri4_usr_comment);
wprintf(L"\tFull name: %s\n", pBuf->usri4_full_name);
wprintf(L"\tpriv: %d\n", pBuf->usri4_priv);
}
}
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
// 释放内存
if (pBuf != NULL)
NetApiBufferFree(pBuf);
return 0;
}
/************************************
*mondPass
*功能 修改密码 ,不需要输入旧密码验证,直接可以修改
*参数 szServerName,主机名,如果为本机,设置为NULL
pass 修改的密码
*************************************/
void MondPass(LPWSTR strName,LPWSTR pass) {
//TCHAR strName[10] = { 0 };
//DWORD he;
//::GetUserNameW(strName, &he);
USER_INFO_1003 ui;
ui.usri1003_password = pass;
DWORD dwResult = ::NetUserSetInfo(NULL, strName, 1003, (LPBYTE)&ui, NULL);
int a = GetLastError();
if (NERR_Success == dwResult)
{
MessageBox(NULL, L"修改成功", NULL, 0);
}
else
{
char buf[100] = { 0 };
sprintf_s(buf, "错误代码是:%d", GetLastError());
MessageBoxA(NULL, buf, NULL, 0);
}
}
/************************************
*MondifyPassword
*功能 修改密码 ,需要输入旧密码验证才能修改
*参数
szServerName 主机名,如果为本机,设置为NULL
userName 该NetUserChangePassword函数改变指定用户的密码。如果此参数为NULL,则使用调用方的登录名
oldPassword 用户的旧密码
newpassword 用户的新密码
*************************************/
void MondifyPassword(LPWSTR szServerName,LPWSTR userName,LPWSTR oldPassword,LPWSTR newpassword)
{
DWORD dwError = 0;
DWORD dwLevel = 5;
NET_API_STATUS nStatus;
if (dwLevel != 5)
{
fwprintf(stderr, L"Usage: %s \\\\ServerName UserName OldPassword NewPassword\n", L"");
exit(1);
}
nStatus = NetUserChangePassword(szServerName, userName, oldPassword, newpassword);
cout <<"nStatus="<< nStatus << endl;
if (nStatus == NERR_Success) {//调用成功,请通知用户
fwprintf(stderr, L"User password has been changed successfully\n");
}else //打印系统错误
{
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
}
}
/*************************************
* wmain
* 功能 入口函数,根据参数判断需要调用的功能函数
* 参数 参见usage输出
**************************************/
/*int __cdecl wmain(int ac, wchar_t * av[])
{
if (ac == 4 && lstrcmpW(av[1], L"-a") == 0)
{
AddUser(NULL, av[2], av[3]);
}
else if (ac == 4 && lstrcmpW(av[1], L"-g") == 0)
{
AddUserToGroup(NULL, av[2], av[3]);
}
else if (ac == 3 && lstrcmpW(av[1], L"-i") == 0)
{
ShowUsersInfo(NULL, av[2]);
}
else if (ac == 2 && lstrcmpW(av[1], L"-i") == 0)
{
ListUsers(NULL);
ListGroup(NULL);
}
else if (ac == 3 && lstrcmpW(av[1], L"-d") == 0)
{
DelUser(NULL, av[2]);
}
else
{
printf("usage: \n"
"\t %ws -a <username> <password> to add a user\n"
"\t %ws -g <username> <group> add a user to a group"
"\t %ws -i <username> to show user info\n"
"\t %ws -d <username> to del a user\n",
av[0], av[0], av[0], av[0]);
}
printf("%d",ac);
return 0;
}
*/
/*int main() {
//LPWSTR av = L"123456";
//DelUser(NULL, L"wyg3");
//MondifyPassword(NULL,L"Administrator", L"123456", L"123456");
//MondUserName(NULL, L"Administrator", L"admin");
//MondPass(NULL,L"123456");
//ListUsers(NULL);
//AddUser(NULL,L"wyg4",L"123456");
//ShowUsersInfo(NULL, L"Administrator");
//ListGroup(NULL);
//AddUserToGroup(NULL, L"wyg2", L"Administrators");
//GroupAdd(NULL, L"test", L"临时的一个组,用来测试");
//DelUserGroup(NULL, L"test");
}*/