程序判断Windows用户帐户密码为空的方法

来源:互联网 发布:画画软件手机版 编辑:程序博客网 时间:2024/05/16 06:55

方法一:尝试修改用户密码,如果成功,则用户帐户密码为空,否则不为空。

方法二:尝试登录用户。

开发语言:VC

实现函数:

[cpp] view plain copy
  1. #include <Windows.h>  
  2. #include <LM.h>  
  3. #include <strsafe.h>  
  4.   
  5. #pragma comment(lib, "Netapi32.lib")  
  6.   
  7. /*  
  8. 方法一: 
  9. 功能:判断用户密码是否为空 
  10. 参数说明: 
  11.     domainname:主机名,如果为NULL,则为当前登录的计算机 
  12.     username:要<a href="http://lib.csdn.net/base/softwaretest" class='replace_word' title="软件测试知识库" target='_blank' style='color:#df3434; font-weight:bold;'>测试</a>的用户帐户,如果为NULL,则为当前登录的用户 
  13. 返回值: 
  14.      1:用户密码为空 
  15.      0:用户密码不为空 
  16.     -1:其它错误,可能的错误有 
  17.         ERROR_ACCESS_DENIED 
  18.         NERR_InvalidComputer 
  19.         NERR_NotPrimary 
  20.         NERR_UserNotFound 
  21. 说明: 
  22.     使用NetUserChangePassword尝试修改密码,如果成功,则表示用户帐户密码为空。 
  23. */  
  24. INT AccountIsEmptyPassword(const WCHAR* domainname, const WCHAR* username)  
  25. {  
  26.     NET_API_STATUS dwStatus;  
  27.   
  28.     dwStatus = ::NetUserChangePassword(domainname, username, L"", L"");  
  29.     if ((dwStatus == NERR_Success) || (dwStatus == NERR_PasswordTooShort))  
  30.     {   // 密码为空  
  31.         return 1;  
  32.     }  
  33.     else if(dwStatus == ERROR_INVALID_PASSWORD)  
  34.     {   // 密码不为空  
  35.         return 0;  
  36.     }  
  37.     else  
  38.     {   // 其它错误  
  39.         return -1;  
  40.     }  
  41. }  
  42.   
  43. /*  
  44. 方法二:(同事喻立久发明) 
  45. 功能:判断用户密码是否为空 
  46. 参数说明: 
  47.     domainname:主机名,如果为TEXT("."),则为本地计算机 
  48.     username:要测试的用户帐户,如果为NULL,则为当前登录的用户 
  49. 返回值: 
  50.      1:用户密码为空 
  51.      0:用户密码不为空或者错误的用户名 
  52.     -1:其它错误 
  53.         ERROR_ACCOUNT_DISABLED 帐户被禁用 
  54. 说明: 
  55.     使用LogonUser尝试登录系统。 
  56.     缺点:不能判断被禁用的用户 
  57. */  
  58. INT AccountIsEmptyPassword2(const TCHAR* domainname, const TCHAR* username)  
  59. {  
  60.     HANDLE hToken = NULL;  
  61.     TCHAR szUserName[UNLEN + 1];  
  62.     DWORD dwErr;  
  63.   
  64.     if (username == NULL)  
  65.     {   // 获取当前线程用户  
  66.         DWORD dwCchSize = UNLEN + 1;  
  67.         ::GetUserName(szUserName, &dwCchSize);  
  68.     }  
  69.     else  
  70.     {  
  71.         StringCchCopy(szUserName, UNLEN + 1, username);  
  72.     }  
  73.   
  74.     ::LogonUser(szUserName, domainname, TEXT(""),  LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken);  
  75.     dwErr = ::GetLastError();  
  76.     if (dwErr == ERROR_ACCOUNT_RESTRICTION)  
  77.     {   // 密码为空  
  78.         return 1;  
  79.     }  
  80.     else if(dwErr == ERROR_ACCOUNT_DISABLED)  
  81.     {   // 帐户被禁用  
  82.         return -1;  
  83.     }  
  84.     else  
  85.     {   // 不知道的用户名或者错误的密码  
  86.         return 0;  
  87.     }  
  88. }  

调用示例:

 

[cpp] view plain copy
  1. void main(void)  
  2. {  
  3.     INT iStatus;  
  4.   
  5.     // 判断本地计算机当前登录用户密码是否为空  
  6.     for (INT i = 0; i < 2; i++)  
  7.     {  
  8.         if (i == 0)  
  9.         {  
  10.             printf("方法一:/n");  
  11.             iStatus = AccountIsEmptyPassword(NULL, NULL);  
  12.         }  
  13.         else  
  14.         {  
  15.             printf("/n方法二:/n");  
  16.             iStatus = AccountIsEmptyPassword2(TEXT("."), NULL);  
  17.         }  
  18.   
  19.         if (iStatus == 1)  
  20.         {  
  21.             printf("是空密码!/n");  
  22.         }  
  23.         else if (iStatus == 0)  
  24.         {  
  25.             printf("不是空密码!/n");  
  26.         }  
  27.         else  
  28.         {  
  29.             printf("函数错误!/n");  
  30.         }  
  31.     }  
  32. }  

原创粉丝点击