Windows有一个cmd“ 查询会话 ”,它显示有关terminal服务器上会话的信息,包括“会话名”。
我想使用Windows API —— LsaEnumerateLogonSessions和LsaGetLogonSessionData来获取这样的会话信息:
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