c - 如何获取 Windows session 名称?

标签 c windows session

Windows 有一个命令“query session”,它显示有关终端服务器上 session 的信息,包括“sessionname”。

我想使用 Windows API------LsaEnumerateLogonSessionsLsaGetLogonSessionData 来获取这些 session 信息,如下所示:

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;

但它不包含sessionname!

关于如何获取“sessonname”的任何想法?

最佳答案

“ session 名称”在 API 文档中称为“winstation 名称”(非常令人困惑,因为它绝对不是 Window Station,如文档 apologize 所示)。

WTSQuerySessionInformation (WTSWinStationName) 将使用标准 WTS 函数为您获取它。

我不确定您为什么要使用 LsaEnumerateLogonSessions,因为它不仅会返回 session ,还会返回任何登录,包括尚未创建 session 的网络登录。如果您有某些特殊原因需要 LUID,则必须过滤列表,挑选出 Session 成员非零的那些,然后对其执行 WTSQuerySessionInformation 以获取 winstation 名称.或者,您可以筛选 LogonType 是四种交互类型之一的所有登录。即使在 Vista 和更高版本上,控制台也可能位于 session 0 上,这在 XP 上是正常的,因此请记住还要检查 session 0 和 WTSGetActiveConsoleSessionId 以确保您已将其包含在您的列出您感兴趣的所有 session 。我怀疑只使用 WTSEnumerateSessions 会简单得多函数!

关于c - 如何获取 Windows session 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985372/

相关文章:

asp.net-mvc - 有没有什么方法可以在不锁定 ASP.Net MVC 站点的情况下使用 session ?

php - 如何处理php代码(在ajax中)而不返回任何值

c++ - 在qt/linux中如何获取ip地址?

c - Arduino 闰秒时钟

windows - 回显文字字符串?

为 Windows(64 位)编译 SQLite

python - 壁纸更换器无法正常工作

c# - 如何检查 session 中是否没有数据表

c - 使用动态库(dlopen)时更改库文件是否可能导致段错误?

c - 与 C 中的 main() 函数不同