如何获取Windows登录界面显示的用户列表并排除隐藏用户
获取Windows登录界面显示的用户列表(排除隐藏账户)
NetUserEnum配合FILTER_NORMAL_ACCOUNT会返回所有普通类型账户,但系统内置的隐藏账户(如DefaultAccount、WDAGUtilityAccount)也会被包含——因为它们的账户类型符合普通账户范畴,但带有隐藏标记。要只获取登录界面实际显示的用户,需要额外检查用户账户的隐藏属性。
核心逻辑
Windows用户账户的隐藏状态由USER_INFO_4结构中usri4_flags字段的USER_HIDDEN位标记:该位被设置时,账户不会在登录界面显示。因此实现步骤为:
- 枚举所有普通类型账户
- 对每个账户获取详细信息,检查
USER_HIDDEN标志 - 过滤掉带有该标志的账户
修改后的代码示例
#include <windows.h> #include <lm.h> #include <iostream> #pragma comment(lib, "Netapi32.lib") void PrintUserList() { USER_INFO_0* pUserInfo = NULL; DWORD dwLevel = 0; DWORD dwCount = 0; DWORD dwTotalEntries = 0; NET_API_STATUS nStatus; // 枚举所有普通类型账户 nStatus = NetUserEnum(NULL, dwLevel, FILTER_NORMAL_ACCOUNT, (LPBYTE*)&pUserInfo, MAX_PREFERRED_LENGTH, &dwTotalEntries, &dwCount, NULL); if (nStatus == NERR_Success && pUserInfo != NULL) { for (DWORD i = 0; i < dwTotalEntries; ++i) { LPCWSTR username = pUserInfo[i].usri0_name; USER_INFO_4* pUserDetail = NULL; // 获取用户详细信息(USER_INFO_4包含账户标志位) nStatus = NetUserGetInfo(NULL, username, 4, (LPBYTE*)&pUserDetail); if (nStatus == NERR_Success && pUserDetail != NULL) { // 检查是否带有USER_HIDDEN标志,无该标志则为登录界面显示用户 if (!(pUserDetail->usri4_flags & USER_HIDDEN)) { std::wcout << L"登录界面显示用户: " << username << std::endl; } NetApiBufferFree(pUserDetail); } } NetApiBufferFree(pUserInfo); } else { std::wcerr << L"枚举用户失败,错误码: " << nStatus << std::endl; } } int main() { PrintUserList(); return 0; }
关键说明
USER_HIDDEN是定义在lmaccess.h中的标志位,值为0x00000080- 手动设置为隐藏的用户、系统内置的特殊隐藏账户都会被该逻辑过滤
- Administrator账户默认可能被隐藏,若需显示需先开启系统的"显示管理员账户"设置,此时该账户的
USER_HIDDEN标志会被清除
内容的提问来源于stack exchange,提问作者Joe J
相关产品推荐
相关产品推荐

