使用 Win32 API 的 Windows“真实”用户列表

Posted

技术标签:

【中文标题】使用 Win32 API 的 Windows“真实”用户列表【英文标题】:List of Windows "real" users using Win32 API 【发布时间】:2011-02-08 10:24:48 【问题描述】:

我正在尝试获取本地计算机上的真实用户列表。真正的我的意思是用户 可以物理登录系统并使用它,不包括仅限远程帐户等。

这是我已经做的。

使用FILTER_NORMAL_ACCOUNT 致电NetUserEnum()

我有以下用户:

__ vmware_user __ 管理员 帮助助理 ASPNET 客人 支持_xxxxxx

请注意,这与我从命令行调用 net user 时获得的用户相同, 但在登录对话框中我只能选择管理员。这就是我想要的。

NetUserEnum() 的返回列表中,我可以知道哪些帐户被禁用。剩下的:

__ vmware_user __ 管理员 ASPNET 支持_xxxxxx

然后我运行LsaEnumerateAccountRights() 来检查哪些帐户拥有 SeInteractiveLogonRight。

他们都有。除了真正的,管理员。其中一些具有 SeDenyInteractiveLogonRight。 这给我留下了:

__ vmware_user __ 管理员(无 SeInteractiveLogonRight)

我发现某处可能我应该首先检查组权限,因为我的用户帐户可能继承了 SeInteractiveLogonRight。到目前为止,我还没有找到一种方法来列出给定帐户(SID 或名称)的组。尝试使用NetUserGetGroups(),但事实证明这个只返回域组(在我的情况下,“无”)。

现在我不知道还能尝试什么。如果我有一个“访问令牌”,看起来一切都会变得更容易,但除了当前登录的用户之外,似乎没有办法获得它。 大约有 20 种不同的与身份验证相关的 API,这太疯狂了。

感谢您的帮助

【问题讨论】:

【参考方案1】:

如您所说,最后一步可能只是过滤属于管理员或用户组的用户。

尝试NetUserGetLocalGroups的方法来枚举用户所属的组。

【讨论】:

谢谢,成功了!我完全错过了这个 NetUserGetLocalGroups() 函数。 为了记录,我对问题的最终解决方案是使用此功能列出用户组,然后保留属于用户或管理员组的用户。我正在检查禁用本地登录的用户/组的权限,但结果是 Windows 将这些用户包含在登录列表中(尽管您实际上无法登录,因为它们已被禁用)。

以上是关于使用 Win32 API 的 Windows“真实”用户列表的主要内容,如果未能解决你的问题,请参考以下文章

当前 Windows 版本中的 Win32 API 是不是仍然“原生”?

win32API多线程编程

使用 Win32/C++ API 更改 Windows 7 壁纸(操作未实现异常)

WIN32是啥啊

如何使用 WIN32 C/C++ API 告诉 Windows 10 平铺、居中或拉伸桌面壁纸?

win32 api是啥