- Win32: enumerate users using WTS-API. NOTE: This makes GKrellM require Win XP or newer, code for Win 2k is still present though (depends on value of _WIN32_WINNT)

This commit is contained in:
Stefan Gehn 2009-12-26 15:11:13 +00:00
parent 0cc981108b
commit a7ea973741
3 changed files with 55 additions and 4 deletions

View File

@ -169,10 +169,10 @@ endif
windows: libgkrellmd.a windows: libgkrellmd.a
$(MAKE) \ $(MAKE) \
CFLAGS="${CFLAGS} -D_WIN32_WINNT=0x0500 -DWINVER=0x0500" \ CFLAGS="${CFLAGS} -D_WIN32_WINNT=0x0501 -DWINVER=0x0501" \
LINK_FLAGS="${LINK_FLAGS} -mconsole" \ LINK_FLAGS="${LINK_FLAGS} -mconsole" \
EXTRAOBJS="win32-resource.o win32-plugin.o" \ EXTRAOBJS="win32-resource.o win32-plugin.o" \
SYS_LIBS=" -llargeint -lws2_32 -lpdh -lnetapi32 -liphlpapi -lntdll -lintl" \ SYS_LIBS=" -llargeint -lws2_32 -lwtsapi32 -lpdh -lnetapi32 -liphlpapi -lntdll -lintl" \
gkrellmd gkrellmd
install: install_bin install_inc install_man install: install_bin install_inc install_man

View File

@ -196,10 +196,10 @@ solaris:
windows: libgkrellm.a windows: libgkrellm.a
$(MAKE) \ $(MAKE) \
CFLAGS="${CFLAGS} -D_WIN32_WINNT=0x0500 -DWINVER=0x0500" \ CFLAGS="${CFLAGS} -D_WIN32_WINNT=0x0501 -DWINVER=0x0501" \
LINK_FLAGS="${LINK_FLAGS} -mwindows" \ LINK_FLAGS="${LINK_FLAGS} -mwindows" \
EXTRAOBJS="${EXTRAOBJS} winops-win32.o win32-plugin.o win32-resource.o" \ EXTRAOBJS="${EXTRAOBJS} winops-win32.o win32-plugin.o win32-resource.o" \
SYS_LIBS=" -llargeint -lws2_32 -lpdh -lnetapi32 -liphlpapi -lntdll -lintl" \ SYS_LIBS=" -llargeint -lws2_32 -lwtsapi32 -lpdh -lnetapi32 -liphlpapi -lntdll -lintl" \
SMC_LIBS="" \ SMC_LIBS="" \
UNIXOBJS="" \ UNIXOBJS="" \
gkrellm gkrellm

View File

@ -122,6 +122,7 @@ static PDH_HQUERY pdhQueryHandle = NULL;
static const wchar_t* PDHDLL = L"PDH.DLL"; static const wchar_t* PDHDLL = L"PDH.DLL";
static const wchar_t* NTDLL = L"NTDLL.DLL"; static const wchar_t* NTDLL = L"NTDLL.DLL";
static const wchar_t* WTSAPI32 = L"WTSAPI32.DLL";
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -1490,12 +1491,61 @@ gkrellm_sys_proc_read_data(void)
num_forks /*n_forks*/, fload); num_forks /*n_forks*/, fload);
} }
#if _WIN32_WINNT >= 0x501 // Windows XP or newer
#include <wtsapi32.h>
typedef struct _WTS_SESSION_INFO {
DWORD SessionId;
LPTSTR pWinStationName;
WTS_CONNECTSTATE_CLASS State;
} WTS_SESSION_INFO, *PWTS_SESSION_INFO;
BOOL WINAPI WTSEnumerateSessionsW(
HANDLE hServer,
DWORD Reserved,
DWORD Version,
PWTS_SESSION_INFO *ppSessionInfo,
DWORD *pCount);
#endif // _WIN32_WINNT >= 0x501
void void
gkrellm_sys_proc_read_users(void) gkrellm_sys_proc_read_users(void)
{ {
gint i; gint i;
// Number of interactive users // Number of interactive users
gint n_users = 0; gint n_users = 0;
#if _WIN32_WINNT >= 0x501 // Windows XP or newer
BOOL ret;
WTS_SESSION_INFO *pSessionList = NULL;
DWORD sessionListCount = 0;
WTS_SESSION_INFO *pSession = NULL;
gkrellm_debug(DEBUG_SYSDEP, "Enumerating terminal sessions...\n");
// Returns list of terminal sessions in pSessionInfo[]
ret = WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionList,
&sessionListCount);
if (!ret)
{
win32_warning(WTSAPI32,
GetLastError(),
"Enumerating terminal sessions failed");
}
else if (pSessionList != NULL)
{
gkrellm_debug(DEBUG_SYSDEP, "Found %d terminal sessions\n", sessionListCount);
for (i = 0; i < sessionListCount; i++)
{
pSession = &pSessionList[i];
gkrellm_debug(DEBUG_SYSDEP, "Session %d (%ls) has state %d\n",
pSession->SessionId, pSession->pWinStationName, pSession->State);
if (pSession->State == WTSActive)
n_users++;
}
WTSFreeMemory(pSessionList);
}
#else // TODO: Remove this code-branch if nobody wants win2k-support anymore
// Return value for Lsa functions // Return value for Lsa functions
NTSTATUS ntstatus; NTSTATUS ntstatus;
// Arguments for LsaEnumerateLogonSessions() // Arguments for LsaEnumerateLogonSessions()
@ -1575,6 +1625,7 @@ gkrellm_sys_proc_read_users(void)
// Free LUID list provided by OS, even if function returned an error before // Free LUID list provided by OS, even if function returned an error before
pfLFRB(pSessions); pfLFRB(pSessions);
#endif
gkrellm_proc_assign_users(n_users); gkrellm_proc_assign_users(n_users);
} }