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

  • Post author:
  • Post category:其他


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



);