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

QAZ*_*QAZ 7 c windows winapi desktop

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

HDESK desk = OpenDesktop( "Default", 0, FALSE, READ_CONTROL | DESKTOP_READOBJECTS );

DWORD size = 4096;

SID * sid  = (SID *)malloc( size );

GetUserObjectInformation( desk , UOI_USER_SID, sid, size, &size );

char name[512], domain[512];
int namesz = 512, domainsz = 512;

LookupAccountSid( NULL, sid, &name, &namesz, &domain, &domainsz, &s);
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以指出我正确的方向来获取任意桌面的登录用户名(通过它各自的HDESK或HNWD手柄,甚至是台式机的HWINSTA手柄)?提前致谢.

小智 2

如果您想要的是用户信息,那么这将起作用。

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

或者,您可以将 WTSInfoClass 设置为 WTSSessionInfo 并获取 WTSINFO 结构。其中包含大量信息,包括用户名和域。查看 WTSINFO 的头文件定义,因为 MSDN 页面是错误的。

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

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