Ver Fonte

Make check_users work on Windows.

Gunnar Beutner há 11 anos atrás
pai
commit
6f08ee10f4
2 ficheiros alterados com 42 adições e 4 exclusões
  1. 1 1
      plugins/Makefile.am
  2. 41 3
      plugins/check_users.c

+ 1 - 1
plugins/Makefile.am

@@ -107,7 +107,7 @@ check_tcp_LDADD = $(SSLOBJS)
 check_time_LDADD = $(NETLIBS)
 check_time_LDADD = $(NETLIBS)
 check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
 check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
 check_ups_LDADD = $(NETLIBS)
 check_ups_LDADD = $(NETLIBS)
-check_users_LDADD = $(BASEOBJS)
+check_users_LDADD = $(BASEOBJS) $(WTSAPI32LIBS)
 check_uptime_LDADD = $(BASEOBJS) -lrt
 check_uptime_LDADD = $(BASEOBJS) -lrt
 check_by_ssh_LDADD = $(NETLIBS)
 check_by_ssh_LDADD = $(NETLIBS)
 check_ide_smart_LDADD = $(BASEOBJS)
 check_ide_smart_LDADD = $(BASEOBJS)

+ 41 - 3
plugins/check_users.c

@@ -37,7 +37,12 @@ const char *email = "devel@nagios-plugins.org";
 #include "common.h"
 #include "common.h"
 #include "utils.h"
 #include "utils.h"
 
 
-#if HAVE_UTMPX_H
+#if HAVE_WTSAPI32_H
+# include <windows.h>
+# include <wtsapi32.h>
+# undef ERROR
+# define ERROR -1
+#elif HAVE_UTMPX_H
 # include <utmpx.h>
 # include <utmpx.h>
 #else
 #else
 # include "popen.h"
 # include "popen.h"
@@ -58,7 +63,11 @@ main (int argc, char **argv)
 	int users = -1;
 	int users = -1;
 	int result = STATE_UNKNOWN;
 	int result = STATE_UNKNOWN;
 	char *perf;
 	char *perf;
-#if HAVE_UTMPX_H
+#if HAVE_WTSAPI32_H
+	WTS_SESSION_INFO *wtsinfo;
+	DWORD wtscount;
+	DWORD index;
+#elif HAVE_UTMPX_H
 	struct utmpx *putmpx;
 	struct utmpx *putmpx;
 #else
 #else
 	char input_buffer[MAX_INPUT_BUFFER];
 	char input_buffer[MAX_INPUT_BUFFER];
@@ -78,7 +87,36 @@ main (int argc, char **argv)
 
 
 	users = 0;
 	users = 0;
 
 
-#if HAVE_UTMPX_H
+#if HAVE_WTSAPI32_H
+	if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,
+	  0, 1, &wtsinfo, &wtscount)) {
+		printf(_("Could not enumerate RD sessions: %d\n"), GetLastError());
+		return STATE_UNKNOWN;
+	}
+
+	for (index = 0; index < wtscount; index++) {
+		LPTSTR username;
+		DWORD size;
+		int len;
+
+		if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,
+		  wtsinfo[index].SessionId, WTSUserName, &username, &size))
+			continue;
+
+		len = lstrlen(username);
+
+		WTSFreeMemory(username);
+
+		if (len == 0)
+			continue;
+
+		if (wtsinfo[index].State == WTSActive ||
+		  wtsinfo[index].State == WTSDisconnected)
+			users++;
+	}
+
+	WTSFreeMemory(wtsinfo);
+#elif HAVE_UTMPX_H
 	/* get currently logged users from utmpx */
 	/* get currently logged users from utmpx */
 	setutxent ();
 	setutxent ();