您的位置:首页 > 编程语言 > C语言/C++

C++ 枚举本地主机所有用户、用户基本信息(不能获得密码哦)

2013-11-04 15:09 423 查看

C++ 枚举本地主机所有用户、用户基本信息

#include "iostream"

#include "windows.h"

#include "lm.h"

#include "assert.h"

#include "string"

#include "time.h"

using namespace std;

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

//判断帐户状态:数组各个值对应的意义如下

/*

序号 Value Mean Calendar Value

01 UF_SCRIPT 登录脚本执行 1

02 UF_ACCOUNTDISABLE 用户帐户不可用 2

03

04 UF_HOMEDIR_REQUIRED 要求有用户目录 8

02 UF_LOCKOUT 帐户锁定 16

06 UF_PASSWD_NOTREQD 不要求用户密码 32

07 UF_PASSWD_CANT_CHANGE 不能更改密码 64

08

以下为帐户类型:

09 UF_TEMP_DUPLICATE_ACCOUNT 域用户帐户 256

10 UF_NORMAL_ACCOUNT 普通帐户 512

11

12 UF_INTERDOMAIN_TRUST_ACCOUNT域内可信任帐户 2048

13 UF_WORKSTATION_TRUST_ACCOUNT工作组可信任帐户 4096

14 UF_SERVER_TRUST_ACCOUNT 备份域控制器帐户 8192

15

16

17 UF_DONT_EXPIRE_PASSWD 密码不过期 65536

说明:用ToBinary(int,int)这个函数判断各个序号对应的值是否为真。

*/

int ToBinary(long n,int k)

{

int num[17];

int i=16;

//密码永不过期

long m=n;

if(k>17||k<1)

k=1;

while(m!=0)

{

num[i]=m%2;

m=m/2;

i--;

}

num[i]='\0';

return num[17-k];

}

int GetAllUser()

{

LPUSER_INFO_1 pBuf = NULL;

LPUSER_INFO_1 pTmpBuf;

DWORD dwLevel = 1;

DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;

DWORD dwEntriesRead = 0;

DWORD dwTotalEntries = 0;

DWORD dwResumeHandle = 0;

DWORD i;

DWORD dwTotalCount = 0;

NET_API_STATUS nStatus;

LPTSTR pszServerName = NULL;

do

{

nStatus = NetUserEnum(NULL,

dwLevel,

FILTER_NORMAL_ACCOUNT, // global users

(LPBYTE*)&pBuf,

dwPrefMaxLen,

&dwEntriesRead,

&dwTotalEntries,

&dwResumeHandle);

//

// If the call succeeds,

//

if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))

{

if ((pTmpBuf = pBuf) != NULL)

{

//

// Loop through the entries.

//

for (i = 0; (i < dwEntriesRead); i++)

{

assert(pTmpBuf != NULL);

if (pTmpBuf == NULL)

{

fprintf(stderr, "An access violation has occurred\n");

break;

}

//

// Print the name of the user account.

//

/*

typedef struct _USER_INFO_1 {

LPWSTR usri1_name; //用户名

LPWSTR usri1_password; //用户密码

DWORD usri1_password_age; //当前密码使用时间(单位:秒)

DWORD usri1_priv; //用户权限 0 来宾; 1 普通用户; 2 管理员.

LPWSTR usri1_home_dir; //

LPWSTR usri1_comment; //备注,可能为NULL

DWORD usri1_flags; //

LPWSTR usri1_script_path; //返回Unicode string,包含用户登录的脚本。可以为NULL

}USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1;

*/

wprintf(L"Account No.%d\n",dwTotalCount+1);

LPUSER_INFO_3 bufptr=NULL;

LPUSER_INFO_2 buf=NULL;

NET_API_STATUS t3,t2;

t3=NetUserGetInfo(0,pTmpBuf->usri1_name,3,(LPBYTE*)&bufptr);

t2=NetUserGetInfo(0,pTmpBuf->usri1_name,2,(LPBYTE*)&buf);

//帐户名称:

wprintf(L"\t Account Name: %s \n",bufptr->usri3_name);

//上次登录时间:单位,秒;计算起始时间为1970年1月1日00:00

if(bufptr->usri3_last_logon==0)

cout<<"\t Account Last Logon Time: "<<"上次登录时间未知"<<endl;

else

{

long m=bufptr->usri3_last_logon;

time_t last;

last = m;

cout<<"\t Account Last Logon Time: "<<ctime(&last);

}

//密码过期时间:单位,秒;计算起始时间为1970年1月1日00:00. 如果为 0 ,表示永不过期

if(bufptr->usri3_password_expired==0||bufptr->usri3_password_expired==NULL)

cout<<"\t Password Expiried Time: "<<"密码永不过期"<<endl;

else

{

long n=bufptr->usri3_password_expired;

time_t pwd;

pwd = n;

cout<<"\t Password Expiried Time: "<<ctime(&pwd)<<endl;

}

//判断账户过期时间:如果过期时间为:65536*65536-1,表示永不过期

/* if(buf->usri2_acct_expires==4294967295)

cout<<"\t Account Expiried Time:"<<"帐户永不过期"<<endl;

else

{

long k=buf->usri2_acct_expires;

time_t acct;

acct = k;

cout<<"\t Account Expiried Time:"<<ctime(&acct)<<endl;

}

*/

//判断帐户状态 usri2_flags:

/*

value mean int

UF_SCRIPT 登录脚本执行 1

UF_ACCOUNTDISABLE 用户帐户不可用 2

UF_HOMEDIR_REQUIRED 要求有用户目录 8

UF_LOCKOUT 帐户锁定 16

UF_PASSWD_NOTREQD 不要求用户密码 32

UF_PASSWD_CANT_CHANGE 不能更改密码 64

UF_DONT_EXPIRE_PASSWD 密码不过期 65536

以下为帐户类型:

UF_TEMP_DUPLICATE_ACCOUNT 域用户帐户 256

UF_NORMAL_ACCOUNT 普通帐户 512

UF_INTERDOMAIN_TRUST_ACCOUNT域内可信任帐户 2048

UF_WORKSTATION_TRUST_ACCOUNT工作组可信任帐户 4096

UF_SERVER_TRUST_ACCOUNT 备份域控制器帐户 8192

*/

long n=buf->usri2_flags;

//帐户状态:

if(ToBinary(n,2))

cout<<"\t Account Status : "<<"帐户未启用"<<endl;

else

cout<<"\t Account Status : "<<"帐户已启用"<<endl;

//密码是否可更改:

if(ToBinary(n,7))

cout<<"\t Password Change : "<<"密码不能更改"<<endl;

else

cout<<"\t Password Change : "<<"密码可以更改"<<endl;

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);

fprintf(stderr, "\nTotal of %d entries enumerated\n", dwTotalCount);

return 0;

}

void main()

{

GetAllUser();

cin.get();

}

//以上代码在 Viusal C++ 6.0 编译下通过

以下为MSDN帮助文档中的说明:

NetUserGetInfo 定义如下:

NET_API_STATUS NetUserGetInfo(

LPWSTR
servername, //远程主机名,值为NULL,表示本机。

LPWSTR
username, //用户名

DWORD
level, //返回对应的 _USER_INF0_ 值:例如,返回0,对应 _USER_INFO_0

LPBYTE
*bufptr

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: