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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值