1642 lines
66 KiB
C
1642 lines
66 KiB
C
|
/*******************************************************************************
|
||
|
*
|
||
|
* winadmin.h
|
||
|
*
|
||
|
* main header file for the WINADMIN application
|
||
|
*
|
||
|
* copyright notice: Copyright 1997, Citrix Systems Inc.
|
||
|
* Copyright (c) 1998 - 1999 Microsoft Corporation
|
||
|
* $Author: donm $ Don Messerli
|
||
|
*
|
||
|
* $Log: N:\nt\private\utils\citrix\winutils\tsadmin\VCS\winadmin.h $
|
||
|
*
|
||
|
* Rev 1.12 25 Apr 1998 13:43:14 donm
|
||
|
* MS 2167: try to use proper Wd from registry
|
||
|
*
|
||
|
* Rev 1.11 19 Feb 1998 17:42:52 donm
|
||
|
* removed latest extension DLL support
|
||
|
*
|
||
|
* Rev 1.9 19 Jan 1998 16:49:28 donm
|
||
|
* new ui behavior for domains and servers
|
||
|
*
|
||
|
* Rev 1.8 03 Nov 1997 15:28:02 donm
|
||
|
* added Domains
|
||
|
*
|
||
|
* Rev 1.7 22 Oct 1997 21:09:10 donm
|
||
|
* update
|
||
|
*
|
||
|
* Rev 1.6 17 Oct 1997 18:07:28 donm
|
||
|
* update
|
||
|
*
|
||
|
* Rev 1.5 15 Oct 1997 19:52:48 donm
|
||
|
* update
|
||
|
*
|
||
|
* Rev 1.4 13 Oct 1997 23:07:14 donm
|
||
|
* update
|
||
|
*
|
||
|
* Rev 1.3 13 Oct 1997 22:20:02 donm
|
||
|
* update
|
||
|
*
|
||
|
* Rev 1.2 26 Aug 1997 19:16:24 donm
|
||
|
* bug fixes/changes from WinFrame 1.7
|
||
|
*
|
||
|
* Rev 1.1 31 Jul 1997 16:52:52 butchd
|
||
|
* update
|
||
|
*
|
||
|
* Rev 1.0 30 Jul 1997 17:13:12 butchd
|
||
|
* Initial revision.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#ifndef _WINADMIN_H
|
||
|
#define _WINADMIN_H
|
||
|
|
||
|
#ifndef __AFXWIN_H__
|
||
|
#error include 'stdafx.h' before including this file for PCH
|
||
|
#endif
|
||
|
|
||
|
#include "resource.h" // main symbols
|
||
|
#include <afxmt.h>
|
||
|
#include <winsta.h>
|
||
|
#include <time.h>
|
||
|
#include <utildll.h>
|
||
|
#include "waextend.h"
|
||
|
|
||
|
// Classes defined in this file
|
||
|
class CTreeNode;
|
||
|
class CWinStation;
|
||
|
class CModule;
|
||
|
class CLicense;
|
||
|
class CServer;
|
||
|
class CWinAdminApp;
|
||
|
class CProcess;
|
||
|
class CHotFix;
|
||
|
class CDomain;
|
||
|
class CWd;
|
||
|
|
||
|
// Server icon overlay states
|
||
|
const USHORT STATE_NORMAL = 0x0000;
|
||
|
const USHORT STATE_NOT = 0x0100;
|
||
|
const USHORT STATE_QUESTION = 0x0200;
|
||
|
|
||
|
const USHORT MSG_TITLE_LENGTH = 64;
|
||
|
const USHORT MSG_MESSAGE_LENGTH = 256;
|
||
|
|
||
|
const USHORT LIST_TOP_OFFSET = 4;
|
||
|
|
||
|
const int KBDSHIFT = 0x01;
|
||
|
const int KBDCTRL = 0x02;
|
||
|
const int KBDALT = 0x04;
|
||
|
|
||
|
|
||
|
enum VIEW {
|
||
|
VIEW_BLANK,
|
||
|
VIEW_ALL_SERVERS,
|
||
|
VIEW_DOMAIN,
|
||
|
VIEW_SERVER,
|
||
|
VIEW_MESSAGE,
|
||
|
VIEW_WINSTATION,
|
||
|
VIEW_CHANGING
|
||
|
};
|
||
|
|
||
|
const int PAGE_CHANGING = 0xFFFF;
|
||
|
|
||
|
enum AS_PAGE {
|
||
|
// All Servers Pages
|
||
|
PAGE_AS_SERVERS,
|
||
|
PAGE_AS_USERS,
|
||
|
PAGE_AS_WINSTATIONS,
|
||
|
PAGE_AS_PROCESSES,
|
||
|
PAGE_AS_LICENSES
|
||
|
};
|
||
|
|
||
|
enum DOMAIN_PAGE {
|
||
|
PAGE_DOMAIN_SERVERS,
|
||
|
PAGE_DOMAIN_USERS,
|
||
|
PAGE_DOMAIN_WINSTATIONS,
|
||
|
PAGE_DOMAIN_PROCESSES,
|
||
|
PAGE_DOMAIN_LICENSES
|
||
|
};
|
||
|
|
||
|
enum SERVER_PAGE {
|
||
|
// Server Pages
|
||
|
PAGE_USERS,
|
||
|
PAGE_WINSTATIONS,
|
||
|
PAGE_PROCESSES,
|
||
|
PAGE_LICENSES,
|
||
|
PAGE_INFO
|
||
|
};
|
||
|
|
||
|
enum WINS_PAGE {
|
||
|
// WinStation Pages
|
||
|
PAGE_WS_PROCESSES,
|
||
|
PAGE_WS_INFO,
|
||
|
PAGE_WS_MODULES,
|
||
|
PAGE_WS_CACHE,
|
||
|
PAGE_WS_NO_INFO
|
||
|
};
|
||
|
|
||
|
// The column enums have to be here so that colsort.cpp can get to them
|
||
|
// Server User's columns
|
||
|
enum USERSCOLUMNS {
|
||
|
USERS_COL_USER,
|
||
|
USERS_COL_WINSTATION,
|
||
|
USERS_COL_ID,
|
||
|
USERS_COL_STATE,
|
||
|
USERS_COL_IDLETIME,
|
||
|
USERS_COL_LOGONTIME
|
||
|
};
|
||
|
|
||
|
// Server WinStation's columns
|
||
|
enum STATIONCOLUMNS {
|
||
|
WS_COL_WINSTATION,
|
||
|
WS_COL_USER,
|
||
|
WS_COL_ID,
|
||
|
WS_COL_STATE,
|
||
|
WS_COL_TYPE,
|
||
|
WS_COL_CLIENTNAME,
|
||
|
WS_COL_IDLETIME,
|
||
|
WS_COL_LOGONTIME,
|
||
|
WS_COL_COMMENT
|
||
|
};
|
||
|
|
||
|
// Server Processes' columns
|
||
|
enum PROCESSCOLUMNS {
|
||
|
PROC_COL_USER,
|
||
|
PROC_COL_WINSTATION,
|
||
|
PROC_COL_ID,
|
||
|
PROC_COL_PID,
|
||
|
PROC_COL_IMAGE
|
||
|
};
|
||
|
|
||
|
// Server Licenses' columns
|
||
|
enum LICENSECOLUMNS {
|
||
|
LICENSE_COL_DESCRIPTION,
|
||
|
LICENSE_COL_REGISTERED,
|
||
|
LICENSE_COL_USERCOUNT,
|
||
|
LICENSE_COL_POOLCOUNT,
|
||
|
LICENSE_COL_NUMBER
|
||
|
};
|
||
|
|
||
|
// Server Hotfix columns
|
||
|
enum HOTFIXCOLUMNS {
|
||
|
HOTFIX_COL_NAME,
|
||
|
HOTFIX_COL_INSTALLEDBY,
|
||
|
HOTFIX_COL_INSTALLEDON
|
||
|
};
|
||
|
|
||
|
// WinStation Processes columns
|
||
|
enum WS_PROCESSCOLUMNS {
|
||
|
WS_PROC_COL_ID,
|
||
|
WS_PROC_COL_PID,
|
||
|
WS_PROC_COL_IMAGE
|
||
|
};
|
||
|
|
||
|
// WinStation Modules columns
|
||
|
enum MODULESCOLUMNS {
|
||
|
MODULES_COL_FILENAME,
|
||
|
MODULES_COL_FILEDATETIME,
|
||
|
MODULES_COL_SIZE,
|
||
|
MODULES_COL_VERSIONS
|
||
|
};
|
||
|
|
||
|
// All Server Servers columns
|
||
|
enum SERVERSCOLUMNS {
|
||
|
SERVERS_COL_SERVER,
|
||
|
SERVERS_COL_TCPADDRESS,
|
||
|
SERVERS_COL_IPXADDRESS,
|
||
|
SERVERS_COL_NUMWINSTATIONS
|
||
|
};
|
||
|
|
||
|
// All Server Users columns
|
||
|
enum AS_USERS_COLUMNS {
|
||
|
AS_USERS_COL_SERVER,
|
||
|
AS_USERS_COL_USER,
|
||
|
AS_USERS_COL_WINSTATION,
|
||
|
AS_USERS_COL_ID,
|
||
|
AS_USERS_COL_STATE,
|
||
|
AS_USERS_COL_IDLETIME,
|
||
|
AS_USERS_COL_LOGONTIME
|
||
|
};
|
||
|
|
||
|
// All Server WinStations columns
|
||
|
enum AS_STATIONCOLUMNS {
|
||
|
AS_WS_COL_SERVER,
|
||
|
AS_WS_COL_WINSTATION,
|
||
|
AS_WS_COL_USER,
|
||
|
AS_WS_COL_ID,
|
||
|
AS_WS_COL_STATE,
|
||
|
AS_WS_COL_TYPE,
|
||
|
AS_WS_COL_CLIENTNAME,
|
||
|
AS_WS_COL_IDLETIME,
|
||
|
AS_WS_COL_LOGONTIME,
|
||
|
AS_WS_COL_COMMENT
|
||
|
};
|
||
|
|
||
|
// All Server Processes columns
|
||
|
enum AS_PROCESSCOLUMNS {
|
||
|
AS_PROC_COL_SERVER,
|
||
|
AS_PROC_COL_USER,
|
||
|
AS_PROC_COL_WINSTATION,
|
||
|
AS_PROC_COL_ID,
|
||
|
AS_PROC_COL_PID,
|
||
|
AS_PROC_COL_IMAGE
|
||
|
};
|
||
|
|
||
|
// All Server Licenses columns
|
||
|
enum AS_LICENSECOLUMNS {
|
||
|
AS_LICENSE_COL_SERVER,
|
||
|
AS_LICENSE_COL_DESCRIPTION,
|
||
|
AS_LICENSE_COL_REGISTERED,
|
||
|
AS_LICENSE_COL_USERCOUNT,
|
||
|
AS_LICENSE_COL_POOLCOUNT,
|
||
|
AS_LICENSE_COL_NUMBER
|
||
|
};
|
||
|
|
||
|
// in colsort.cpp
|
||
|
void SortByColumn(int View, int Page, CListCtrl *list, int ColumnNumber, BOOL bAscending);
|
||
|
|
||
|
// Extension Startup Function
|
||
|
typedef void (WINAPI *LPFNEXSTARTUPPROC) (HWND);
|
||
|
// Extension Shutdown Function
|
||
|
typedef void (WINAPI *LPFNEXSHUTDOWNPROC) (void);
|
||
|
// Extension Server Enumerate Function
|
||
|
typedef LPWSTR (WINAPI *LPFNEXENUMERATEPROC) (LPWSTR);
|
||
|
// Extension WinStation Init Function
|
||
|
typedef void* (WINAPI *LPFNEXWINSTATIONINITPROC) (HANDLE, ULONG);
|
||
|
// Extension WinStation Additional Info Function
|
||
|
typedef void (WINAPI *LPFNEXWINSTATIONINFOPROC) (void*, int);
|
||
|
// Extension WinStation Cleanup Function
|
||
|
typedef void (WINAPI *LPFNEXWINSTATIONCLEANUPPROC) (void*);
|
||
|
// Extension Server Init Function
|
||
|
typedef void* (WINAPI *LPFNEXSERVERINITPROC) (TCHAR*, HANDLE);
|
||
|
// Extension Server Cleanup Function
|
||
|
typedef void (WINAPI *LPFNEXSERVERCLEANUPPROC) (void*);
|
||
|
// Extension Server Event Function
|
||
|
typedef BOOL (WINAPI *LPFNEXSERVEREVENTPROC) (void*, ULONG);
|
||
|
// Extension Get Server Info
|
||
|
typedef ExtServerInfo* (WINAPI *LPFNEXGETSERVERINFOPROC) (void *);
|
||
|
// Extension Get Server License Info
|
||
|
typedef ExtLicenseInfo* (WINAPI *LPFNEXGETSERVERLICENSESPROC) (void*, ULONG*);
|
||
|
// Extension Get Global Info
|
||
|
typedef ExtGlobalInfo* (WINAPI *LPFNEXGETGLOBALINFOPROC) (void);
|
||
|
// Extension Get WinStation Info
|
||
|
typedef ExtWinStationInfo* (WINAPI *LPFNEXGETWINSTATIONINFOPROC) (void *);
|
||
|
// Extension Get WinStation Modules
|
||
|
typedef ExtModuleInfo* (WINAPI *LPFNEXGETWINSTATIONMODULESPROC) (void*, ULONG*);
|
||
|
// Extension Free Server License Info
|
||
|
typedef void (WINAPI *LPFNEXFREESERVERLICENSESPROC) (ExtLicenseInfo*);
|
||
|
// Extension Free WinStation Modules
|
||
|
typedef void (WINAPI *LPFNEXFREEWINSTATIONMODULESPROC) (ExtModuleInfo*);
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CWinAdminApp:
|
||
|
// See WinAdmin.cpp for the implementation of this class
|
||
|
//
|
||
|
class CWinAdminApp : public CWinApp
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CWinAdminApp();
|
||
|
// Returns the Current User Name
|
||
|
TCHAR *GetCurrentUserName() { return m_CurrentUserName; }
|
||
|
// Returns the Current WinStation Name
|
||
|
PWINSTATIONNAME GetCurrentWinStationName() { return m_CurrentWinStationName; }
|
||
|
// Returns the Current Server Name
|
||
|
TCHAR *GetCurrentServerName() { return m_CurrentServerName; }
|
||
|
// Returns the Current Logon Id
|
||
|
ULONG GetCurrentLogonId() { return m_CurrentLogonId; }
|
||
|
// Returns the Current WinStation Flags
|
||
|
ULONG GetCurrentWSFlags() { return m_CurrentWSFlags; }
|
||
|
// Returns TRUE if the current user has Admin privileges?
|
||
|
BOOL IsUserAdmin() { return m_Admin; }
|
||
|
// Returns TRUE if we are running under Picasso
|
||
|
BOOL IsPicasso() { return m_Picasso; }
|
||
|
// Returns TRUE if we should show system processes
|
||
|
BOOL ShowSystemProcesses() { return m_ShowSystemProcesses; }
|
||
|
// Sets the show system processes variable
|
||
|
void SetShowSystemProcesses(BOOL show) { m_ShowSystemProcesses = show; }
|
||
|
// Returns TRUE if we should ask user for confirmation of Actions
|
||
|
BOOL AskConfirmation() { return m_Confirmation; }
|
||
|
// Sets the confirmation variable
|
||
|
void SetConfirmation(BOOL conf) { m_Confirmation = conf; }
|
||
|
// Returms TRUE if we should save the preferences upon exit
|
||
|
BOOL SavePreferences() { return m_SavePreferences; }
|
||
|
// Sets the save preferences variable
|
||
|
void SetSavePreferences(BOOL pref) { m_SavePreferences = pref; }
|
||
|
// Returns the Process List Refresh Time
|
||
|
UINT GetProcessListRefreshTime() { return m_ProcessListRefreshTime; }
|
||
|
// Sets the Process List Refresh Time
|
||
|
void SetProcessListRefreshTime(UINT pt) { m_ProcessListRefreshTime = pt; }
|
||
|
// Returns the Status Dialog Refresh Time
|
||
|
UINT GetStatusRefreshTime() { return m_StatusRefreshTime; }
|
||
|
// Sets the Status Dialog Refresh Time
|
||
|
void SetStatusRefreshTime(UINT st) { m_StatusRefreshTime = st; }
|
||
|
// Returns a pointer to the document
|
||
|
CDocument *GetDocument() { return m_Document; }
|
||
|
// Sets the m_Document variable
|
||
|
void SetDocument(CDocument *doc) { m_Document = doc; }
|
||
|
// Should we Show All Servers - based on menu item toggle
|
||
|
BOOL GetShowAllServers() { return m_ShowAllServers; }
|
||
|
// Set the Show All Servers variable
|
||
|
void SetShowAllServers(BOOL sa) { m_ShowAllServers = sa; }
|
||
|
// Returns the value of shadow hotkey key
|
||
|
int GetShadowHotkeyKey() { return m_ShadowHotkeyKey; }
|
||
|
// Sets the value of shadow hotkey key
|
||
|
void SetShadowHotkeyKey(int key) { m_ShadowHotkeyKey = key; }
|
||
|
// Returns the value of shadow hotkey shift state
|
||
|
DWORD GetShadowHotkeyShift() { return m_ShadowHotkeyShift; }
|
||
|
// Sets the value of shadow hotkey shift state
|
||
|
void SetShadowHotkeyShift(DWORD shift) { m_ShadowHotkeyShift = shift; }
|
||
|
// Get the tree width
|
||
|
int GetTreeWidth() { return m_TreeWidth; }
|
||
|
// Set the tree width
|
||
|
void SetTreeWidth(int width) { m_TreeWidth = width; }
|
||
|
// Get the window placement
|
||
|
WINDOWPLACEMENT *GetPlacement() { return &m_Placement; }
|
||
|
|
||
|
// Returns the address of the extension DLL's startup function
|
||
|
LPFNEXSTARTUPPROC GetExtStartupProc() { return m_lpfnWAExStart; }
|
||
|
// Returns the address of the extension DLL's shutdown function
|
||
|
LPFNEXSHUTDOWNPROC GetExtShutdownProc() { return m_lpfnWAExEnd; }
|
||
|
// Returns the address of the extension DLL's server enumeration function
|
||
|
LPFNEXENUMERATEPROC GetExtEnumerationProc() { return m_lpfnWAExServerEnumerate; }
|
||
|
// Returns the address of the extension DLL's WinStation Init function
|
||
|
LPFNEXWINSTATIONINITPROC GetExtWinStationInitProc() { return m_lpfnWAExWinStationInit; }
|
||
|
// Returns the address of the extension DLL's WinStation Info function
|
||
|
LPFNEXWINSTATIONINFOPROC GetExtWinStationInfoProc() { return m_lpfnWAExWinStationInfo; }
|
||
|
// Returns the address of the extension DLL's WinStation Cleanup function
|
||
|
LPFNEXWINSTATIONCLEANUPPROC GetExtWinStationCleanupProc() { return m_lpfnWAExWinStationCleanup; }
|
||
|
// Returns the address of the extension DLL's Server Init function
|
||
|
LPFNEXSERVERINITPROC GetExtServerInitProc() { return m_lpfnWAExServerInit; }
|
||
|
// Returns the address of the extension DLL's Server Cleanup function
|
||
|
LPFNEXSERVERCLEANUPPROC GetExtServerCleanupProc() { return m_lpfnWAExServerCleanup; }
|
||
|
// Returns the address of the extension DLL's Get Server Info function
|
||
|
LPFNEXGETSERVERINFOPROC GetExtGetServerInfoProc() { return m_lpfnWAExGetServerInfo; }
|
||
|
// Returns the address of the extension DLL's Get Server License Info function
|
||
|
LPFNEXGETSERVERLICENSESPROC GetExtGetServerLicensesProc() { return m_lpfnWAExGetServerLicenses; }
|
||
|
// Returns the address of the extension DLL's Server Event function
|
||
|
LPFNEXSERVEREVENTPROC GetExtServerEventProc() { return m_lpfnWAExServerEvent; }
|
||
|
// Returns the address of the extension DLL's Get Global Info function
|
||
|
LPFNEXGETGLOBALINFOPROC GetExtGetGlobalInfoProc() { return m_lpfnWAExGetGlobalInfo; }
|
||
|
// Returns the address of the extension DLL's Get WinStation Info Function
|
||
|
LPFNEXGETWINSTATIONINFOPROC GetExtGetWinStationInfoProc() { return m_lpfnWAExGetWinStationInfo; }
|
||
|
// Returns the address of the extension DLL's Get WinStation Module Info function
|
||
|
LPFNEXGETWINSTATIONMODULESPROC GetExtGetWinStationModulesProc() { return m_lpfnWAExGetWinStationModules; }
|
||
|
// Returns the address of the extension DLL's Free Server License Info function
|
||
|
LPFNEXFREESERVERLICENSESPROC GetExtFreeServerLicensesProc() { return m_lpfnWAExFreeServerLicenses; }
|
||
|
// Returns the address of the extension DLL's Free WinStation Modules function
|
||
|
LPFNEXFREEWINSTATIONMODULESPROC GetExtFreeWinStationModulesProc() { return m_lpfnWAExFreeWinStationModules; }
|
||
|
|
||
|
void BeginOutstandingThread() { ::InterlockedIncrement(&m_OutstandingThreads); }
|
||
|
void EndOutstandingThread() { ::InterlockedDecrement(&m_OutstandingThreads); }
|
||
|
|
||
|
// make this guy public for speed ?
|
||
|
TCHAR m_szSystemConsole[WINSTATIONNAME_LENGTH+1];
|
||
|
// make this guy public so the MainFrm can get at it
|
||
|
WINDOWPLACEMENT m_Placement;
|
||
|
|
||
|
private:
|
||
|
void ReadPreferences();
|
||
|
void WritePreferences();
|
||
|
BOOL IsBrowserRunning();
|
||
|
LONG m_OutstandingThreads; // the number of outstanding threads
|
||
|
TCHAR m_CurrentUserName[USERNAME_LENGTH+1];
|
||
|
WINSTATIONNAME m_CurrentWinStationName;
|
||
|
TCHAR m_CurrentServerName[MAX_COMPUTERNAME_LENGTH + 1];
|
||
|
ULONG m_CurrentLogonId;
|
||
|
ULONG m_CurrentWSFlags;
|
||
|
BOOL m_Admin; // does the user have Admin privileges?
|
||
|
BOOL m_Picasso; // are we running under Picasso?
|
||
|
UINT m_ShowSystemProcesses;
|
||
|
UINT m_ShowAllServers;
|
||
|
int m_ShadowHotkeyKey;
|
||
|
DWORD m_ShadowHotkeyShift;
|
||
|
int m_TreeWidth;
|
||
|
HINSTANCE m_hExtensionDLL; // handle to the extension DLL if loaded
|
||
|
|
||
|
// functions in the extension DLL
|
||
|
LPFNEXSTARTUPPROC m_lpfnWAExStart;
|
||
|
LPFNEXSHUTDOWNPROC m_lpfnWAExEnd;
|
||
|
LPFNEXENUMERATEPROC m_lpfnWAExServerEnumerate;
|
||
|
LPFNEXWINSTATIONINITPROC m_lpfnWAExWinStationInit;
|
||
|
LPFNEXWINSTATIONINFOPROC m_lpfnWAExWinStationInfo;
|
||
|
LPFNEXWINSTATIONCLEANUPPROC m_lpfnWAExWinStationCleanup;
|
||
|
LPFNEXSERVERINITPROC m_lpfnWAExServerInit;
|
||
|
LPFNEXSERVERCLEANUPPROC m_lpfnWAExServerCleanup;
|
||
|
LPFNEXGETSERVERINFOPROC m_lpfnWAExGetServerInfo;
|
||
|
LPFNEXGETSERVERLICENSESPROC m_lpfnWAExGetServerLicenses;
|
||
|
LPFNEXSERVEREVENTPROC m_lpfnWAExServerEvent;
|
||
|
LPFNEXGETGLOBALINFOPROC m_lpfnWAExGetGlobalInfo;
|
||
|
LPFNEXGETWINSTATIONINFOPROC m_lpfnWAExGetWinStationInfo;
|
||
|
LPFNEXGETWINSTATIONMODULESPROC m_lpfnWAExGetWinStationModules;
|
||
|
LPFNEXFREESERVERLICENSESPROC m_lpfnWAExFreeServerLicenses;
|
||
|
LPFNEXFREEWINSTATIONMODULESPROC m_lpfnWAExFreeWinStationModules;
|
||
|
|
||
|
// user preferences
|
||
|
UINT m_Confirmation; // ask user for confirmation
|
||
|
UINT m_SavePreferences; // save preferences upon exit
|
||
|
UINT m_ProcessListRefreshTime;
|
||
|
UINT m_StatusRefreshTime;
|
||
|
|
||
|
CDocument *m_Document;
|
||
|
|
||
|
// Overrides
|
||
|
// ClassWizard generated virtual function overrides
|
||
|
//{{AFX_VIRTUAL(CWinAdminApp)
|
||
|
public:
|
||
|
virtual BOOL InitInstance();
|
||
|
virtual int ExitInstance();
|
||
|
//}}AFX_VIRTUAL
|
||
|
|
||
|
// Implementation
|
||
|
|
||
|
//{{AFX_MSG(CWinAdminApp)
|
||
|
afx_msg void OnAppAbout();
|
||
|
// NOTE - the ClassWizard will add and remove member functions here.
|
||
|
// DO NOT EDIT what you see in these blocks of generated code !
|
||
|
//}}AFX_MSG
|
||
|
DECLARE_MESSAGE_MAP()
|
||
|
};
|
||
|
|
||
|
enum NODETYPE {
|
||
|
NODE_ALL_SERVERS,
|
||
|
NODE_DOMAIN,
|
||
|
NODE_SERVER,
|
||
|
NODE_WINSTATION,
|
||
|
NODE_PUBLISHED_APPS,
|
||
|
NODE_APPLICATION,
|
||
|
NODE_APP_SERVER,
|
||
|
|
||
|
NODE_FAV_LIST,
|
||
|
NODE_THIS_COMP,
|
||
|
NODE_NONE
|
||
|
};
|
||
|
|
||
|
class CNodeType : public CObject
|
||
|
{
|
||
|
public:
|
||
|
CNodeType( NODETYPE m )
|
||
|
{
|
||
|
m_nodetype = m;
|
||
|
}
|
||
|
|
||
|
~CNodeType()
|
||
|
{
|
||
|
ODS( L"CNodeType I'm going away\n" );
|
||
|
}
|
||
|
|
||
|
NODETYPE m_nodetype;
|
||
|
};
|
||
|
|
||
|
class CTreeNode : public CObject
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CTreeNode(NODETYPE NodeType, CObject* pObject) { m_NodeType = NodeType; m_pTreeObject = pObject; }
|
||
|
// Returns the node type
|
||
|
NODETYPE GetNodeType() { return m_NodeType; }
|
||
|
// Returns the object pointed to by this node
|
||
|
CObject *GetTreeObject() { return m_pTreeObject; }
|
||
|
// Returns the sort order stored in the object
|
||
|
ULONG GetSortOrder() { return m_SortOrder; }
|
||
|
// Sets the sort order stored with the object
|
||
|
void SetSortOrder(ULONG order) { m_SortOrder = order; }
|
||
|
|
||
|
virtual ~CTreeNode( )
|
||
|
{
|
||
|
if( m_NodeType == NODE_FAV_LIST || m_NodeType == NODE_THIS_COMP )
|
||
|
{
|
||
|
if( m_pTreeObject != NULL )
|
||
|
{
|
||
|
delete m_pTreeObject;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
NODETYPE m_NodeType;
|
||
|
CObject* m_pTreeObject;
|
||
|
ULONG m_SortOrder;
|
||
|
};
|
||
|
|
||
|
// structure passed to the Server's BackgroundThreadProc
|
||
|
typedef struct _ServerProcInfo {
|
||
|
CDocument *pDoc;
|
||
|
CServer *pServer;
|
||
|
} ServerProcInfo;
|
||
|
|
||
|
// structure for storing User SID
|
||
|
class CUserSid : public CObject
|
||
|
{
|
||
|
public:
|
||
|
USHORT m_SidCrc;
|
||
|
TCHAR m_UserName[USERNAME_LENGTH+1];
|
||
|
};
|
||
|
|
||
|
// Information we get from the registry of the server
|
||
|
typedef struct _ServerRegistryInfo {
|
||
|
ULONG InstallDate;
|
||
|
TCHAR ServicePackLevel[128];
|
||
|
TCHAR MSVersion[128];
|
||
|
DWORD MSVersionNum;
|
||
|
TCHAR MSBuild[128];
|
||
|
TCHAR MSProductName[128];
|
||
|
TCHAR CTXProductName[128];
|
||
|
TCHAR CTXVersion[128];
|
||
|
DWORD CTXVersionNum;
|
||
|
TCHAR CTXBuild[128];
|
||
|
} ServerRegistryInfo;
|
||
|
|
||
|
|
||
|
class CHotfix : public CObject
|
||
|
{
|
||
|
public:
|
||
|
TCHAR m_Name[10];
|
||
|
TCHAR m_InstalledBy[USERNAME_LENGTH + 1];
|
||
|
ULONG m_InstalledOn;
|
||
|
ULONG m_Valid;
|
||
|
CServer *m_pServer;
|
||
|
};
|
||
|
|
||
|
typedef struct _EncLevel {
|
||
|
WORD StringID;
|
||
|
DWORD RegistryValue;
|
||
|
WORD Flags;
|
||
|
} EncryptionLevel;
|
||
|
|
||
|
typedef LONG (WINAPI *LPFNEXTENCRYPTIONLEVELSPROC) (WDNAME *pWdName, EncryptionLevel **);
|
||
|
|
||
|
class CWd : public CObject
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CWd(PWDCONFIG2 pWdConfig, PWDNAME pRegistryName);
|
||
|
// destructor
|
||
|
~CWd();
|
||
|
|
||
|
BOOL GetEncryptionLevelString(DWORD Value, CString *pString);
|
||
|
TCHAR *GetName() { return m_WdName; }
|
||
|
TCHAR *GetRegistryName() { return m_RegistryName; }
|
||
|
|
||
|
private:
|
||
|
HINSTANCE m_hExtensionDLL;
|
||
|
WDNAME m_WdName;
|
||
|
WDNAME m_RegistryName;
|
||
|
LPFNEXTENCRYPTIONLEVELSPROC m_lpfnExtEncryptionLevels;
|
||
|
EncryptionLevel *m_pEncryptionLevels;
|
||
|
LONG m_NumEncryptionLevels;
|
||
|
};
|
||
|
|
||
|
// structure passed to a Domain's background thread process
|
||
|
typedef struct _DomainProcInfo {
|
||
|
LPVOID pDoc;
|
||
|
CDomain *pDomain;
|
||
|
} DomainProcInfo;
|
||
|
|
||
|
// Flags for CDomain objects
|
||
|
const ULONG DF_CURRENT_DOMAIN = 0x00000001;
|
||
|
|
||
|
// States of CDomain objects
|
||
|
enum DOMAIN_STATE {
|
||
|
DS_NONE, // seed value for m_State and m_PreviousState
|
||
|
DS_NOT_ENUMERATING, // not enumerating (m_pBackgroundThread == NULL)
|
||
|
DS_INITIAL_ENUMERATION, // enumerating servers for the first time
|
||
|
DS_ENUMERATING, // enumerating
|
||
|
DS_STOPPED_ENUMERATING, // no longer enumerating
|
||
|
};
|
||
|
|
||
|
class CDomain : public CObject
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CDomain(TCHAR *name);
|
||
|
// destructor
|
||
|
~CDomain();
|
||
|
|
||
|
TCHAR *GetName() { return m_Name; }
|
||
|
|
||
|
// Returns the state of this domain object
|
||
|
DOMAIN_STATE GetState() { return m_State; }
|
||
|
// Sets the state of this domain object
|
||
|
void SetState(DOMAIN_STATE State);
|
||
|
// Returns the previous state of this domain object
|
||
|
DOMAIN_STATE GetPreviousState() { return m_PreviousState; }
|
||
|
// Returns TRUE if m_State is set to a given state
|
||
|
BOOLEAN IsState(DOMAIN_STATE State) { return (m_State == State); }
|
||
|
// Returns TRUE if m_PreviousState is set to a given state
|
||
|
BOOLEAN IsPreviousState(DOMAIN_STATE State) { return (m_PreviousState == State); }
|
||
|
|
||
|
// Returns the tree item handle
|
||
|
HTREEITEM GetTreeItem() { return m_hTreeItem; }
|
||
|
// Sets the tree item handle
|
||
|
void SetTreeItem(HTREEITEM handle) { m_hTreeItem = handle; }
|
||
|
|
||
|
BOOLEAN IsCurrentDomain() { return (m_Flags & DF_CURRENT_DOMAIN) > 0; }
|
||
|
void SetCurrentDomain() { m_Flags |= DF_CURRENT_DOMAIN; }
|
||
|
void ClearCurrentDomain() { m_Flags &= ~DF_CURRENT_DOMAIN; }
|
||
|
|
||
|
BOOL StartEnumerating();
|
||
|
void StopEnumerating();
|
||
|
void SetEnumEvent() { if(m_pBackgroundThread) m_WakeUpEvent.SetEvent(); }
|
||
|
|
||
|
void LockBackgroundThread() { m_ThreadCriticalSection.Lock(); }
|
||
|
void UnlockBackgroundThread() { m_ThreadCriticalSection.Unlock(); }
|
||
|
|
||
|
// returns TRUE as long as the background thread should keep running
|
||
|
BOOL ShouldBackgroundContinue() { return m_BackgroundContinue; }
|
||
|
|
||
|
void ClearBackgroundContinue() { m_BackgroundContinue = FALSE; }
|
||
|
|
||
|
// Returns the pointer to the domain's background thread
|
||
|
CWinThread *GetThreadPointer() { return m_pBackgroundThread; }
|
||
|
|
||
|
LPWSTR EnumHydraServers( /*LPWSTR pDomain,*/ DWORD verMajor, DWORD verMinor );
|
||
|
|
||
|
void CreateServers(LPWSTR pBuffer, LPVOID pDoc);
|
||
|
|
||
|
// Connect to all servers in this Domain
|
||
|
void ConnectAllServers();
|
||
|
|
||
|
// Disconnect from all servers in this Domain
|
||
|
void DisconnectAllServers();
|
||
|
|
||
|
private:
|
||
|
|
||
|
// the state of the domain object
|
||
|
DOMAIN_STATE m_State;
|
||
|
DOMAIN_STATE m_PreviousState;
|
||
|
// the name of the domain
|
||
|
TCHAR m_Name[50];
|
||
|
HTREEITEM m_hTreeItem;
|
||
|
|
||
|
// Background thread to update document when servers
|
||
|
// appear and disapper
|
||
|
// Called with AfxBeginThread
|
||
|
static UINT BackgroundThreadProc(LPVOID);
|
||
|
CWinThread *m_pBackgroundThread;
|
||
|
BOOL m_BackgroundContinue;
|
||
|
// Event to wakeup background thread so that
|
||
|
// he can exit (WaitForSingleEvent instead of Sleep)
|
||
|
CEvent m_WakeUpEvent;
|
||
|
// Critical section to protect accesses to m_pBackgroundThread
|
||
|
CCriticalSection m_ThreadCriticalSection;
|
||
|
|
||
|
ULONG m_Flags;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
// Flags for CServer objects
|
||
|
const ULONG SF_BACKGROUND_FOUND = 0x00000001;
|
||
|
const ULONG SF_SERVER_INACTIVE = 0x00000002;
|
||
|
const ULONG SF_REGISTRY_INFO = 0x00000004;
|
||
|
const ULONG SF_HANDLE_GOOD = 0x00000008;
|
||
|
const ULONG SF_SELECTED = 0x00000010;
|
||
|
const ULONG SF_UNDEFINED_0040 = 0x00000020;
|
||
|
const ULONG SF_UNDEFINED_0080 = 0x00000040;
|
||
|
const ULONG SF_LOST_CONNECTION = 0x00000080;
|
||
|
const ULONG SF_FOUND_LATER = 0x00000100;
|
||
|
const ULONG SF_WINFRAME = 0x00000200;
|
||
|
const ULONG SF_CONNECTED = 0x00000400;
|
||
|
|
||
|
// How many times we will let a load level query timeout
|
||
|
// before we set it to N/A
|
||
|
const USHORT MAX_LL_TIMEOUTS = 10;
|
||
|
|
||
|
// States of CServer objects
|
||
|
enum SERVER_STATE {
|
||
|
SS_NONE, // seed value for m_State and m_PreviousState
|
||
|
SS_NOT_CONNECTED, // not connected yet or disconnected
|
||
|
SS_OPENED, // opened RPC connection
|
||
|
SS_GETTING_INFO, // getting information about the server
|
||
|
SS_GOOD, // server information is good
|
||
|
SS_DISCONNECTING, // in the process of disconnecting
|
||
|
SS_BAD // could not open the server
|
||
|
};
|
||
|
|
||
|
|
||
|
class CServer : public CObject
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// constructor
|
||
|
CServer(CDomain *pDomain, TCHAR *name, BOOL bFoundLater, BOOL bConnect); // FoundLater is TRUE if found as new server after initial server enum
|
||
|
// destructor
|
||
|
~CServer();
|
||
|
|
||
|
// Functions to check,set,and clear m_ServerFlags
|
||
|
BOOLEAN IsServerSane() { return (m_State != SS_BAD); }
|
||
|
|
||
|
BOOLEAN IsManualFind( ) { return m_fManualFind; }
|
||
|
void SetManualFind( ) { m_fManualFind = TRUE; }
|
||
|
void ClearManualFind( ) { m_fManualFind = FALSE; }
|
||
|
|
||
|
BOOLEAN IsBackgroundFound() { return (m_ServerFlags & SF_BACKGROUND_FOUND) > 0; }
|
||
|
void SetBackgroundFound() { m_ServerFlags |= SF_BACKGROUND_FOUND; }
|
||
|
void ClearBackgroundFound() { m_ServerFlags &= ~SF_BACKGROUND_FOUND; }
|
||
|
|
||
|
BOOLEAN IsServerInactive() { return (m_ServerFlags & SF_SERVER_INACTIVE) > 0; }
|
||
|
void SetServerInactive() { m_ServerFlags |= SF_SERVER_INACTIVE; m_BackgroundContinue = FALSE; }
|
||
|
void ClearServerInactive() { m_ServerFlags &= ~SF_SERVER_INACTIVE; }
|
||
|
BOOLEAN IsServerActive() { return (m_ServerFlags & SF_SERVER_INACTIVE) == 0; }
|
||
|
|
||
|
BOOLEAN IsRegistryInfoValid() { return (m_ServerFlags & SF_REGISTRY_INFO) > 0; }
|
||
|
void SetRegistryInfoValid() { m_ServerFlags |= SF_REGISTRY_INFO; }
|
||
|
void ClearRegistryInfoValid() { m_ServerFlags &= ~SF_REGISTRY_INFO; }
|
||
|
|
||
|
BOOLEAN IsHandleGood() { return (m_ServerFlags & SF_HANDLE_GOOD) > 0; }
|
||
|
void SetHandleGood() { m_ServerFlags |= SF_HANDLE_GOOD; }
|
||
|
void ClearHandleGood() { m_ServerFlags &= ~SF_HANDLE_GOOD; }
|
||
|
|
||
|
BOOLEAN IsSelected() { return (m_ServerFlags & SF_SELECTED) > 0; }
|
||
|
void SetSelected() { m_ServerFlags |= SF_SELECTED; }
|
||
|
void ClearSelected() { m_ServerFlags &= ~SF_SELECTED; }
|
||
|
|
||
|
BOOLEAN HasLostConnection() { return (m_ServerFlags & SF_LOST_CONNECTION) > 0; }
|
||
|
void SetLostConnection() { m_ServerFlags |= SF_LOST_CONNECTION; }
|
||
|
void ClearLostConnection() { m_ServerFlags &= ~SF_LOST_CONNECTION; }
|
||
|
|
||
|
BOOLEAN WasFoundLater() { return (m_ServerFlags & SF_FOUND_LATER) > 0; }
|
||
|
void SetFoundLater() { m_ServerFlags |= SF_FOUND_LATER; }
|
||
|
void ClearFoundLater() { m_ServerFlags &= ~SF_FOUND_LATER; }
|
||
|
|
||
|
BOOLEAN IsWinFrame() { return (m_ServerFlags & SF_WINFRAME) > 0; }
|
||
|
void SetWinFrame() { m_ServerFlags |= SF_WINFRAME; }
|
||
|
void ClearWinFrame() { m_ServerFlags &= ~SF_WINFRAME; }
|
||
|
|
||
|
// Returns the state of this server object
|
||
|
SERVER_STATE GetState() { return m_State; }
|
||
|
// Sets the state of this server object
|
||
|
void SetState(SERVER_STATE State);
|
||
|
// Returns the previous state of this server object
|
||
|
SERVER_STATE GetPreviousState() { return m_PreviousState; }
|
||
|
// Returns TRUE if m_State is set to a given state
|
||
|
BOOLEAN IsState(SERVER_STATE State) { return (m_State == State); }
|
||
|
// Returns TRUE if m_PreviousState is set to a given state
|
||
|
BOOLEAN IsPreviousState(SERVER_STATE State) { return (m_PreviousState == State); }
|
||
|
// Add a WinStation to WinStationList in sorted order
|
||
|
void AddWinStation(CWinStation *pWinStation);
|
||
|
// Returns a pointer to the WinStation linked list
|
||
|
CObList *GetWinStationList() { return &m_WinStationList; }
|
||
|
// Locks the WinStation linked list
|
||
|
void LockWinStationList() { m_WinStationListCriticalSection.Lock(); }
|
||
|
// Unlocks the WinStation linked list
|
||
|
void UnlockWinStationList() { m_WinStationListCriticalSection.Unlock(); }
|
||
|
|
||
|
void LockThreadAlive() { m_ThreadCriticalSection.Lock(); }
|
||
|
void UnlockThreadAlive() { m_ThreadCriticalSection.Unlock(); }
|
||
|
void SetThreadAlive() { LockThreadAlive(); m_bThreadAlive = TRUE; UnlockThreadAlive(); }
|
||
|
void ClearThreadAlive() { LockThreadAlive(); m_bThreadAlive = FALSE; UnlockThreadAlive(); }
|
||
|
|
||
|
// Returns a pointer to the Process linked list
|
||
|
CObList *GetProcessList() { return &m_ProcessList; }
|
||
|
// Locks the Process linked list
|
||
|
void LockProcessList() { m_ProcessListCriticalSection.Lock(); }
|
||
|
// Unlocks the Process linked list
|
||
|
void UnlockProcessList() { m_ProcessListCriticalSection.Unlock(); }
|
||
|
|
||
|
// Returns a pointer to the License linked list
|
||
|
CObList *GetLicenseList() { return &m_LicenseList; }
|
||
|
// Locks the License linked list
|
||
|
void LockLicenseList() { m_LicenseListCriticalSection.Lock(); }
|
||
|
// Unlocks the License linked list
|
||
|
void UnlockLicenseList() { m_LicenseListCriticalSection.Unlock(); }
|
||
|
|
||
|
// Returns a pointer to the User Sid linked list
|
||
|
CObList *GetUserSidList() { return &m_UserSidList; }
|
||
|
// Returns a pointer to the Hotfix linked list
|
||
|
CObList *GetHotfixList() { return &m_HotfixList; }
|
||
|
// Get the server's handle
|
||
|
HANDLE GetHandle() { return m_Handle; }
|
||
|
// Set the handle
|
||
|
void SetHandle(HANDLE hIn) { m_Handle = hIn; }
|
||
|
// Go get detailed information about the server
|
||
|
void DoDetail();
|
||
|
// Get this server's addresses from the browser
|
||
|
void QueryAddresses();
|
||
|
// Enumerate this server's processes
|
||
|
BOOL EnumerateProcesses();
|
||
|
// Clear out the list of processes
|
||
|
void ClearProcesses();
|
||
|
// Get the name of the server
|
||
|
TCHAR *GetName() { return m_Name; }
|
||
|
// Returns TRUE if this is the server that the app is being run from
|
||
|
BOOL IsCurrentServer() { return (lstrcmpi(m_Name, ((CWinAdminApp*)AfxGetApp())->GetCurrentServerName()) == 0); }
|
||
|
// Clears the WAF_SELECTED bit in all of this server's lists
|
||
|
void ClearAllSelected();
|
||
|
// returns TRUE as long as the background thread should keep running
|
||
|
BOOL ShouldBackgroundContinue() { return m_BackgroundContinue; }
|
||
|
// turns off the background continue boolean
|
||
|
void ClearBackgroundContinue() { m_BackgroundContinue = FALSE; }
|
||
|
// returns a pointer to a CWinStation from m_WinStationList
|
||
|
CWinStation *FindWinStationById(ULONG Id);
|
||
|
// returns a pointer to a CProcess from m_ProcessList given a PID
|
||
|
CProcess *FindProcessByPID(ULONG Pid);
|
||
|
// returns the number of connected WinStations
|
||
|
ULONG GetNumWinStations() { return m_NumWinStations; }
|
||
|
// Sets the number of connected WinStations
|
||
|
void SetNumWinStations(ULONG num) { m_NumWinStations = num; }
|
||
|
// Go out and fill in the registry info structure
|
||
|
BOOL BuildRegistryInfo();
|
||
|
// Returns the Install Date
|
||
|
ULONG GetInstallDate() { return m_pRegistryInfo->InstallDate; }
|
||
|
// Returns the Service Pack Level
|
||
|
TCHAR *GetServicePackLevel() { return m_pRegistryInfo->ServicePackLevel; }
|
||
|
// Returns the handle to this server's tree item
|
||
|
TCHAR *GetMSVersion() { return m_pRegistryInfo->MSVersion; }
|
||
|
// Returns the MS product version number (binary)
|
||
|
DWORD GetMSVersionNum() { return m_pRegistryInfo->MSVersionNum; }
|
||
|
// Returns the MS product build
|
||
|
TCHAR *GetMSBuild() { return m_pRegistryInfo->MSBuild; }
|
||
|
// Returns the MS product name
|
||
|
TCHAR *GetMSProductName() { return m_pRegistryInfo->MSProductName; }
|
||
|
// Returns the 'Citrix' product name
|
||
|
TCHAR *GetCTXProductName() { return m_pRegistryInfo->CTXProductName; }
|
||
|
// Returns the 'Citrix' product version
|
||
|
TCHAR *GetCTXVersion() { return m_pRegistryInfo->CTXVersion; }
|
||
|
// Returns the 'Citrix' product version number (binary)
|
||
|
DWORD GetCTXVersionNum() { return m_pRegistryInfo->CTXVersionNum; }
|
||
|
// Returns the 'Citrix' product build
|
||
|
TCHAR *GetCTXBuild() { return m_pRegistryInfo->CTXBuild; }
|
||
|
|
||
|
// Sets the pointer to the info from the extension DLL
|
||
|
void SetExtensionInfo(void *p) { m_pExtensionInfo = p; }
|
||
|
// Returns the pointer to the info from the extension DLL
|
||
|
void *GetExtensionInfo() { return m_pExtensionInfo; }
|
||
|
// Returns a pointer to the info from the extension DLL
|
||
|
ExtServerInfo *GetExtendedInfo() { return m_pExtServerInfo; }
|
||
|
|
||
|
// Manipulate the number selected counts
|
||
|
UINT GetNumWinStationsSelected() { return m_NumWinStationsSelected; }
|
||
|
UINT GetNumProcessesSelected() { return m_NumProcessesSelected; }
|
||
|
void IncrementNumWinStationsSelected() { m_NumWinStationsSelected++; }
|
||
|
void IncrementNumProcessesSelected() { m_NumProcessesSelected++; }
|
||
|
void DecrementNumWinStationsSelected() { if(m_NumWinStationsSelected) m_NumWinStationsSelected--; }
|
||
|
void DecrementNumProcessesSelected() { if(m_NumProcessesSelected) m_NumProcessesSelected--; }
|
||
|
|
||
|
void RemoveWinStationProcesses(CWinStation *pWinStation); // remove all the processes for a given WinStation
|
||
|
void QueryLicenses();
|
||
|
CDomain *GetDomain() { return m_pDomain; }
|
||
|
// Returns the pointer to the server's background thread
|
||
|
CWinThread *GetThreadPointer() { return m_pBackgroundThread; }
|
||
|
BOOL Connect();
|
||
|
void Disconnect();
|
||
|
|
||
|
// Returns the tree item handle
|
||
|
HTREEITEM GetTreeItem() { return m_hTreeItem; }
|
||
|
HTREEITEM GetTreeItemFromFav( ) { return m_hFavTree; }
|
||
|
HTREEITEM GetTreeItemFromThisComputer( ) { return m_hThisServer; }
|
||
|
|
||
|
// Sets the tree item handle
|
||
|
void SetTreeItem(HTREEITEM handle) { m_hTreeItem = handle; }
|
||
|
void SetTreeItemForFav( HTREEITEM handle ) { m_hFavTree = handle; }
|
||
|
void SetTreeItemForThisComputer( HTREEITEM handle ) { m_hThisServer = handle; }
|
||
|
|
||
|
|
||
|
private:
|
||
|
void AddLicense(CLicense *pNewLicense);
|
||
|
|
||
|
// the state of the server object
|
||
|
SERVER_STATE m_State;
|
||
|
SERVER_STATE m_PreviousState;
|
||
|
// the name of the server
|
||
|
TCHAR m_Name[50];
|
||
|
// Number of WinStations (store here for sorting)
|
||
|
ULONG m_NumWinStations;
|
||
|
// Handle to the tree item for this server in the tree view
|
||
|
HTREEITEM m_hThisServer;
|
||
|
HTREEITEM m_hTreeItem;
|
||
|
HTREEITEM m_hFavTree;
|
||
|
// Which domain this server is in
|
||
|
CDomain *m_pDomain;
|
||
|
|
||
|
// handle from WinStationOpenServer
|
||
|
HANDLE m_Handle;
|
||
|
|
||
|
CObList m_WinStationList;
|
||
|
CCriticalSection m_WinStationListCriticalSection;
|
||
|
|
||
|
CObList m_ProcessList;
|
||
|
CCriticalSection m_ProcessListCriticalSection;
|
||
|
|
||
|
CObList m_LicenseList;
|
||
|
CCriticalSection m_LicenseListCriticalSection;
|
||
|
|
||
|
CObList m_UserSidList;
|
||
|
CObList m_HotfixList;
|
||
|
|
||
|
// Pointer to registry info structure
|
||
|
ServerRegistryInfo *m_pRegistryInfo;
|
||
|
|
||
|
// Background thread to update document when WinStations
|
||
|
// appear, disappear, and change state
|
||
|
// Called with AfxBeginThread
|
||
|
static UINT BackgroundThreadProc(LPVOID);
|
||
|
CWinThread *m_pBackgroundThread;
|
||
|
BOOL m_BackgroundContinue;
|
||
|
// We need a critical section to wrap accesses to m_bThreadAlive
|
||
|
CCriticalSection m_ThreadCriticalSection;
|
||
|
BOOL m_bThreadAlive;
|
||
|
|
||
|
// Keep track of how many of each thing are selected
|
||
|
UINT m_NumWinStationsSelected;
|
||
|
UINT m_NumProcessesSelected;
|
||
|
|
||
|
ULONG m_ServerFlags;
|
||
|
|
||
|
BOOLEAN m_fManualFind;
|
||
|
|
||
|
// Pointer to information stored by the extension DLL
|
||
|
void *m_pExtensionInfo;
|
||
|
// Pointer to extended info from the extension DLL
|
||
|
ExtServerInfo *m_pExtServerInfo;
|
||
|
};
|
||
|
|
||
|
|
||
|
class CLicense : public CObject
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CLicense(CServer *pServer, ExtLicenseInfo *pLicenseInfo);
|
||
|
// Return the serial number (what we sort on)
|
||
|
TCHAR *GetSerialNumber() { return m_RegSerialNumber; }
|
||
|
// Return the license number (what we display)
|
||
|
TCHAR *GetLicenseNumber() { return m_LicenseNumber; }
|
||
|
// Return the license class
|
||
|
LICENSECLASS GetClass() { return m_Class; }
|
||
|
// Return the description
|
||
|
TCHAR *GetDescription() { return m_Description; }
|
||
|
// Return the local count
|
||
|
ULONG GetLocalCount() { return ((m_PoolCount == 0xFFFFFFFF) ? m_LicenseCount : m_LicenseCount - m_PoolCount); }
|
||
|
// Return the pooled count
|
||
|
ULONG GetPoolCount() { return ((m_PoolCount == 0xFFFFFFFF) ? 0 : m_PoolCount); }
|
||
|
// Return the total count
|
||
|
ULONG GetTotalCount() { return m_LicenseCount; }
|
||
|
// Return TRUE if this license is registers
|
||
|
BOOLEAN IsRegistered() { return((m_Flags & ELF_REGISTERED) > 0); }
|
||
|
// Return TRUE if pooling is enabled
|
||
|
BOOLEAN IsPoolingEnabled() { return(m_PoolCount != 0xFFFFFFFF); }
|
||
|
// Returns a pointer to the server this license is for
|
||
|
CServer *GetServer() { return m_pServer; }
|
||
|
|
||
|
private:
|
||
|
LICENSECLASS m_Class;
|
||
|
ULONG m_LicenseCount;
|
||
|
ULONG m_PoolLicenseCount;
|
||
|
WCHAR m_RegSerialNumber[26];
|
||
|
WCHAR m_LicenseNumber[36];
|
||
|
WCHAR m_Description[65];
|
||
|
ULONG m_Flags;
|
||
|
ULONG m_PoolCount;
|
||
|
CServer *m_pServer;
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct _MessageParms {
|
||
|
TCHAR MessageTitle[MSG_TITLE_LENGTH + 1];
|
||
|
TCHAR MessageBody[MSG_MESSAGE_LENGTH + 1];
|
||
|
CWinStation* pWinStation;
|
||
|
} MessageParms;
|
||
|
|
||
|
|
||
|
typedef struct _ResetParms {
|
||
|
CWinStation *pWinStation;
|
||
|
BOOL bReset; // TRUE if reset, FALSE if logoff
|
||
|
} ResetParms;
|
||
|
|
||
|
|
||
|
// Flags for CWinStation objects
|
||
|
const ULONG WF_SELECTED = 0x00000001;
|
||
|
const ULONG WF_CAN_BE_SHADOWED = 0x00000002;
|
||
|
const ULONG WF_DIRECT_ASYNC = 0x00000004;
|
||
|
const ULONG WF_CURRENT = 0x00000008;
|
||
|
const ULONG WF_HAS_USER = 0x00000010;
|
||
|
const ULONG WF_ADDITIONAL_DONE = 0x00000020;
|
||
|
const ULONG WF_QUERIES_SUCCESSFUL = 0x00000040;
|
||
|
const ULONG WF_CHANGED = 0x00000080; // Changed during last enumeration
|
||
|
const ULONG WF_NEW = 0x00000100; // New this enumeration
|
||
|
|
||
|
|
||
|
class CWinStation : public CObject
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CWinStation(CServer *pServer, PLOGONID pLogonId);
|
||
|
// destructor
|
||
|
~CWinStation();
|
||
|
// Updates this WinStation with new data from another CWinStation
|
||
|
BOOL Update(CWinStation *pWinStation);
|
||
|
// Returns a pointer to this guy's server
|
||
|
CServer *GetServer() { return m_pServer; }
|
||
|
// Returns the logon Id
|
||
|
ULONG GetLogonId() { return m_LogonId; }
|
||
|
// Returns the name of the WinStation
|
||
|
PWINSTATIONNAME GetName() { return m_Name; }
|
||
|
// Sets the name
|
||
|
void SetName(PWINSTATIONNAME name) { wcscpy(m_Name, name); }
|
||
|
// Returns the state
|
||
|
WINSTATIONSTATECLASS GetState() { return m_State; }
|
||
|
// Sets the state
|
||
|
void SetState(WINSTATIONSTATECLASS state) { m_State = state; }
|
||
|
// Returns TRUE if m_State is set to a given state
|
||
|
BOOLEAN IsState(WINSTATIONSTATECLASS state) { return (m_State == state); }
|
||
|
// Returns the sort order
|
||
|
ULONG GetSortOrder() { return m_SortOrder; }
|
||
|
// Sets the sort order
|
||
|
void SetSortOrder(ULONG sort) { m_SortOrder = sort; }
|
||
|
// Returns the comment
|
||
|
TCHAR *GetComment() { return m_Comment; }
|
||
|
// Sets the comment
|
||
|
void SetComment(TCHAR *comment) { wcscpy(m_Comment, comment); }
|
||
|
// Returns the user name
|
||
|
TCHAR *GetUserName() { return m_UserName; }
|
||
|
// Sets the user name
|
||
|
void SetUserName(TCHAR *name) { wcscpy(m_UserName, name); }
|
||
|
// Returns the SdClass
|
||
|
SDCLASS GetSdClass() { return m_SdClass; }
|
||
|
// Sets the SdClass
|
||
|
void SetSdClass(SDCLASS pd) { m_SdClass = pd; }
|
||
|
// Returns the Logon Time
|
||
|
LARGE_INTEGER GetLogonTime() { return m_LogonTime; }
|
||
|
// Sets the Logon Time
|
||
|
void SetLogonTime(LARGE_INTEGER t) { m_LogonTime = t; }
|
||
|
// Returns the Last Input Time
|
||
|
LARGE_INTEGER GetLastInputTime() { return m_LastInputTime; }
|
||
|
// Sets the Last Input Time
|
||
|
void SetLastInputTime(LARGE_INTEGER t) { m_LastInputTime = t; }
|
||
|
// Returns the Current Time
|
||
|
LARGE_INTEGER GetCurrentTime() { return m_CurrentTime; }
|
||
|
// Set the Current Time
|
||
|
void SetCurrentTime(LARGE_INTEGER t) { m_CurrentTime = t; }
|
||
|
// Returns the IdleTime
|
||
|
ELAPSEDTIME GetIdleTime() { return m_IdleTime; }
|
||
|
// Sets the IdleTime variable
|
||
|
void SetIdleTime(ELAPSEDTIME it) { m_IdleTime = it; }
|
||
|
// Returns the WdName
|
||
|
PWDNAME GetWdName() { return m_WdName; }
|
||
|
// Sets the WdName
|
||
|
void SetWdName(PWDNAME wdname) { wcscpy(m_WdName, wdname); }
|
||
|
// Returns the Wd Structure
|
||
|
CWd *GetWd() { return m_pWd; }
|
||
|
// Sets the Wd Structure
|
||
|
void SetWd(CWd *pwd) { m_pWd = pwd; }
|
||
|
// Returns the PdName
|
||
|
PPDNAME GetPdName() { return m_PdName; }
|
||
|
// Returns the Client Name
|
||
|
TCHAR *GetClientName() { return m_ClientName; }
|
||
|
// Sets the Client Name
|
||
|
void SetClientName(TCHAR *name) { wcscpy(m_ClientName, name); }
|
||
|
//returns the client digital product id
|
||
|
TCHAR* GetClientDigProductId() { return m_clientDigProductId; }
|
||
|
//sets the client digital product id
|
||
|
void SetClientDigProductId( TCHAR* prodid) { wcscpy(m_clientDigProductId, prodid); }
|
||
|
// Returns the Client Build Number
|
||
|
ULONG GetClientBuildNumber() { return m_ClientBuildNumber; }
|
||
|
// Returns the Client Directory
|
||
|
TCHAR *GetClientDir() { return m_ClientDir; }
|
||
|
// Returns the Modem Name
|
||
|
TCHAR *GetModemName() { return m_ModemName; }
|
||
|
// Returns the Client License
|
||
|
TCHAR *GetClientLicense() { return m_ClientLicense; }
|
||
|
// Returns the Client Product Id
|
||
|
USHORT GetClientProductId() { return m_ClientProductId; }
|
||
|
// Returns the Client Serial Number
|
||
|
ULONG GetClientSerialNumber() { return m_ClientSerialNumber; }
|
||
|
// Returns the Client Address
|
||
|
TCHAR *GetClientAddress() { return m_ClientAddress; }
|
||
|
// Returns the number of host buffers
|
||
|
USHORT GetHostBuffers() { return m_HostBuffers; }
|
||
|
// Returns the number of client buffers
|
||
|
USHORT GetClientBuffers() { return m_ClientBuffers; }
|
||
|
// Returns the buffer length
|
||
|
USHORT GetBufferLength() { return m_BufferLength; }
|
||
|
// Gets additional information about the WinStation
|
||
|
void QueryAdditionalInformation();
|
||
|
// Shadow this WinStation
|
||
|
void Shadow();
|
||
|
// connect to this WinStation
|
||
|
void Connect(BOOL bUser);
|
||
|
// show status dialog
|
||
|
void ShowStatus();
|
||
|
// Are there outstanding threads?
|
||
|
BOOL HasOutstandingThreads() { return(m_OutstandingThreads > 0); }
|
||
|
// Is this WinStation down?
|
||
|
BOOL IsDown() { return(m_State == State_Down || m_State == State_Init); }
|
||
|
// Is this WinStation connected?
|
||
|
BOOL IsConnected() { return(m_State == State_Connected || m_State == State_Active); }
|
||
|
// Is this WinStation disconnected?
|
||
|
BOOL IsDisconnected() { return(m_State == State_Disconnected); }
|
||
|
// Is this WinStation active?
|
||
|
BOOL IsActive() { return(m_State == State_Active); }
|
||
|
// Is this WinStation idle?
|
||
|
BOOL IsIdle() { return(m_State == State_Idle); }
|
||
|
// Is this WinStation a listener?
|
||
|
BOOL IsListener() { return(m_State == State_Listen); }
|
||
|
// Is this the system console
|
||
|
BOOL IsSystemConsole() { return(0 == lstrcmpi(m_Name, ((CWinAdminApp*)AfxGetApp())->m_szSystemConsole)); }
|
||
|
// Returns TRUE if this WinStation is on the current server
|
||
|
BOOL IsOnCurrentServer() { return m_pServer->IsCurrentServer(); }
|
||
|
// Returns TRUE if the current user is logged in on this WinStation
|
||
|
BOOL IsCurrentUser() { return(m_pServer->IsCurrentServer() && m_LogonId == ((CWinAdminApp*)AfxGetApp())->GetCurrentLogonId()); }
|
||
|
//BOOL IsCurrentUser() { return(m_pServer->IsCurrentServer() && (lstrcmpi(m_UserName, ((CWinAdminApp*)AfxGetApp())->GetCurrentUserName()) == 0)); }
|
||
|
// Returns TRUE if this is the current WinStation
|
||
|
BOOL IsCurrentWinStation() { return(m_pServer->IsCurrentServer() && m_LogonId == ((CWinAdminApp*)AfxGetApp())->GetCurrentLogonId()); }
|
||
|
// Returns the handle to this WinStations's tree item
|
||
|
HTREEITEM GetTreeItem() { return m_hTreeItem; }
|
||
|
HTREEITEM GetTreeItemFromFav( ) { return m_hFavTree; }
|
||
|
HTREEITEM GetTreeItemFromThisComputer( ) { return m_hTreeThisComputer; }
|
||
|
// Sets the tree item handle
|
||
|
void SetTreeItem(HTREEITEM handle) { m_hTreeItem = handle; }
|
||
|
void SetTreeItemForFav( HTREEITEM handle ) { m_hFavTree = handle; }
|
||
|
void SetTreeItemForThisComputer( HTREEITEM handle ) { m_hTreeThisComputer = handle; }
|
||
|
// Returns the number of colors
|
||
|
TCHAR *GetColors() { return m_Colors; }
|
||
|
// Returns the vertical resolution
|
||
|
USHORT GetVRes() { return m_VRes; }
|
||
|
// Returns the horizontal resolution
|
||
|
USHORT GetHRes() { return m_HRes; }
|
||
|
// Returns the protocol
|
||
|
USHORT GetProtocolType() { return m_ProtocolType; }
|
||
|
// Returns the encryption level
|
||
|
BYTE GetEncryptionLevel() { return m_EncryptionLevel; }
|
||
|
// Sets the encryption level
|
||
|
void SetEncryptionLevel(BYTE level) { m_EncryptionLevel = level; }
|
||
|
|
||
|
// Fills in the CString with the description of the Encryption level
|
||
|
BOOL GetEncryptionLevelString(CString *pString) {
|
||
|
if(m_pWd) {
|
||
|
return m_pWd->GetEncryptionLevelString(m_EncryptionLevel, pString);
|
||
|
}
|
||
|
else return FALSE;
|
||
|
}
|
||
|
// Returns the name of the Wd in the registry
|
||
|
TCHAR *GetWdRegistryName() { return (m_pWd) ? m_pWd->GetRegistryName() : NULL; }
|
||
|
|
||
|
// Returns the time of the last update to this WinStation's data
|
||
|
clock_t GetLastUpdateClock() { return m_LastUpdateClock; }
|
||
|
void SetLastUpdateClock() { m_LastUpdateClock = clock(); }
|
||
|
|
||
|
// Is this an ICA WinStation?
|
||
|
BOOL IsICA() { return(m_ProtocolType == PROTOCOL_ICA); }
|
||
|
|
||
|
// Can this WinStation be shadowed
|
||
|
BOOL CanBeShadowed() { return((m_WinStationFlags & WF_CAN_BE_SHADOWED) > 0); }
|
||
|
void SetCanBeShadowed() { m_WinStationFlags |= WF_CAN_BE_SHADOWED; }
|
||
|
void ClearCanBeShadowed() { m_WinStationFlags &= ~WF_CAN_BE_SHADOWED; }
|
||
|
|
||
|
BOOLEAN IsDirectAsync() { return (m_WinStationFlags & WF_DIRECT_ASYNC) > 0; }
|
||
|
void SetDirectAsync() { m_WinStationFlags |= WF_DIRECT_ASYNC; }
|
||
|
void ClearDirectAsync() { m_WinStationFlags &= ~WF_DIRECT_ASYNC; }
|
||
|
|
||
|
BOOLEAN IsCurrent() { return (m_WinStationFlags & WF_CURRENT) > 0; }
|
||
|
void SetCurrent() { m_WinStationFlags |= WF_CURRENT; }
|
||
|
void ClearCurrent() { m_WinStationFlags &= ~WF_CURRENT; }
|
||
|
|
||
|
BOOLEAN IsChanged() { return (m_WinStationFlags & WF_CHANGED) > 0; }
|
||
|
void SetChanged() { m_WinStationFlags |= WF_CHANGED; }
|
||
|
void ClearChanged() { m_WinStationFlags &= ~WF_CHANGED; }
|
||
|
|
||
|
BOOLEAN IsNew() { return (m_WinStationFlags & WF_NEW) > 0; }
|
||
|
void SetNew() { m_WinStationFlags |= WF_NEW; }
|
||
|
void ClearNew() { m_WinStationFlags &= ~WF_NEW; }
|
||
|
|
||
|
BOOLEAN IsSelected() { return (m_WinStationFlags & WF_SELECTED) > 0; }
|
||
|
void SetSelected()
|
||
|
{
|
||
|
if (!IsSelected())
|
||
|
{
|
||
|
m_WinStationFlags |= WF_SELECTED;
|
||
|
m_pServer->IncrementNumWinStationsSelected();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ClearSelected()
|
||
|
{
|
||
|
if (IsSelected())
|
||
|
{
|
||
|
m_WinStationFlags &= ~WF_SELECTED;
|
||
|
m_pServer->DecrementNumWinStationsSelected();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOLEAN HasUser() { return (m_WinStationFlags & WF_HAS_USER) > 0; }
|
||
|
void SetHasUser() { m_WinStationFlags |= WF_HAS_USER; }
|
||
|
void ClearHasUser() { m_WinStationFlags &= ~WF_HAS_USER; }
|
||
|
|
||
|
BOOLEAN AdditionalDone() { return (m_WinStationFlags & WF_ADDITIONAL_DONE) > 0; }
|
||
|
void SetAdditionalDone() { m_WinStationFlags |= WF_ADDITIONAL_DONE; }
|
||
|
void ClearAdditionalDone() { m_WinStationFlags &= ~WF_ADDITIONAL_DONE; }
|
||
|
|
||
|
BOOL QueriesSuccessful() { return (m_WinStationFlags & WF_QUERIES_SUCCESSFUL) > 0; }
|
||
|
void SetQueriesSuccessful() { m_WinStationFlags |= WF_QUERIES_SUCCESSFUL; }
|
||
|
void ClearQueriesSuccessful() { m_WinStationFlags &= ~WF_QUERIES_SUCCESSFUL; }
|
||
|
|
||
|
// Sets the pointer to the info from the extension DLL
|
||
|
void SetExtensionInfo(void *p) { m_pExtensionInfo = p; }
|
||
|
// Returns the pointer to the info from the extension DLL
|
||
|
void *GetExtensionInfo() { return m_pExtensionInfo; }
|
||
|
// Sets the pointer to the info from the extension DLL
|
||
|
void SetExtendedInfo(ExtWinStationInfo *p) { m_pExtWinStationInfo = p; }
|
||
|
// Returns a pointer to the info from the extension DLL
|
||
|
ExtWinStationInfo *GetExtendedInfo() { return m_pExtWinStationInfo; }
|
||
|
// Returns a pointer to the module info from the extension DLL
|
||
|
ExtModuleInfo *GetExtModuleInfo() { return m_pExtModuleInfo; }
|
||
|
// Sets the pointer to the module info from the extension DLL
|
||
|
void SetExtModuleInfo(ExtModuleInfo *m) { m_pExtModuleInfo = m; }
|
||
|
// Returns the number of modules
|
||
|
ULONG GetNumModules() { return m_NumModules; }
|
||
|
|
||
|
void BeginOutstandingThread() {
|
||
|
::InterlockedIncrement(&m_OutstandingThreads);
|
||
|
//((CWinAdminApp*)AfxGetApp())->BeginOutStandingThread());
|
||
|
}
|
||
|
|
||
|
void EndOutstandingThread() {
|
||
|
::InterlockedDecrement(&m_OutstandingThreads);
|
||
|
//((CWinAdminApp*)AfxGetApp())->EndOutStandingThread());
|
||
|
}
|
||
|
|
||
|
// static member function to send a message to a WinStation
|
||
|
// Called with AfxBeginThread
|
||
|
static UINT SendMessage(LPVOID);
|
||
|
// static member function to disconnect a WinStation
|
||
|
// Called with AfxBeginThread
|
||
|
static UINT Disconnect(LPVOID);
|
||
|
// static member function to reset a WinStation
|
||
|
// Called with AfxBeginThread
|
||
|
static UINT Reset(LPVOID);
|
||
|
|
||
|
private:
|
||
|
CServer* m_pServer;
|
||
|
CWd* m_pWd;
|
||
|
ULONG m_LogonId;
|
||
|
WINSTATIONNAME m_Name;
|
||
|
WINSTATIONSTATECLASS m_State;
|
||
|
ULONG m_SortOrder;
|
||
|
TCHAR m_Comment[WINSTATIONCOMMENT_LENGTH + 1];
|
||
|
TCHAR m_UserName[USERNAME_LENGTH + 1];
|
||
|
SDCLASS m_SdClass;
|
||
|
LARGE_INTEGER m_LogonTime;
|
||
|
LARGE_INTEGER m_LastInputTime;
|
||
|
LARGE_INTEGER m_CurrentTime;
|
||
|
ELAPSEDTIME m_IdleTime;
|
||
|
WDNAME m_WdName;
|
||
|
PDNAME m_PdName;
|
||
|
TCHAR m_ClientName[CLIENTNAME_LENGTH + 1];
|
||
|
ULONG m_ClientBuildNumber;
|
||
|
TCHAR m_ClientDir[256];
|
||
|
TCHAR m_ModemName[256];
|
||
|
TCHAR m_ClientLicense[30];
|
||
|
USHORT m_ClientProductId;
|
||
|
ULONG m_ClientSerialNumber;
|
||
|
TCHAR m_ClientAddress[30];
|
||
|
USHORT m_HostBuffers;
|
||
|
USHORT m_ClientBuffers;
|
||
|
USHORT m_BufferLength;
|
||
|
LONG m_OutstandingThreads; // the number of outstanding threads
|
||
|
|
||
|
HTREEITEM m_hTreeItem; // tree item for this WinStation in the servers tree view
|
||
|
HTREEITEM m_hFavTree;
|
||
|
HTREEITEM m_hTreeThisComputer;
|
||
|
USHORT m_VRes; // Vertical resolution
|
||
|
USHORT m_HRes; // Horizontal resolution
|
||
|
TCHAR m_Colors[4]; // Number of colors (as an ASCII string)
|
||
|
clock_t m_LastUpdateClock; // Tick count when we last update this WinStation's info
|
||
|
USHORT m_ProtocolType; // Protocol - PROTOCOL_ICA or PROTOCOL_RDP
|
||
|
BYTE m_EncryptionLevel; // security level of encryption pd
|
||
|
|
||
|
ULONG m_WinStationFlags;
|
||
|
|
||
|
// Pointer to information stored by the extension DLL
|
||
|
void *m_pExtensionInfo;
|
||
|
ExtWinStationInfo *m_pExtWinStationInfo;
|
||
|
ExtModuleInfo *m_pExtModuleInfo;
|
||
|
ULONG m_NumModules;
|
||
|
TCHAR m_clientDigProductId[CLIENT_PRODUCT_ID_LENGTH];
|
||
|
};
|
||
|
|
||
|
// Process flags
|
||
|
const ULONG PF_SYSTEM = 0x00000001;
|
||
|
const ULONG PF_SELECTED = 0x00000002;
|
||
|
const ULONG PF_TERMINATING = 0x00000004; // Currently trying to terminate it
|
||
|
const ULONG PF_CHANGED = 0x00000008; // Changed during last enumeration
|
||
|
const ULONG PF_CURRENT = 0x00000010; // Still active during last enumeration
|
||
|
const ULONG PF_NEW = 0x00000020; // New this enumeration
|
||
|
|
||
|
class CProcess : public CObject
|
||
|
{
|
||
|
public:
|
||
|
// Constructor
|
||
|
CProcess(ULONG PID,
|
||
|
ULONG LogonId,
|
||
|
CServer *pServer,
|
||
|
PSID pSID,
|
||
|
CWinStation *pWinStation,
|
||
|
TCHAR *ImageName);
|
||
|
|
||
|
// Updates a process with new information from another process
|
||
|
BOOL Update(CProcess *pProcess);
|
||
|
// Returns a pointer to the server that this Process if running on
|
||
|
CServer *GetServer() { return m_pServer; }
|
||
|
// Sets the Server
|
||
|
void SetServer(CServer *pServer) { m_pServer = pServer; }
|
||
|
// Returns a pointer to the WinStation that owns this process
|
||
|
CWinStation *GetWinStation() { return m_pWinStation; }
|
||
|
// Sets the Winstation
|
||
|
void SetWinStation(CWinStation *pWinStation) { m_pWinStation = pWinStation; }
|
||
|
// Returns the PID of this process
|
||
|
ULONG GetPID() { return m_PID; }
|
||
|
|
||
|
// Returns the LogonId for this process
|
||
|
ULONG GetLogonId() { return m_LogonId; }
|
||
|
// Returns a pointer to the image name
|
||
|
TCHAR *GetImageName() { return m_ImageName; }
|
||
|
// Returns a pointer to the user name
|
||
|
TCHAR *GetUserName() { return m_UserName; }
|
||
|
// Returns TRUE if this process belongs to the current user
|
||
|
// BOOL IsCurrentUsers() { return (m_pServer->IsCurrentServer()
|
||
|
// && wcscmp(m_UserName, ((CWinAdminApp*)AfxGetApp())->GetCurrentUserName())==0); }
|
||
|
|
||
|
BOOL IsCurrentUsers() { return(m_pServer->IsCurrentServer() && m_LogonId == ((CWinAdminApp*)AfxGetApp())->GetCurrentLogonId()); }
|
||
|
|
||
|
|
||
|
BOOLEAN IsSystemProcess() { return (m_Flags & PF_SYSTEM) > 0; }
|
||
|
void SetSystemProcess() { m_Flags |= PF_SYSTEM; }
|
||
|
void ClearSystemProcess() { m_Flags &= ~PF_SYSTEM; }
|
||
|
|
||
|
BOOLEAN IsSelected() { return (m_Flags & PF_SELECTED) > 0; }
|
||
|
void SetSelected() { m_Flags |= PF_SELECTED; m_pServer->IncrementNumProcessesSelected(); }
|
||
|
void ClearSelected() { m_Flags &= ~PF_SELECTED; m_pServer->DecrementNumProcessesSelected(); }
|
||
|
|
||
|
BOOLEAN IsTerminating() { return (m_Flags & PF_TERMINATING) > 0; }
|
||
|
void SetTerminating() { m_Flags |= PF_TERMINATING; }
|
||
|
void ClearTerminating() { m_Flags &= ~PF_TERMINATING; }
|
||
|
|
||
|
BOOLEAN IsCurrent() { return (m_Flags & PF_CURRENT) > 0; }
|
||
|
void SetCurrent() { m_Flags |= PF_CURRENT; }
|
||
|
void ClearCurrent() { m_Flags &= ~PF_CURRENT; }
|
||
|
|
||
|
BOOLEAN IsChanged() { return (m_Flags & PF_CHANGED) > 0; }
|
||
|
void SetChanged() { m_Flags |= PF_CHANGED; }
|
||
|
void ClearChanged() { m_Flags &= ~PF_CHANGED; }
|
||
|
|
||
|
BOOLEAN IsNew() { return (m_Flags & PF_NEW) > 0; }
|
||
|
void SetNew() { m_Flags |= PF_NEW; }
|
||
|
void ClearNew() { m_Flags &= ~PF_NEW; }
|
||
|
|
||
|
private:
|
||
|
// Determine whether or not this is a system process
|
||
|
BOOL QuerySystemProcess();
|
||
|
// Determine which user owns a process
|
||
|
void DetermineProcessUser(PSID pSid);
|
||
|
|
||
|
ULONG m_PID;
|
||
|
ULONG m_LogonId;
|
||
|
USHORT m_SidCrc;
|
||
|
TCHAR m_ImageName[20];//[MAX_PROCESSNAME+1];
|
||
|
TCHAR m_UserName[USERNAME_LENGTH+1];
|
||
|
CServer *m_pServer;
|
||
|
CWinStation *m_pWinStation;
|
||
|
ULONG m_Flags;
|
||
|
};
|
||
|
|
||
|
class CAdminView : public CView
|
||
|
{
|
||
|
public:
|
||
|
virtual void Reset(void *) { }
|
||
|
virtual LRESULT OnTabbed( WPARAM , LPARAM ){ return 0;}
|
||
|
};
|
||
|
|
||
|
//=------------------------------------------------
|
||
|
class CMyTabCtrl : public CTabCtrl
|
||
|
{
|
||
|
public:
|
||
|
CMyTabCtrl()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
protected:
|
||
|
afx_msg void OnSetFocus( CWnd* );
|
||
|
DECLARE_MESSAGE_MAP()
|
||
|
};
|
||
|
//=------------------------------------------------
|
||
|
|
||
|
class CAdminPage : public CFormView
|
||
|
{
|
||
|
friend class CServerView;
|
||
|
friend class CWinStationView;
|
||
|
friend class CAllServersView;
|
||
|
friend class CDomainView;
|
||
|
|
||
|
public:
|
||
|
CAdminPage(UINT nIDTemplate);
|
||
|
CAdminPage();
|
||
|
DECLARE_DYNCREATE(CAdminPage)
|
||
|
|
||
|
virtual void Reset(void *) { }
|
||
|
virtual void ClearSelections() { }
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct _columndefs {
|
||
|
UINT stringID;
|
||
|
int format;
|
||
|
int width;
|
||
|
} ColumnDef;
|
||
|
|
||
|
// Commonly used column definitions
|
||
|
#define CD_SERVER { IDS_COL_SERVER, LVCFMT_LEFT, 115 }
|
||
|
#define CD_USER { IDS_COL_USER, LVCFMT_LEFT, 100 }
|
||
|
#define CD_USER2 { IDS_COL_USER, LVCFMT_LEFT, 80 }
|
||
|
#define CD_USER3 { IDS_COL_USER, LVCFMT_LEFT, 90 }
|
||
|
#define CD_SESSION { IDS_COL_WINSTATION, LVCFMT_LEFT, 80 }
|
||
|
#define CD_SESSION2 { IDS_COL_WINSTATION, LVCFMT_LEFT, 100 }
|
||
|
#define CD_ID { IDS_COL_ID, LVCFMT_RIGHT, 30 }
|
||
|
#define CD_STATE { IDS_COL_STATE, LVCFMT_LEFT, 50 }
|
||
|
#define CD_TYPE { IDS_COL_TYPE, LVCFMT_LEFT, 80 }
|
||
|
#define CD_CLIENT_NAME { IDS_COL_CLIENT_NAME, LVCFMT_LEFT, 80 }
|
||
|
#define CD_IDLETIME { IDS_COL_IDLETIME, LVCFMT_RIGHT, 80 }
|
||
|
#define CD_LOGONTIME { IDS_COL_LOGONTIME, LVCFMT_LEFT, 90 }
|
||
|
#define CD_COMMENT { IDS_COL_COMMENT, LVCFMT_LEFT, 200 }
|
||
|
// Server Columns
|
||
|
#define CD_TCPADDRESS { IDS_COL_TCPADDRESS, LVCFMT_LEFT, 90 }
|
||
|
#define CD_IPXADDRESS { IDS_COL_IPXADDRESS, LVCFMT_LEFT, 110 }
|
||
|
#define CD_NUM_SESSIONS { IDS_COL_NUM_WINSTATIONS, LVCFMT_RIGHT, 70 }
|
||
|
// License Columns
|
||
|
#define CD_LICENSE_DESC { IDS_COL_LICENSE_DESC, LVCFMT_LEFT, 200 }
|
||
|
#define CD_LICENSE_REG { IDS_COL_LICENSE_REGISTERED, LVCFMT_CENTER, 80 }
|
||
|
#define CD_USERCOUNT { IDS_COL_USERCOUNT, LVCFMT_RIGHT, 80 }
|
||
|
#define CD_POOLCOUNT { IDS_COL_POOLCOUNT, LVCFMT_RIGHT, 80 }
|
||
|
#define CD_LICENSE_NUM { IDS_COL_LICENSE_NUMBER, LVCFMT_LEFT, 240 }
|
||
|
// Process Columns
|
||
|
#define CD_PROC_ID { IDS_COL_ID, LVCFMT_RIGHT, 30 }
|
||
|
#define CD_PROC_PID { IDS_COL_PID, LVCFMT_RIGHT, 50 }
|
||
|
#define CD_PROC_IMAGE { IDS_COL_IMAGE, LVCFMT_LEFT, 100 }
|
||
|
// Hotfix Columns
|
||
|
#define CD_HOTFIX { IDS_COL_HOTFIX, LVCFMT_LEFT, 90 }
|
||
|
#define CD_INSTALLED_BY { IDS_COL_INSTALLED_BY, LVCFMT_LEFT, 90 }
|
||
|
#define CD_INSTALLED_ON { IDS_COL_INSTALLED_ON, LVCFMT_LEFT, 150 }
|
||
|
|
||
|
|
||
|
// Definitions of PageDef flags
|
||
|
const UINT PF_PICASSO_ONLY = 0x0001;
|
||
|
const UINT PF_NO_TAB = 0x0002;
|
||
|
|
||
|
typedef struct _pagedef {
|
||
|
CAdminPage *m_pPage;
|
||
|
CRuntimeClass *m_pRuntimeClass;
|
||
|
UINT tabStringID;
|
||
|
int page;
|
||
|
UINT flags;
|
||
|
} PageDef;
|
||
|
//defines for help
|
||
|
|
||
|
//=================================================================================
|
||
|
|
||
|
#define ID_HELP_FILE L"tsadmin.hlp"
|
||
|
|
||
|
//==================================================================================
|
||
|
#define HIDC_MESSAGE_TITLE 0x500FB
|
||
|
#define HIDC_SHADOWSTART_HOTKEY 0x500F1
|
||
|
#define HIDC_SHADOWSTART_SHIFT 0x500F2
|
||
|
#define HIDC_SHADOWSTART_CTRL 0x500F3
|
||
|
#define HIDC_SHADOWSTART_ALT 0x500F4
|
||
|
#define HIDC_MESSAGE_TITLE 0x500FB
|
||
|
#define HIDC_MESSAGE_MESSAGE 0x500FC
|
||
|
#define HIDC_COMMON_USERNAME 0x5012C
|
||
|
#define HIDC_COMMON_WINSTATIONNAME 0x5012D
|
||
|
#define HIDC_COMMON_IBYTES 0x5012E
|
||
|
#define HIDC_COMMON_OBYTES 0x5012F
|
||
|
#define HIDC_COMMON_IFRAMES 0x50130
|
||
|
#define HIDC_COMMON_OFRAMES 0x50131
|
||
|
#define HIDC_COMMON_IBYTESPERFRAME 0x50132
|
||
|
#define HIDC_COMMON_OBYTESPERFRAME 0x50133
|
||
|
#define HIDC_COMMON_IFRAMEERRORS 0x50134
|
||
|
#define HIDC_COMMON_OFRAMEERRORS 0x50135
|
||
|
#define HIDC_COMMON_IPERCENTFRAMEERRORS 0x50136
|
||
|
#define HIDC_COMMON_OPERCENTFRAMEERRORS 0x50137
|
||
|
#define HIDC_COMMON_ITIMEOUTERRORS 0x50138
|
||
|
#define HIDC_COMMON_OTIMEOUTERRORS 0x50139
|
||
|
#define HIDC_COMMON_ICOMPRESSIONRATIO 0x5013A
|
||
|
#define HIDC_COMMON_OCOMPRESSIONRATIO 0x5013B
|
||
|
#define HIDC_REFRESHNOW 0x50140
|
||
|
#define HIDC_RESETCOUNTERS 0x50141
|
||
|
#define HIDC_MOREINFO 0x50142
|
||
|
#define HIDC_ASYNC_DEVICE 0x5015F
|
||
|
#define HIDC_ASYNC_BAUD 0x50160
|
||
|
#define HIDC_ASYNC_DTR 0x50161
|
||
|
#define HIDC_ASYNC_RTS 0x50162
|
||
|
#define HIDC_ASYNC_CTS 0x50163
|
||
|
#define HIDC_ASYNC_DSR 0x50164
|
||
|
#define HIDC_ASYNC_DCD 0x50165
|
||
|
#define HIDC_ASYNC_RI 0x50166
|
||
|
#define HIDC_ASYNC_IFRAMING 0x50167
|
||
|
#define HIDC_ASYNC_IOVERRUN 0x50168
|
||
|
#define HIDC_ASYNC_IOVERFLOW 0x50169
|
||
|
#define HIDC_ASYNC_IPARITY 0x5016A
|
||
|
#define HIDC_ASYNC_OFRAMING 0x5016B
|
||
|
#define HIDC_ASYNC_OOVERRUN 0x5016C
|
||
|
#define HIDC_ASYNC_OOVERFLOW 0x5016D
|
||
|
#define HIDC_ASYNC_OPARITY 0x5016E
|
||
|
#define HIDC_NETWORK_LANADAPTER 0x50173
|
||
|
#define HIDC_PREFERENCES_PROC_MANUAL 0x503EF
|
||
|
#define HIDC_PREFERENCES_PROC_EVERY 0x503F0
|
||
|
#define HIDC_PREFERENCES_PROC_SECONDS 0x503F1
|
||
|
#define HIDC_PREFERENCES_STATUS_MANUAL 0x503F3
|
||
|
#define HIDC_PREFERENCES_STATUS_EVERY 0x503F4
|
||
|
#define HIDC_PREFERENCES_STATUS_SECONDS 0x503F5
|
||
|
#define HIDC_PREFERENCES_CONFIRM 0x503F7
|
||
|
#define HIDC_PREFERENCES_SAVE 0x503F8
|
||
|
#define HIDC_PREFERENCES_REMEMBER 0X50443
|
||
|
|
||
|
#define HIDD_SERVER_WINSTATIONS 0x20084
|
||
|
#define HIDD_SERVER_PROCESSES 0x20085
|
||
|
#define HIDD_SERVER_USERS 0x20086
|
||
|
#define HIDD_SERVER_LICENSES 0x20087
|
||
|
#define HIDD_WINSTATION_INFO 0x20099
|
||
|
#define HIDD_WINSTATION_PROCESSES 0x2009A
|
||
|
#define HIDD_PREFERENCES 0x2009C
|
||
|
#define HIDD_SERVER_INFO 0x2009D
|
||
|
#define HIDD_MESSAGE 0x200FA
|
||
|
#define HIDD_ASYNC_STATUS 0x2015E
|
||
|
#define HIDD_NETWORK_STATUS 0x20172
|
||
|
#define HIDD_CONNECT_PASSWORD 0x201B8
|
||
|
#define HIDD_ALL_SERVER_PROCESSES 0x201BA
|
||
|
#define HIDD_ALL_SERVER_USERS 0x201BB
|
||
|
#define HIDD_ALL_SERVER_SESSIONS 0x201BC
|
||
|
#define HIDD_BAD_SERVER 0x201BE
|
||
|
#define HIDD_LISTENER 0x201BF
|
||
|
#define HIDD_WINSTATION_NOINFO 0x201C0
|
||
|
#define HIDD_BUSY_SERVER 0x201C1
|
||
|
#define HIDD_WINSTATION_CACHE 0x201C2
|
||
|
#define HIDD_BAD_WINSTATION 0x201C3
|
||
|
|
||
|
//==========================================================================================
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//Global variable for help
|
||
|
|
||
|
static const DWORD aMenuHelpIDs[] =
|
||
|
{
|
||
|
IDC_MESSAGE_TITLE, HIDC_MESSAGE_TITLE,
|
||
|
IDC_MESSAGE_MESSAGE,HIDC_MESSAGE_MESSAGE,
|
||
|
IDC_SHADOWSTART_HOTKEY,HIDC_SHADOWSTART_HOTKEY,
|
||
|
IDC_SHADOWSTART_SHIFT ,HIDC_SHADOWSTART_SHIFT,
|
||
|
IDC_SHADOWSTART_CTRL ,HIDC_SHADOWSTART_CTRL,
|
||
|
IDC_SHADOWSTART_ALT ,HIDC_SHADOWSTART_ALT,
|
||
|
IDC_COMMON_USERNAME ,HIDC_COMMON_USERNAME,
|
||
|
IDC_COMMON_WINSTATIONNAME ,HIDC_COMMON_WINSTATIONNAME,
|
||
|
IDC_COMMON_IBYTES,HIDC_COMMON_IBYTES,
|
||
|
IDC_COMMON_OBYTES ,HIDC_COMMON_OBYTES,
|
||
|
IDC_COMMON_IFRAMES ,HIDC_COMMON_IFRAMES,
|
||
|
IDC_COMMON_OFRAMES ,HIDC_COMMON_OFRAMES,
|
||
|
IDC_COMMON_IBYTESPERFRAME ,HIDC_COMMON_IBYTESPERFRAME,
|
||
|
IDC_COMMON_OBYTESPERFRAME ,HIDC_COMMON_OBYTESPERFRAME,
|
||
|
IDC_COMMON_IFRAMEERRORS ,HIDC_COMMON_IFRAMEERRORS,
|
||
|
IDC_COMMON_OFRAMEERRORS ,HIDC_COMMON_OFRAMEERRORS,
|
||
|
IDC_COMMON_IPERCENTFRAMEERRORS ,HIDC_COMMON_IPERCENTFRAMEERRORS,
|
||
|
IDC_COMMON_OPERCENTFRAMEERRORS ,HIDC_COMMON_OPERCENTFRAMEERRORS,
|
||
|
IDC_COMMON_ITIMEOUTERRORS ,HIDC_COMMON_ITIMEOUTERRORS,
|
||
|
IDC_COMMON_OTIMEOUTERRORS,HIDC_COMMON_OTIMEOUTERRORS,
|
||
|
IDC_COMMON_ICOMPRESSIONRATIO ,HIDC_COMMON_ICOMPRESSIONRATIO,
|
||
|
IDC_COMMON_OCOMPRESSIONRATIO ,HIDC_COMMON_OCOMPRESSIONRATIO,
|
||
|
IDC_REFRESHNOW ,HIDC_REFRESHNOW,
|
||
|
IDC_RESETCOUNTERS,HIDC_RESETCOUNTERS,
|
||
|
IDC_MOREINFO,HIDC_MOREINFO,
|
||
|
IDC_ASYNC_DEVICE, HIDC_ASYNC_DEVICE ,
|
||
|
IDC_ASYNC_BAUD ,HIDC_ASYNC_BAUD ,
|
||
|
IDC_ASYNC_DTR , HIDC_ASYNC_DTR ,
|
||
|
IDC_ASYNC_RTS , HIDC_ASYNC_RTS ,
|
||
|
IDC_ASYNC_CTS , HIDC_ASYNC_CTS ,
|
||
|
IDC_ASYNC_DSR , HIDC_ASYNC_DSR ,
|
||
|
IDC_ASYNC_DCD , HIDC_ASYNC_DCD ,
|
||
|
IDC_ASYNC_RI , HIDC_ASYNC_RI ,
|
||
|
IDC_ASYNC_IFRAMING , HIDC_ASYNC_IFRAMING ,
|
||
|
IDC_ASYNC_IOVERRUN , HIDC_ASYNC_IOVERRUN ,
|
||
|
IDC_ASYNC_IOVERFLOW , HIDC_ASYNC_IOVERFLOW,
|
||
|
IDC_ASYNC_IPARITY , HIDC_ASYNC_IPARITY ,
|
||
|
IDC_ASYNC_OFRAMING , HIDC_ASYNC_OFRAMING ,
|
||
|
IDC_ASYNC_OOVERRUN , HIDC_ASYNC_OOVERRUN ,
|
||
|
IDC_ASYNC_OOVERFLOW , HIDC_ASYNC_OOVERFLOW ,
|
||
|
IDC_ASYNC_OPARITY , HIDC_ASYNC_OPARITY ,
|
||
|
IDC_NETWORK_LANADAPTER, HIDC_NETWORK_LANADAPTER,
|
||
|
IDC_PREFERENCES_PROC_MANUAL ,HIDC_PREFERENCES_PROC_MANUAL ,
|
||
|
IDC_PREFERENCES_PROC_EVERY , HIDC_PREFERENCES_PROC_EVERY ,
|
||
|
IDC_PREFERENCES_PROC_SECONDS , HIDC_PREFERENCES_PROC_SECONDS,
|
||
|
IDC_PREFERENCES_STATUS_MANUAL , HIDC_PREFERENCES_STATUS_MANUAL,
|
||
|
IDC_PREFERENCES_STATUS_EVERY , HIDC_PREFERENCES_STATUS_EVERY,
|
||
|
IDC_PREFERENCES_STATUS_SECONDS , HIDC_PREFERENCES_STATUS_SECONDS ,
|
||
|
IDC_PREFERENCES_STATUS_SECONDS ,HIDC_PREFERENCES_STATUS_SECONDS ,
|
||
|
IDC_PREFERENCES_CONFIRM ,HIDC_PREFERENCES_CONFIRM ,
|
||
|
IDD_WINSTATION_NOINFO,HIDD_WINSTATION_NOINFO,
|
||
|
IDC_PREFERENCES_SAVE , HIDC_PREFERENCES_SAVE,
|
||
|
IDC_PREFERENCES_PERSISTENT ,HIDC_PREFERENCES_REMEMBER,
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
#endif // _WINADMIN_H
|