方法一:尝试修改用户密码,如果成功,则用户帐户密码为空,否则不为空。 方法二:尝试登录用户。 开发语言:VC 实现函数: #include <Windows.h> #include <LM.h> #include <strsafe.h> #pragma comment(lib, "Netapi32.lib") /* 方法一: 功能:判断用户密码是否为空 参数说明: domainname:主机名,如果为NULL,则为当前登录的计算机 username:要测试的用户帐户,如果为NULL,则为当前登录的用户 返回值: 1:用户密码为空 0:用户密码不为空 -1:其它错误,可能的错误有 ERROR_ACCESS_DENIED NERR_InvalidComputer NERR_NotPrimary NERR_UserNotFound 说明: 使用NetUserChangePassword尝试修改密码,如果成功,则表示用户帐户密码为空。 */ INT AccountIsEmptyPassword(const WCHAR* domainname, const WCHAR* username) { NET_API_STATUS dwStatus; dwStatus = ::NetUserChangePassword(domainname, username, L"", L""); if ((dwStatus == NERR_Success) || (dwStatus == NERR_PasswordTooShort)) { // 密码为空 return 1; } else if(dwStatus == ERROR_INVALID_PASSWORD) { // 密码不为空 return 0; } else { // 其它错误 return -1; } } /* 方法二:(同事喻立久发明) 功能:判断用户密码是否为空 参数说明: domainname:主机名,如果为TEXT("."),则为本地计算机 username:要测试的用户帐户,如果为NULL,则为当前登录的用户 返回值: 1:用户密码为空 0:用户密码不为空或者错误的用户名 -1:其它错误 ERROR_ACCOUNT_DISABLED 帐户被禁用 说明: 使用LogonUser尝试登录系统。 缺点:不能判断被禁用的用户 */ INT AccountIsEmptyPassword2(const TCHAR* domainname, const TCHAR* username) { HANDLE hToken = NULL; TCHAR szUserName[UNLEN + 1]; DWORD dwErr; if (username == NULL) { // 获取当前线程用户 DWORD dwCchSize = UNLEN + 1; ::GetUserName(szUserName, &dwCchSize); } else { StringCchCopy(szUserName, UNLEN + 1, username); } ::LogonUser(szUserName, domainname, TEXT(""), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken); dwErr = ::GetLastError(); if (dwErr == ERROR_ACCOUNT_RESTRICTION) { // 密码为空 return 1; } else if(dwErr == ERROR_ACCOUNT_DISABLED) { // 帐户被禁用 return -1; } else { // 不知道的用户名或者错误的密码 return 0; } } 调用示例: void main(void) { INT iStatus; // 判断本地计算机当前登录用户密码是否为空 for (INT i = 0; i < 2; i++) { if (i == 0) { printf("方法一:/n"); iStatus = AccountIsEmptyPassword(NULL, NULL); } else { printf("/n方法二:/n"); iStatus = AccountIsEmptyPassword2(TEXT("."), NULL); } if (iStatus == 1) { printf("是空密码!/n"); } else if (iStatus == 0) { printf("不是空密码!/n"); } else { printf("函数错误!/n"); } } }