248 lines
9.4 KiB
C++
248 lines
9.4 KiB
C++
|
#include <string.h>
|
||
|
#include "tsvs.h"
|
||
|
HANDLE g_hWinstaThread = NULL;
|
||
|
DWORD g_idWinstaThread;
|
||
|
|
||
|
void GetWinStationInfo(void);
|
||
|
/*/
|
||
|
typedef enum _WTS_CONNECTSTATE_CLASS {
|
||
|
WTSActive,
|
||
|
WTSConnected,
|
||
|
WTSConnectQuery,
|
||
|
WTSShadow,
|
||
|
WTSDisconnected,
|
||
|
WTSIdle,
|
||
|
WTSListen,
|
||
|
WTSReset,
|
||
|
WTSDown,
|
||
|
WTSInit,
|
||
|
} WTS_CONNECTSTATE_CLASS;
|
||
|
x
|
||
|
#define ACTIVE 0 // "Active"
|
||
|
#define CONNECTED 1 // "Connected"
|
||
|
#define CONNECTQUERY 2 // "Connect Query"
|
||
|
#define SHADOW 3 // "Shadow"
|
||
|
#define DISCONNECTED 4 // "Disconnected"
|
||
|
#define IDLE 5 // "Idle"
|
||
|
#define LISTEN 6 // "Listen"
|
||
|
#define RESET 7 // "Reset"
|
||
|
#define DOWN 8 // "Down"
|
||
|
#define INIT 9 // "Initializing"
|
||
|
/*/
|
||
|
|
||
|
TCHAR * Status[] =
|
||
|
{
|
||
|
"Active", "Connected", "Connect Query", "Shadow", "Disconnected", \
|
||
|
"Idle", "Listen", "Reset", "Down", "Initializing"
|
||
|
};
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
void GetWinStationInfo(void)
|
||
|
{
|
||
|
UINT i;
|
||
|
WINSTATIONCLIENT ClientData;
|
||
|
ULONG *pNumber;
|
||
|
TCHAR szNumber[10];
|
||
|
int nMcIndex;
|
||
|
int *nConnectState;
|
||
|
DWORD pEventFlags;
|
||
|
static BOOL bInitialized = FALSE;
|
||
|
|
||
|
nMcIndex = 0;
|
||
|
|
||
|
|
||
|
if (bInitialized) {
|
||
|
// wait for someone to log on or off.....
|
||
|
WTSWaitSystemEvent(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
WTS_EVENT_ALL,
|
||
|
//WTS_EVENT_LOGON | WTS_EVENT_LOGOFF,
|
||
|
&pEventFlags
|
||
|
);
|
||
|
//.......................................
|
||
|
}
|
||
|
bInitialized = TRUE;
|
||
|
|
||
|
|
||
|
// count the sessions after a logon
|
||
|
if (WTSEnumerateSessions(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
0,
|
||
|
1,
|
||
|
&ppSessionInfo,
|
||
|
&pCount))
|
||
|
{
|
||
|
// loop through the sessions and save their WTSWinStationNames
|
||
|
for (i = 0; i < pCount; i++)
|
||
|
{
|
||
|
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSWinStationName,
|
||
|
&ppBuffer,
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
if (GetMenuState(g_hMenu, IDM_SHOW_ALL,
|
||
|
MF_BYCOMMAND) == MF_UNCHECKED)
|
||
|
{
|
||
|
if (_tcslen(ppBuffer) > 7) // don't take console or enpty ID's
|
||
|
{
|
||
|
_tcscpy(szMcID[nMcIndex], ppBuffer);
|
||
|
WTSFreeMemory(ppBuffer);
|
||
|
|
||
|
// get domain name
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSDomainName,
|
||
|
&ppBuffer,
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
_tcscpy(szMcNames[nMcIndex], ppBuffer);
|
||
|
if (_tcslen(ppBuffer) > 0)
|
||
|
_tcscat(szMcNames[nMcIndex], "\\");
|
||
|
WTSFreeMemory(ppBuffer); }
|
||
|
|
||
|
// get user name
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSUserName,
|
||
|
&ppBuffer,
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
_tcscat(szMcNames[nMcIndex], ppBuffer);
|
||
|
WTSFreeMemory(ppBuffer);
|
||
|
}
|
||
|
|
||
|
// get IP address
|
||
|
if (WinStationQueryInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WinStationClient,
|
||
|
&ClientData,
|
||
|
sizeof(WINSTATIONCLIENT),
|
||
|
&pBytesReturned ))
|
||
|
{
|
||
|
_tcscpy(szMcAddress[nMcIndex],
|
||
|
ClientData.ClientAddress);
|
||
|
}
|
||
|
|
||
|
// get build number
|
||
|
/*/
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSClientBuildNumber,
|
||
|
(LPTSTR *)(&pNumber),
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
_ltot(*pNumber, szNumber, 10);
|
||
|
_tcscpy(szBuild[nMcIndex], szNumber);
|
||
|
WTSFreeMemory(pNumber);
|
||
|
}
|
||
|
/*/
|
||
|
|
||
|
// get connection state
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSConnectState,
|
||
|
(LPTSTR *)(&nConnectState),
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
_tcscpy(szBuild[nMcIndex], Status[*nConnectState]);
|
||
|
WTSFreeMemory(nConnectState);
|
||
|
} else {
|
||
|
_tcscpy(szBuild[nMcIndex], _T("Unknown"));
|
||
|
}
|
||
|
nMcIndex++;
|
||
|
}
|
||
|
} else { // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
_tcscpy(szMcID[nMcIndex], ppBuffer);
|
||
|
WTSFreeMemory(ppBuffer);
|
||
|
|
||
|
// get domain name
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSDomainName,
|
||
|
&ppBuffer,
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
_tcscpy(szMcNames[nMcIndex], ppBuffer);
|
||
|
if (_tcslen(ppBuffer) > 0)
|
||
|
_tcscat(szMcNames[nMcIndex], "\\");
|
||
|
WTSFreeMemory(ppBuffer);
|
||
|
}
|
||
|
|
||
|
// get user name
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSUserName,
|
||
|
&ppBuffer,
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
_tcscat(szMcNames[nMcIndex], ppBuffer);
|
||
|
WTSFreeMemory(ppBuffer);
|
||
|
}
|
||
|
|
||
|
// get IP address
|
||
|
if (WinStationQueryInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WinStationClient,
|
||
|
&ClientData,
|
||
|
sizeof(WINSTATIONCLIENT),
|
||
|
&pBytesReturned ))
|
||
|
{
|
||
|
_tcscpy(szMcAddress[nMcIndex],
|
||
|
ClientData.ClientAddress);
|
||
|
}
|
||
|
// get connection state
|
||
|
if (WTSQuerySessionInformation(
|
||
|
WTS_CURRENT_SERVER_HANDLE,
|
||
|
ppSessionInfo[i].SessionId,
|
||
|
WTSConnectState,
|
||
|
(LPTSTR *)(&nConnectState),
|
||
|
&pBytesReturned))
|
||
|
{
|
||
|
_tcscpy(szBuild[nMcIndex], Status[*nConnectState]);
|
||
|
WTSFreeMemory(nConnectState);
|
||
|
}
|
||
|
nMcIndex++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
FillList(nMcIndex);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
DWORD WinstaThreadMessageLoop(LPVOID)
|
||
|
{
|
||
|
MSG msg;
|
||
|
|
||
|
while(GetMessage(&msg, NULL, 0, 0))
|
||
|
{
|
||
|
switch(msg.message)
|
||
|
{
|
||
|
case PM_WINSTA:
|
||
|
{
|
||
|
GetWinStationInfo();
|
||
|
Sleep(1000); // check for logon/off every second
|
||
|
if (g_idWinstaThread)
|
||
|
{
|
||
|
PostThreadMessage(g_idWinstaThread, PM_WINSTA, 0, 0);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
//////////////////////////////////////////////////////////////////////////////
|