RuningPigNO1 2018-04-17 03:55 采纳率: 50%
浏览 982
已采纳

请教C++如何检测本机是否启用GUEST来宾账号

如题 C++程序怎么样才能判断本机是否启用了GUEST账号功能呢?另外AD域如何获取?还望大神不吝赐教

  • 写回答

1条回答 默认 最新

  • maxucheng 2018-04-17 05:35
    关注

    使用API中的函数:NetUserEnum来枚举用户;NetUserGetInfo来获取用户的信息.
    思路应该是这样的。
    以下为Windows Conlse Appilication下的枚举所有用户信息的代码(帐户名、帐户状态、是否需要密码(此处可能判断不准确)、上次登录时间、密码是否可更改、密码过期时间):

     #include "iostream"
    #include "windows.h"
    #include "lm.h"
    #include "assert.h"
    #include "string"
    #include "time.h"
    using namespace std;
    #pragma comment(lib,"netapi32.lib")
    string Prev(DWORD n)//帐户权限
    {
     switch(n)
     {
     case 0:
      return "Guest";
      break;
     case 1:
      return "User";
      break;
     case 2:
      return "Administrator";
      break;
     default:
      return "Unknown";
      break;
     }
    }
    string LastLogon(DWORD n)//上次登录时间
    {
     if(n==0)
      return "Unknown Last logon time.";
     else
     {
      time_t last_logon_time;
      last_logon_time = n;
      return ctime(&last_logon_time);
     }
    }
    string ExpiriedTime(unsigned long  n)//密码过期时间
    {
     if(n==0||n==NULL)
      return "Never Expiried.";
     else
     {
      time_t current;
      current=n;
    return ctime(¤t);
     }
    }
    //判断帐户状态:数组各个值对应的意义如下
    /*
      UF_SCRIPT     登录脚本执行  1   
      UF_ACCOUNTDISABLE   用户帐户不可用  2
    
      UF_HOMEDIR_REQUIRED   要求有用户目录  8
      UF_LOCKOUT     帐户锁定   16
      UF_PASSWD_NOTREQD   不要求用户密码  32
      UF_PASSWD_CANT_CHANGE  不能更改密码  64
    以下为帐户类型:
      UF_TEMP_DUPLICATE_ACCOUNT 域用户帐户   256
      UF_NORMAL_ACCOUNT   普通帐户   512
      UF_INTERDOMAIN_TRUST_ACCOUNT域内可信任帐户  2048
      UF_WORKSTATION_TRUST_ACCOUNT工作组可信任帐户 4096
      UF_SERVER_TRUST_ACCOUNT  备份域控制器帐户 8192
      UF_DONT_EXPIRE_PASSWD  密码不过期   65536
    */
    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 Need : "<<"不需要密码"<<endl
        <<"\t Password Change : "<<"密码不能更改"<<endl;
      else
       cout<<"\t Password Nedd : "<<"需要密码"<<endl
        <<"\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();
    } 
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办