C 获取与桌面关联的已登录Windows用户名

C 获取与桌面关联的已登录Windows用户名,c,windows,winapi,desktop,C,Windows,Winapi,Desktop,我希望枚举系统中的所有桌面,并获取该桌面的登录用户名。到目前为止,我有以下代码snippit作为获取HDESK句柄并尝试确定与之关联的用户名(如果有)的示例,但是调用LookupAccountSid失败,错误为\u NONE\u MAPPED(“没有完成帐户名和安全ID之间的映射”) 这可能是因为我正在通过GetUserObjectInformation而不是用户SID提取登录SID。如果是,我可以将其转换为登录用户SID吗 有人能告诉我一个正确的方向来获取任意桌面的登录用户名吗(通过各自的HD

我希望枚举系统中的所有桌面,并获取该桌面的登录用户名。到目前为止,我有以下代码snippit作为获取HDESK句柄并尝试确定与之关联的用户名(如果有)的示例,但是调用LookupAccountSid失败,错误为\u NONE\u MAPPED(“没有完成帐户名和安全ID之间的映射”)

这可能是因为我正在通过GetUserObjectInformation而不是用户SID提取登录SID。如果是,我可以将其转换为登录用户SID吗


有人能告诉我一个正确的方向来获取任意桌面的登录用户名吗(通过各自的HDESK或HNWD句柄,甚至是桌面的stations Hwinta句柄)?提前谢谢。

如果你想要的是用户信息,那么这就行了

调用WTSEnumerateSessions以获取WTS_SESSION_信息结构数组。对于每个结构,将SessionId成员传递给WTSQuerySessionInformation,并将WTSInfoClass成员设置为WTSUserName。这将为您提供与会话关联的用户的名称(如果有)

或者,您可以将WTSInfoClass设置为WTSSessionInfo,并返回WTSINFO结构。这包含很多信息,包括用户名和域。尽管MSDN页面是错误的,但请查看WTSINFO的头文件定义

您必须调用WTSEnumerateSessions两次,一次用于获取所需的缓冲区大小,然后一次用于获取信息


关系:一个或多个桌面对象位于Windows工作站中。Windows工作站与会话相关联。

问题是台式机根本与用户无关。尝试使用psexec在系统帐户下运行记事本。它运行在你的窗口站上,在你的桌面上。否则,你就看不见了


但是如果您想获得与窗口站关联的会话,那么是的,这是可能的。您需要使用ObjectNameInformation调用以获取对象的名称。例如,我得到的是:
\Sessions\1\Windows\WindowStations\WinSta0
。这是您的会话ID。

这不是一个解决方案,但它很好地描述了站点/桌面。从

什么是windows工作站? windows工作站是一个安全容器,其中包含剪贴板、一些全局信息和一组或多个桌面。Windows 2000会话将有多个Windows工作站,一个分配给交互用户的登录会话,另一个分配给Winlogon进程、安全屏幕保护程序进程以及在交互用户以外的安全上下文中运行的任何服务。 分配给交互用户登录会话的交互窗口站还包含键盘、鼠标和显示设备。交互式窗口站对用户可见,可以接收用户的输入。所有其他窗口站都是非交互式的,这意味着它们不能对用户可见,也不能接收用户输入

什么是桌面? 桌面是包含在窗口站中的安全容器对象。windows工作站中可能包含许多台式机。
桌面具有逻辑显示表面,包含窗口、菜单和挂钩。只有交互式窗口站的桌面才可见并接收用户输入。在交互式窗口工作站上,一次只有一个桌面处于活动状态。此活动桌面,也称为输入桌面,是用户当前可见并接收用户输入的桌面

您可以从
%USERPROFILE%
环境变量的末尾提取它

nbtstat
,使用机器名或IP地址可以从命令行执行此操作。不过,我已经很久没看了

适用于我的正确代码:

TCHAR username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName((TCHAR*)username, &size);

我正在Windows 7 x86上使用Visual Studio Express 2012

谢谢,这是一个很好的建议,但在尝试之后。虽然我可以列出会话及其关联的用户名(如果有),但会话的站名始终是RDP会话名,而不是windows站名(请参阅中的WTSWinStationName定义)。如果我可以将会话ID链接到windows工作站,虽然这种技术很完美,但我找不到如何链接。@QAZ不起作用,每个会话都有一个winsta0窗口工作站,该窗口工作站具有所有可见窗口(唯一感兴趣的另一个窗口工作站是该会话的安全deaktop)。谢谢,说得好。我确实希望能够让登录的用户进入桌面(如果存在的话),这样结合janglin的回答可能会很有用。我明天会测试并报告。旨在帮助澄清哪些内容包含哪些内容以及它们之间的关系
TCHAR username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName((TCHAR*)username, &size);