Files
fastfetch/src/detection/users/users_windows.c
T

62 lines
2.3 KiB
C
Raw Normal View History

2022-11-23 19:11:10 +08:00
#include "users.h"
2026-01-06 09:48:38 +08:00
#include "common/windows/unicode.h"
#include "common/time.h"
2022-11-23 19:11:10 +08:00
2023-03-24 23:21:39 +08:00
#include <windows.h>
2022-11-23 19:11:10 +08:00
#include <wtsapi32.h>
2025-03-31 23:41:54 +08:00
#include <ws2tcpip.h>
2022-11-23 19:11:10 +08:00
2026-03-29 09:28:49 +08:00
const char* ffDetectUsers(FFUsersOptions* options, FFlist* users) {
2022-11-23 19:11:10 +08:00
WTS_SESSION_INFO_1W* sessionInfo;
DWORD sessionCount;
DWORD level = 1;
2026-03-29 09:28:49 +08:00
if (!WTSEnumerateSessionsExW(WTS_CURRENT_SERVER_HANDLE, &level, 0, &sessionInfo, &sessionCount)) {
2023-09-08 00:07:14 +08:00
return "WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE) failed";
2026-03-29 09:28:49 +08:00
}
2022-11-23 19:11:10 +08:00
2026-03-29 09:28:49 +08:00
for (DWORD i = 0; i < sessionCount; i++) {
2022-11-23 19:11:10 +08:00
WTS_SESSION_INFO_1W* session = &sessionInfo[i];
2026-03-29 09:28:49 +08:00
if (session->State != WTSActive) {
2024-06-12 14:02:35 +08:00
continue;
2026-03-29 09:28:49 +08:00
}
2024-06-12 14:02:35 +08:00
FF_STRBUF_AUTO_DESTROY userName = ffStrbufCreateWS(session->pUserName);
2026-03-29 09:28:49 +08:00
if (options->myselfOnly && !ffStrbufEqual(&instance.state.platform.userName, &userName)) {
2022-11-23 19:11:10 +08:00
continue;
2026-03-29 09:28:49 +08:00
}
2022-11-23 19:11:10 +08:00
2026-04-14 10:41:18 +08:00
FFUserResult* user = FF_LIST_ADD(FFUserResult, *users);
2024-06-12 14:02:35 +08:00
ffStrbufInitMove(&user->name, &userName);
2023-09-08 14:32:01 +08:00
ffStrbufInitWS(&user->hostName, session->pHostName);
ffStrbufInitWS(&user->sessionName, session->pSessionName);
ffStrbufInit(&user->clientIp);
user->loginTime = 0;
2023-09-08 00:07:14 +08:00
DWORD bytes = 0;
2026-07-10 18:08:04 +08:00
PWTS_CLIENT_ADDRESS address = nullptr;
2026-03-29 09:28:49 +08:00
if (WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSClientAddress, (LPWSTR*) &address, &bytes)) {
if (address->AddressFamily == AF_INET) {
ffStrbufSetF(&user->clientIp, "%u.%u.%u.%u", address->Address[2], address->Address[3], address->Address[4], address->Address[5]);
2026-03-29 09:28:49 +08:00
} else if (address->AddressFamily == AF_INET6) {
2025-03-31 23:41:54 +08:00
char ipStr[INET6_ADDRSTRLEN];
2026-03-29 09:28:49 +08:00
const char* end = RtlIpv6AddressToStringA((const IN6_ADDR*) address->Address, ipStr);
2026-03-18 18:36:41 +08:00
ffStrbufSetNS(&user->clientIp, (uint32_t) (end - ipStr), ipStr);
2025-03-31 23:41:54 +08:00
}
2023-09-08 00:07:14 +08:00
WTSFreeMemory(address);
}
bytes = 0;
2026-07-10 18:08:04 +08:00
PWTSINFOW wtsInfo = nullptr;
2026-03-29 09:28:49 +08:00
if (WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSSessionInfo, (LPWSTR*) &wtsInfo, &bytes)) {
user->loginTime = ffFileTimeToUnixMs((uint64_t) wtsInfo->LogonTime.QuadPart);
2023-09-08 00:07:14 +08:00
WTSFreeMemory(wtsInfo);
}
2022-11-23 19:11:10 +08:00
}
2022-12-31 17:35:25 +08:00
WTSFreeMemoryExW(WTSTypeSessionInfoLevel1, sessionInfo, 1);
2022-11-23 19:11:10 +08:00
2026-07-10 18:08:04 +08:00
return nullptr;
2022-11-23 19:11:10 +08:00
}