基于Visual C++之实现Windows用户管理

来源:互联网 发布:宿舍床帘淘宝 编辑:程序博客网 时间:2024/05/22 05:10

 

[cpp] view plaincopyprint?
  1. /* UNICODE */  
  2. #ifndef UNICODE  
  3. #define UNICODE  
  4. #endif  
  5. /* 头文件 */  
  6. #include <stdio.h>  
  7. #include <assert.h>  
  8. #include <windows.h>   
  9. #include <lm.h> 
  10. #include "dsgetdc.h"
    #pragma comment(lib,"netapi32.lib")
  11.   
  12. /************************************* 
  13. * AddUser 
  14. * 功能    增加用户 
  15. * 参数    szServerName,主机名,如果为本机增加用户,设置为NULL 
  16. *           szUserName,用户名 
  17. *           szPassword,密码 
  18. **************************************/  
  19. int AddUser(LPWSTR szServerName,   
  20.             LPWSTR szUserName,  
  21.             LPWSTR szPassword)  
  22. {  
  23.     USER_INFO_1 ui;  
  24.     DWORD dwLevel = 1;  // 使用 USER_INFO_1 作为参数  
  25.     DWORD dwError = 0;  
  26.     NET_API_STATUS nStatus;  
  27.     // 填充 USER_INFO_1  
  28.     ui.usri1_name = szUserName; // 用户名  
  29.     ui.usri1_password = szPassword; // 密码  
  30.     ui.usri1_priv = USER_PRIV_USER; // privilege    
  31.     ui.usri1_home_dir = NULL;  
  32.     ui.usri1_comment = NULL;  
  33.     ui.usri1_flags = UF_SCRIPT;  
  34.     ui.usri1_script_path = NULL;  
  35.     // 调用 NetUserAdd 增加用户  
  36.     nStatus = NetUserAdd(szServerName,  
  37.         dwLevel,  
  38.         (LPBYTE)&ui,  
  39.         &dwError);  
  40.   
  41.     // 判断结果  
  42.     if (nStatus == NERR_Success)  
  43.     {  
  44.         wprintf(stderr, L"User %s has been successfully added on %s\n",  
  45.         szUserName, szServerName);  
  46.     }  
  47.     else  
  48.     {  
  49.         fprintf(stderr, "A system error has occurred: %d\n", nStatus);  
  50.     }  
  51.     return 0;  
  52. }  
  53.   
  54. /************************************* 
  55. * AddUserToGroup 
  56. * 功能    为用户组增加用户 
  57. * 参数    szServerName,主机名,如果为本机,设置为NULL 
  58. *           szUserName,用户名 
  59. *           szGroup,用户组名 
  60. **************************************/  
  61. int AddUserToGroup(LPWSTR szServerName,   
  62.                    LPWSTR szUserName,    
  63.                    LPWSTR szGroup)  
  64. {  
  65.     NET_API_STATUS nStatus;  
  66.     // 调用 NetGroupAddUser  
  67.     nStatus =  NetGroupAddUser(  
  68.         szServerName,  
  69.         szGroup,  
  70.         szUserName  
  71.         );  
  72.   
  73.     // 判断结果  
  74.     if (nStatus == NERR_Success)  
  75.         fwprintf(stderr, L"User %s has been successfully added on %s\n",  
  76.         szUserName, szServerName);  
  77.   
  78.     else  
  79.         fprintf(stderr, "NetGroupAddUser A system error has occurred: %d\n", nStatus);  
  80.     return 0;  
  81. }  
  82.   
  83. /************************************* 
  84. * DelUser 
  85. * 功能    删除用户 
  86. * 参数    szServerName,主机名,如果为本机,设置为NULL 
  87. *           szUserName,用户名 
  88. **************************************/  
  89. int DelUser(LPWSTR szServerName, LPWSTR szUserName)  
  90. {  
  91.     DWORD dwError = 0;  
  92.     NET_API_STATUS nStatus;  
  93.   
  94.     // 调用 NetUserDel 删除用户  
  95.     nStatus = NetUserDel(szServerName, szUserName);  
  96.     // 判断并显示结果  
  97.     if (nStatus == NERR_Success)  
  98.         fwprintf(stderr, L"User %s has been successfully deleted on %s\n",  
  99.         szUserName, szServerName);  
  100.     else  
  101.         fprintf(stderr, "A system error has occurred: %d\n", nStatus);  
  102.   
  103.     return 0;  
  104.   
  105. }  
  106.   
  107. /************************************* 
  108. * int ListUsers(LPWSTR pszServerName) 
  109. * 功能    列举用户 
  110. * 参数    szServerName,主机名,如果为本机,设置为NULL 
  111. **************************************/  
  112. int ListUsers(LPWSTR pszServerName)  
  113. {  
  114.     LPUSER_INFO_0 pBuf = NULL;  
  115.     LPUSER_INFO_0 pTmpBuf;  
  116.     DWORD dwLevel = 0;  
  117.     DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;  
  118.     DWORD dwEntriesRead = 0;  
  119.     DWORD dwTotalEntries = 0;  
  120.     DWORD dwResumeHandle = 0;  
  121.     DWORD i;  
  122.     DWORD dwTotalCount = 0;  
  123.     NET_API_STATUS nStatus;  
  124.   
  125.     // 循环,直到可以成功调用 NetUserEnum  
  126.     do   
  127.     {  
  128.         // 调用NetUserEnum函数  
  129.         nStatus = NetUserEnum(pszServerName,  
  130.             dwLevel,// 这里设置为0,使用 LPUSER_INFO_0 返回结果  
  131.             FILTER_NORMAL_ACCOUNT, // 只列举“正常”类型的用户  
  132.             (LPBYTE*)&pBuf,// LPUSER_INFO_0 保存返回结果  
  133.             // MAX_PREFERRED_LENGTH,内存由API分配,需要在之后调用NetApiBufferFree释放  
  134.             dwPrefMaxLen,  
  135.             &dwEntriesRead,// 读了的 Entries  
  136.             &dwTotalEntries,// 一共的 Entries  
  137.             &dwResumeHandle);  
  138.         // 判断是否成功  
  139.         if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))  
  140.         {  
  141.             if ((pTmpBuf = pBuf) != NULL)  
  142.             {  
  143.                 // 循环读取用户信息  
  144.                 for (i = 0; (i < dwEntriesRead); i++)  
  145.                 {  
  146.                     assert(pTmpBuf != NULL);  
  147.   
  148.                     if (pTmpBuf == NULL)  
  149.                     {  
  150.                         fprintf(stderr, "An access violation has occurred\n");  
  151.                         break;  
  152.                     }  
  153.                     // 输出  
  154.                     wprintf(L"\t-- %s\n", pTmpBuf->usri0_name);  
  155.                     // 下一个  
  156.                     pTmpBuf++;  
  157.                     dwTotalCount++;  
  158.                 }  
  159.             }  
  160.         }  
  161.         else  
  162.             fprintf(stderr, "A system error has occurred: %d\n", nStatus);  
  163.         // 释放内存  
  164.         if (pBuf != NULL)  
  165.         {  
  166.             NetApiBufferFree(pBuf);  
  167.             pBuf = NULL;  
  168.         }  
  169.     }  
  170.     while (nStatus == ERROR_MORE_DATA); // end do  
  171.   
  172.     // 释放内存  
  173.     if (pBuf != NULL)  
  174.         NetApiBufferFree(pBuf);  
  175.   
  176.     fprintf(stderr, "Total of %d users\n\n", dwTotalCount);  
  177.   
  178.     return 0;  
  179. }  
  180.   
  181. /************************************* 
  182. * int ListGroup(LPWSTR pszServerName) 
  183. * 功能    列举用户组 
  184. * 参数    szServerName,主机名,如果为本机,设置为NULL 
  185. **************************************/  
  186. int ListGroup(LPWSTR pszServerName)  
  187. {  
  188.   
  189.     DWORD dwLevel = 0;  
  190.     DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;  
  191.     DWORD dwEntriesRead = 0;  
  192.     DWORD dwTotalEntries = 0;  
  193.     DWORD dwResumeHandle = 0;  
  194.     DWORD i;  
  195.     DWORD dwTotalCount = 0;  
  196.     NET_API_STATUS nStatus;  
  197.   
  198.   
  199.     LPLOCALGROUP_INFO_0 pBuf = NULL;  
  200.     LPLOCALGROUP_INFO_0 pTmpBuf;  
  201.   
  202.     do // begin do  
  203.     {  
  204.         // 调用NetLocalGroupEnum 参数设置与NetLocalGroup类似  
  205.         nStatus = NetLocalGroupEnum(  
  206.             pszServerName,  
  207.             0,  
  208.             (LPBYTE*)&pBuf,  
  209.             dwPrefMaxLen,  
  210.             &dwEntriesRead,  
  211.             &dwTotalEntries,  
  212.             &dwResumeHandle);  
  213.         // 判断结果  
  214.         if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))  
  215.         {  
  216.             if ((pTmpBuf = pBuf) != NULL)  
  217.             {  
  218.                 // 循环输出  
  219.                 for (i = 0; (i < dwEntriesRead); i++)  
  220.                 {  
  221.                     assert(pTmpBuf != NULL);  
  222.   
  223.                     if (pTmpBuf == NULL)  
  224.                     {  
  225.                         fprintf(stderr, "An access violation has occurred\n");  
  226.                         break;  
  227.                     }  
  228.   
  229.                     wprintf(L"\t-- %s\n", pTmpBuf->lgrpi0_name);  
  230.                     pTmpBuf++;  
  231.                     dwTotalCount++;  
  232.                 }  
  233.             }  
  234.         }  
  235.   
  236.         else  
  237.             fprintf(stderr, "A system error has occurred: %d\n", nStatus);  
  238.         // 释放内存  
  239.         if (pBuf != NULL)  
  240.         {  
  241.             NetApiBufferFree(pBuf);  
  242.             pBuf = NULL;  
  243.         }  
  244.     }  
  245.   
  246.     while (nStatus == ERROR_MORE_DATA); // end do  
  247.   
  248.     if (pBuf != NULL)  
  249.         NetApiBufferFree(pBuf);  
  250.   
  251.     fprintf(stderr, "Total of %d groups\n\n", dwTotalCount);  
  252.   
  253.     return 0;  
  254. }  
  255.   
  256. /************************************* 
  257. * ShowUsersInfo 
  258. * 功能    显示指定用户的信息 
  259. * 参数    szServerName,主机名,如果为本机,设置为NULL 
  260. *           pszUserName,用户名 
  261. **************************************/  
  262. int ShowUsersInfo(LPWSTR pszServerName,LPWSTR pszUserName)  
  263. {  
  264.   
  265.     DWORD dwLevel = 4;// 使用 LPUSER_INFO_4 返回结果  
  266.     LPUSER_INFO_4 pBuf = NULL;  
  267.     NET_API_STATUS nStatus;  
  268.   
  269.     nStatus = NetUserGetInfo(pszServerName,  
  270.         pszUserName,  
  271.         dwLevel,    // pBuf参数类型  
  272.         (LPBYTE *)&pBuf);  
  273.       
  274.     // 判断并输出结果  
  275.     if (nStatus == NERR_Success)  
  276.     {  
  277.         if (pBuf != NULL)  
  278.         {  
  279.             wprintf(L"\n\tAccount:      %s\n", pBuf->usri4_name);  
  280.             wprintf(L"\tComment:      %s\n", pBuf->usri4_comment);  
  281.             wprintf(L"\tUser comment: %s\n", pBuf->usri4_usr_comment);  
  282.             wprintf(L"\tFull name:    %s\n", pBuf->usri4_full_name);  
  283.             wprintf(L"\tpriv:    %d\n", pBuf->usri4_priv);  
  284.         }  
  285.     }  
  286.   
  287.     else  
  288.         fprintf(stderr, "A system error has occurred: %d\n", nStatus);  
  289.     // 释放内存  
  290.     if (pBuf != NULL)  
  291.         NetApiBufferFree(pBuf);  
  292.     return 0;  
  293.   
  294. }  
  295.   
  296. /************************************* 
  297. * wmain 
  298. * 功能    入口函数,根据参数判断需要调用的功能函数 
  299. * 参数    参见usage输出 
  300. **************************************/  
  301. int __cdecl wmain(int ac, wchar_t * av[])  
  302. {  
  303.   
  304.     if (ac == 4 && lstrcmpW( av[1], L"-a") == 0)  
  305.     {  
  306.         AddUser(NULL, av[2], av[3]);  
  307.     }  
  308.   
  309.     else if (ac == 4 && lstrcmpW( av[1], L"-g") == 0)  
  310.     {  
  311.         AddUserToGroup(NULL, av[2], av[3]);  
  312.     }  
  313.     else    if (ac == 3 && lstrcmpW( av[1], L"-i") == 0)  
  314.     {  
  315.         ShowUsersInfo(NULL, av[2]);  
  316.     }  
  317.     else    if (ac == 2 && lstrcmpW( av[1], L"-i") == 0)  
  318.     {  
  319.         ListUsers(NULL);  
  320.         ListGroup(NULL);  
  321.     }  
  322.     else    if (ac == 3 && lstrcmpW( av[1], L"-d") == 0)  
  323.     {  
  324.         DelUser(NULL, av[2]);  
  325.     }  
  326.     else  
  327.     {  
  328.         printf("usage: \n"  
  329.             "\t %ws -a <username> <password> to add a user\n"  
  330.             "\t %ws -g <username> <group> add a user to a group"  
  331.             "\t %ws -i <username> to show user info\n"  
  332.             "\t %ws -d <username> to del a user\n",   
  333.             av[0], av[0], av[0], av[0]);  
  334.     }  
  335.     return 0;  


原创粉丝点击