如何获得Windows会话名称?

Windows有一个cmd“ 查询会话 ”,它显示有关terminal服务器上会话的信息,包括“会话名”。

我想使用Windows API —— LsaEnumerateLogonSessionsLsaGetLogonSessionData来获取这样的会话信息:

int main() { int i = 0; ULONG count = 0; PLUID list = NULL; PSECURITY_LOGON_SESSION_DATA data; LsaEnumerateLogonSessions(&count, &list); for (i = 0; i < (int)count; i++) { LsaGetLogonSessionData(&list[i], &data); } return 0; } 

我可以得到一个SECURITY_LOGON_SESSION_DATA结构体:

 typedef struct _SECURITY_LOGON_SESSION_DATA { ULONG Size; LUID LogonId; LSA_UNICODE_STRING UserName; LSA_UNICODE_STRING LogonDomain; LSA_UNICODE_STRING AuthenticationPackage; ULONG LogonType; ULONG Session; PSID Sid; LARGE_INTEGER LogonTime; LSA_UNICODE_STRING LogonServer; LSA_UNICODE_STRING DnsDomainName; LSA_UNICODE_STRING Upn; ULONG UserFlags; LSA_LAST_INTER_LOGON_INFO LastLogonInfo; LSA_UNICODE_STRING LogonScript; LSA_UNICODE_STRING ProfilePath; LSA_UNICODE_STRING HomeDirectory; LSA_UNICODE_STRING HomeDirectoryDrive; LARGE_INTEGER LogoffTime; LARGE_INTEGER KickOffTime; LARGE_INTEGER PasswordLastSet; LARGE_INTEGER PasswordCanChange; LARGE_INTEGER PasswordMustChange; } SECURITY_LOGON_SESSION_DATA, *PSECURITY_LOGON_SESSION_DATA; 

但是它不包含会话名

任何想法如何获得“sessonname”?

“会话名称”在API文档中被称为“winstation名称”(非常容易混淆,因为它绝对不是Window Station,因为docs 道歉 )。

WTSQuerySessionInformation (WTSWinStationName)将使用标准WTS功能为您提供。

我不知道你为什么使用LsaEnumerateLogonSessions ,因为它不仅会返回会话,还会返回任何登录,包括没有创建会话的网络登录。 如果您有某些需要LUID的特殊原因,则必须筛选列表,挑选那些Session成员不为零的地方,然后对其执行WTSQuerySessionInformation以获取该winstation名称。 或者,您可以筛选LogonType是四种交互类型之一的所有登录。 甚至在Vista和后来的控制台也可以在会话0上,这在XP上是正常的,所以还要记得检查会话0和WTSGetActiveConsoleSessionId ,以确保你已经包含在你的列表中的所有会话感兴趣。这将是简单得多,我怀疑只是使用WTSEnumerateSessions功能!

WTSEnumerateSessions或WTSQuerySessionInformation