TSExplorer.wbt
; TSExplorer.wbt
;
; Define some important constants
Title01 = 'Terminal Server Explorer'
Title01_About = 'About the "Terminal Server Explorer"'
; Find out who we are, where we are located and what our version is
AppFileSpec = IntControl(1004,0,0,0,0)
AppPath = FilePath(AppFileSpec)
AppRoot = FileRoot(AppFileSpec)
AppIniSpec = StrCat(AppPath,AppRoot,'.INI')
AppProductVer = FileVerInfo(AppFileSpec,'','ProductVersion')
AppFileVer = FileVerInfo(AppFileSpec,'','FileVersion')
; Get some configuration information from our .INI file
bDebug = IniReadPvt('CONFIG','DEBUG','0',AppIniSpec)
bDebugTrace = IniReadPvt('CONFIG','DEBUGTRACE','0',AppIniSpec)
TraceSpec = IniReadPvt('CONFIG','TRACEFILE',StrCat(AppPath,AppRoot,'.TRC'),AppIniSpec)
; Turn on debugging if necessary
If (bDebug) Then Debug(@ON)
; Turn on debug tracing if necessary
If (bDebugTrace) Then DebugTrace(@ON,TraceSpec)
;Load 32-bit or 64-bit extender
AddExtender('WWWNT34I.DLL' , 0, 'WWWNT64I.DLL' )
AddExtender('WWWTS44I.DLL' , 0, 'WWWTS64I.DLL' )
hVerBuf = wtsVersion(3)
nMajorVer = BinaryPeek4(hVerBuf,0)
nMinorVer = BinaryPeek4(hVerBuf,4)
nRelease = BinaryPeek4(hVerBuf,8)
nBuild = BinaryPeek4(hVerBuf,12)
hVerBuf = BinaryFree(hVerBuf)
AboutMsg = ''
AboutMsg = StrCat(AboutMsg,@CRLF,'wntVersion() = ',wntVersion())
AboutMsg = StrCat(AboutMsg,@CRLF,'wtsVersion(0) = ',wtsVersion(0))
AboutMsg = StrCat(AboutMsg,@CRLF,'wtsVersion(3) = ','[',nMajorVer,'][',nMinorVer,'][',nRelease,'][',nBuild,']')
AboutMsg = StrCat(AboutMsg,@CRLF,@CRLF,'Script File Spec = "',AppFileSpec,'"')
AboutMsg = StrCat(AboutMsg,@CRLF,'Script Product Version = ',AppProductVer)
AboutMsg = StrCat(AboutMsg,@CRLF,'Script File Version = ',AppFileVer)
AboutMsg = StrCat(AboutMsg,@CRLF,@CRLF,'TS API Present? = ',wtsIsTSEnabled(0))
AboutMsg = StrCat(AboutMsg,@CRLF,'TS Product Present? = ',wtsIsTSEnabled(1))
AboutMsg = StrCat(AboutMsg,@CRLF,'TS Virtual Channel Present? = ',wtsIsTSEnabled(2))
AboutMsg = StrCat(AboutMsg,@CRLF,'Citrix WFAPI Present? = ',wtsIsCitrixEnabled(0))
AboutMsg = StrCat(AboutMsg,@CRLF,'Citrix APSDK API Present? = ',wtsIsCitrixEnabled(1))
AboutMsg = StrCat(AboutMsg,@CRLF,'Citrix SMC API Present? = ',wtsIsCitrixEnabled(2))
AboutMsg = StrCat(AboutMsg,@CRLF,'Citrix Virtual Channel Present? = ',wtsIsCitrixEnabled(3))
;Message(Title01,AboutMsg)
; Determine if we can even be allowed to run on this system
bTSAPIPresent = wtsIsTSEnabled(0)
; Determine what our domain name is. If we are in a work group, then set the
; domain to be an empty string.
WSDomainSID = wntLsaPolGet('','PrimaryDomain',2)
If (WSDomainSID == '')
WSDomain = ''
Else
WSDomain = wntLsaPolGet('','PrimaryDomain',1)
EndIf
SelectedServer = ''
PrevServer = ''
; Set our cancel handler...
IntControl(72,2,0,0,0)
; Only allow single item selections in list boxes...
IntControl(33,0,0,0,0)
; Declare the subroutine that processes our main dialog box.
;
; Also declare other constant values that are important for dialog processing...
PROCOPT_INITIALIZE = 0
PROCOPT_BUTTON_PUSH = 2
PROCOPT_EDITBOX_CHANGE = 5
PROCOPT_ITEM_SELECT = 7
PROCOPT_DROPLISTBOX_CHANGE = 8
BUTTON_CLOSE = 1
DROPLISTBOX_TSSERVERLIST = 2
BUTTON_REFRESH_SERVERS = 3
ITEMBOX_SESSLIST = 6
BUTTON_REFRESH_SESSIONS = 7
BUTTON_REFRESH_PROCESSES = 9
MULTILINEBOX_PROCLIST = 10
MULTILINEBOX_SESSINFO = 12
BUTTON_SEND_MESSAGE = 13
BUTTON_LOGOFF_SESSION = 14
BUTTON_DISCONNECT_SESSION = 15
EDITBOX_CONNSESSID = 17
EDITBOX_DOMAIN = 18
BUTTON_ABOUT = 20
EDITBOX_SERVER = 22
#DefineSubRoutine MainDlgProc(DialogHandle, EventCode, ControlNum, Res4, Res5)
If (bDebugTrace) Then DebugTrace(@ON,TraceSpec)
IntControl(72,2,0,0,0)
Switch (EventCode)
Case PROCOPT_INITIALIZE
DialogProcOptions(DialogHandle, PROCOPT_BUTTON_PUSH, 1)
If (bTSAPIPresent)
DialogProcOptions(DialogHandle, PROCOPT_DROPLISTBOX_CHANGE, 1)
DialogProcOptions(DialogHandle, PROCOPT_ITEM_SELECT, 1)
; if (!bAddGroups) then DialogControlState(DialogHandle,BUTTON_ADD_GROUPS,3,2)
DialogControlSet(DialogHandle, EDITBOX_DOMAIN, 3, WSDomain)
TSServerList = ListTSServers(WSDomain)
DialogControlSet(DialogHandle, DROPLISTBOX_TSSERVERLIST, 5, TSServerList)
SessList = ''
DialogControlSet(DialogHandle, ITEMBOX_SESSLIST, 5, SessList)
ProcList = ''
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
SessInfo = ''
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
ConnSessId = ''
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
DialogControlSet(DialogHandle, EDITBOX_SERVER, 3, '')
Else
DialogControlSet(DialogHandle, EDITBOX_DOMAIN, 3, '')
TSServerList = ''
DialogControlSet(DialogHandle, DROPLISTBOX_TSSERVERLIST, 5, TSServerList)
SessList = ''
DialogControlSet(DialogHandle, ITEMBOX_SESSLIST, 5, SessList)
ProcList = ''
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
SessInfo = 'Error! Terminal Services API is not present.'
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 13, '255|0|0')
ConnSessId = ''
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
DialogControlSet(DialogHandle, EDITBOX_SERVER, 3, '')
DialogControlState(DialogHandle, DROPLISTBOX_TSSERVERLIST, 3, 2)
DialogControlState(DialogHandle, ITEMBOX_SESSLIST, 3, 2)
DialogControlState(DialogHandle, BUTTON_REFRESH_SERVERS, 3, 2)
DialogControlState(DialogHandle, BUTTON_REFRESH_SESSIONS, 3, 2)
DialogControlState(DialogHandle, BUTTON_REFRESH_PROCESSES, 3, 2)
DialogControlState(DialogHandle, MULTILINEBOX_PROCLIST, 3, 2)
DialogControlState(DialogHandle, BUTTON_SEND_MESSAGE, 3, 2)
DialogControlState(DialogHandle, BUTTON_LOGOFF_SESSION, 3, 2)
DialogControlState(DialogHandle, BUTTON_DISCONNECT_SESSION, 3, 2)
DialogControlState(DialogHandle, EDITBOX_CONNSESSID, 3, 2)
DialogControlState(DialogHandle, EDITBOX_DOMAIN, 3, 2)
DialogControlState(DialogHandle, EDITBOX_SERVER, 3, 2)
EndIf
Break
Case PROCOPT_ITEM_SELECT
If (ControlNum == ITEMBOX_SESSLIST)
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
TempServer = DialogControlGet(DialogHandle, EDITBOX_SERVER, 3)
TempSess = DialogControlGet(DialogHandle, ITEMBOX_SESSLIST, 6)
If (TempServer != '')
ErrorMode(@OFF)
TempServerType = wntServerType(TempServer)
ErrorMode(@CANCEL)
If (TempServerType != 4)
TempServer = ''
EndIf
EndIf
If (TempServer == PrevServer)
If (TempServer != '')
SessInfo = GetTSSessInfo(TempServer,TempSess)
Else
TempSess = ''
EndIf
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
If ((TempServer != '') && (TempSess != ''))
ProcList = ListTSProcesses(TempServer,TempSess)
Else
ProcList = ''
EndIf
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
Else
GoSub RefreshServers
EndIf
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
Return -2 ; Don't terminate the dialog
EndIf
Break
Case PROCOPT_DROPLISTBOX_CHANGE
If (ControlNum == DROPLISTBOX_TSSERVERLIST)
TempServer = DialogControlGet(DialogHandle, DROPLISTBOX_TSSERVERLIST, 6)
DialogControlSet(DialogHandle, EDITBOX_SERVER, 3, TempServer)
PrevServer = TempServer
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
If (TempServer != '')
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
SessList = ListTSSessions(TempServer)
DialogControlSet(DialogHandle, ITEMBOX_SESSLIST, 5, SessList)
ProcList = ''
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
SessInfo = ''
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
ConnSessId = GetTSConnSessId(TempServer)
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
Else
SessList = ''
DialogControlSet(DialogHandle, ITEMBOX_SESSLIST, 5, SessList)
ProcList = ''
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
SessInfo = ''
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
ConnSessId = ''
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
EndIf
DialogControlState(DialogHandle, DROPLISTBOX_TSSERVERLIST, 1, 0)
Return -2 ; Don't terminate the dialog
EndIf
Break
Case PROCOPT_BUTTON_PUSH
If (ControlNum == BUTTON_CLOSE)
Return -1
EndIf
If (ControlNum == BUTTON_ABOUT)
Message(Title01_About,AboutMsg)
Return -2 ; Don't terminate the dialog
EndIf
If (ControlNum == BUTTON_REFRESH_SERVERS)
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
GoSub RefreshServers
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
Return -2 ; Don't terminate the dialog
EndIf
If (ControlNum == BUTTON_REFRESH_SESSIONS)
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
TempServer = DialogControlGet(DialogHandle, EDITBOX_SERVER, 3)
TempServer2 = DialogControlGet(DialogHandle, DROPLISTBOX_TSSERVERLIST, 6)
If (TempServer2 != TempServer)
DialogControlSet(DialogHandle, DROPLISTBOX_TSSERVERLIST, 6, '')
EndIf
; Make sure that the server name is for a server that really exists
; before we try to get information about the sessions on it. This
; test is necessary because the user might have manually typed in a
; server name into an editbox instead of using a server name that
; was selected from the list of known terminal server systems.
If (TempServer != '')
ErrorMode(@OFF)
TempServerType = wntServerType(TempServer)
ErrorMode(@CANCEL)
If (TempServerType == 4)
SessList = ListTSSessions(TempServer)
PrevServer = TempServer
Else
SessList = ''
EndIf
Else
SessList = ''
EndIf
DialogControlSet(DialogHandle, ITEMBOX_SESSLIST, 5, SessList)
ProcList = ''
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
SessInfo = ''
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
ConnSessId = GetTSConnSessId(TempServer)
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
Return -2 ; Don't terminate the dialog
EndIf
If (ControlNum == BUTTON_REFRESH_PROCESSES)
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
TempServer = DialogControlGet(DialogHandle, EDITBOX_SERVER, 3)
TempSess = DialogControlGet(DialogHandle, ITEMBOX_SESSLIST, 6)
; Make sure that the server name is for a server that really exists
; before we try to get information about the sessions on it. This
; test is necessary because the user might have manually typed in a
; server name into an editbox instead of using a server name that
; was selected from the list of known terminal server systems.
If (TempServer != '')
ErrorMode(@OFF)
TempServerType = wntServerType(TempServer)
ErrorMode(@CANCEL)
If (TempServerType != 4)
TempServer = ''
EndIf
EndIf
If (TempServer == PrevServer)
If ((TempServer != '') && (TempSess != ''))
ProcList = ListTSProcesses(TempServer,TempSess)
Else
ProcList = ''
EndIf
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
Else
GoSub RefreshServers
EndIf
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
Return -2 ; Don't terminate the dialog
EndIf
If (ControlNum == BUTTON_SEND_MESSAGE)
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
TempServer = DialogControlGet(DialogHandle, EDITBOX_SERVER, 3)
TempSess = DialogControlGet(DialogHandle, ITEMBOX_SESSLIST, 6)
If (TempServer != '')
ErrorMode(@OFF)
TempServerType = wntServerType(TempServer)
ErrorMode(@CANCEL)
If (TempServerType != 4)
TempServer = ''
EndIf
EndIf
If (TempServer == PrevServer)
If ((TempServer != '') && (TempSess != ''))
SendMsgButtons = 1
SendMsgIcon = 65536
SendMsgDefBtn = 65536
If (Dialog('SendMsgDlg') != 0)
SendMsgButtons = SendMsgButtons - 1
If (SendMsgIcon == 65536) Then SendMsgIcon = 0
If (SendMsgDefBtn == 65536) Then SendMsgDefBtn = 0
SendMsgStyle = (SendMsgButtons | SendMsgIcon | SendMsgDefBtn)
ErrorMode(@OFF)
Result = wtsSendMessage(TempServer,TempSess,SendMsgTitle,SendMsgText,SendMsgStyle,SendMsgTimeout,SendMsgWaitFlag)
RC = LastError()
ErrorMode(@CANCEL)
TempMsg = StrCat('wtsSendMessage(...) RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Result = ',Result)
Message(Title01,TempMsg)
EndIf
EndIf
Else
GoSub RefreshServers
EndIf
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
Return -2 ; Don't terminate the dialog
EndIf
If (ControlNum == BUTTON_LOGOFF_SESSION)
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
TempServer = DialogControlGet(DialogHandle, EDITBOX_SERVER, 3)
TempSess = DialogControlGet(DialogHandle, ITEMBOX_SESSLIST, 6)
If (TempServer == PrevServer)
If (TempServer != '')
ErrorMode(@OFF)
TempServerType = wntServerType(TempServer)
ErrorMode(@CANCEL)
If (TempServerType != 4)
TempServer = ''
EndIf
EndIf
If ((TempServer != '') && (TempSess != ''))
ErrorMode(@OFF)
Result = wtsLogoffSession(TempServer,TempSess,@TRUE)
RC = LastError()
ErrorMode(@CANCEL)
TempMsg = StrCat('wtsLogoffSession("',TempServer,'",',TempSess,',@TRUE) RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Result = ',Result)
Message(Title01,TempMsg)
SessList = ListTSSessions(TempServer)
DialogControlSet(DialogHandle, ITEMBOX_SESSLIST, 5, SessList)
ProcList = ''
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
SessInfo = ''
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
ConnSessId = GetTSConnSessId(TempServer)
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
EndIf
Else
GoSub RefreshServers
EndIf
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
Return -2 ; Don't terminate the dialog
EndIf
If (ControlNum == BUTTON_DISCONNECT_SESSION)
DialogProcOptions(DialogHandle, 1000, 2) ; Put dialog into busy state...
TempServer = DialogControlGet(DialogHandle, DROPLISTBOX_TSSERVERLIST, 6)
TempSess = DialogControlGet(DialogHandle, ITEMBOX_SESSLIST, 6)
If (TempServer != '')
ErrorMode(@OFF)
TempServerType = wntServerType(TempServer)
ErrorMode(@CANCEL)
If (TempServerType != 4)
TempServer = ''
EndIf
EndIf
If (TempServer == PrevServer)
If ((TempServer != '') && (TempSess != ''))
ErrorMode(@OFF)
Result = wtsDisconnectSession(TempServer,TempSess,@TRUE)
RC = LastError()
ErrorMode(@CANCEL)
TempMsg = StrCat('wtsDisconnectSession("',TempServer,'",',TempSess,',@TRUE) RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Result = ',Result)
Message(Title01,TempMsg)
SessInfo = GetTSSessInfo(TempServer,TempSess)
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
ProcList = ListTSProcesses(TempServer,TempSess)
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
ConnSessId = GetTSConnSessId(TempServer)
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
EndIf
Else
GoSub RefreshServers
EndIf
DialogProcOptions(DialogHandle, 1000, 0) ; Restore dialog to active state...
Return -2 ; Don't terminate the dialog
EndIf
Break
EndSwitch
Return -1
:CANCEL
IntControl(72,2,0,0,0)
Return
:RefreshServers
WSDomain = DialogControlGet(DialogHandle, EDITBOX_DOMAIN, 3)
TSServerList = ListTSServers(WSDomain)
DialogControlSet(DialogHandle, DROPLISTBOX_TSSERVERLIST, 5, TSServerList)
SessList = ''
DialogControlSet(DialogHandle, ITEMBOX_SESSLIST, 5, SessList)
ProcList = ''
DialogControlSet(DialogHandle, MULTILINEBOX_PROCLIST, 3, ProcList)
SessInfo = ''
DialogControlSet(DialogHandle, MULTILINEBOX_SESSINFO, 3, SessInfo)
ConnSessId = ''
DialogControlSet(DialogHandle, EDITBOX_CONNSESSID, 3, ConnSessId)
DialogControlSet(DialogHandle, EDITBOX_SERVER, 3, '')
Return
#EndSubRoutine
; Define the main dialog box
TSExpMainDlgFormat=`WWWDLGED,6.1`
TSExpMainDlgCaption=`Terminal Server Explorer`
TSExpMainDlgX=-01
TSExpMainDlgY=-01
TSExpMainDlgWidth=368
TSExpMainDlgHeight=212
TSExpMainDlgNumControls=022
TSExpMainDlgProcedure=`MainDlgProc`
TSExpMainDlgFont=`DEFAULT`
TSExpMainDlgTextColor=`DEFAULT`
TSExpMainDlgBackground=`DEFAULT,DEFAULT`
TSExpMainDlgConfig=2
TSExpMainDlg001=`004,196,065,011,PUSHBUTTON,DEFAULT,"&Close",1,1,32,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg002=`004,034,065,074,DROPLISTBOX,TSServerList,DEFAULT,DEFAULT,3,4,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg003=`004,154,065,011,PUSHBUTTON,DEFAULT,"&Refresh Servers",2,5,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg004=`004,018,065,011,STATICTEXT,DEFAULT,"Terminal Server List:",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg005=`004,050,065,011,STATICTEXT,DEFAULT,"Session List",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg006=`004,066,065,043,ITEMBOX,SessList,DEFAULT,DEFAULT,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg007=`004,167,065,011,PUSHBUTTON,DEFAULT,"Refresh &Sessions",3,6,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg008=`105,106,030,011,STATICTEXT,DEFAULT,"Process List",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg009=`004,182,065,009,PUSHBUTTON,DEFAULT,"Refresh &Processes",4,7,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg010=`143,106,216,101,MULTILINEBOX,ProcList,DEFAULT,DEFAULT,14,8,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg011=`105,004,030,011,STATICTEXT,DEFAULT,"Session Info",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg012=`143,004,216,099,MULTILINEBOX,SessInfo,DEFAULT,DEFAULT,13,8,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg013=`071,154,064,011,PUSHBUTTON,DEFAULT,"Send &Message",5,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg014=`071,167,064,011,PUSHBUTTON,DEFAULT,"&Logoff Session",6,9,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg015=`071,182,064,009,PUSHBUTTON,DEFAULT,"&Disconnect Session",7,10,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg016=`004,114,048,011,STATICTEXT,DEFAULT,"Console Session Id",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg017=`006,127,034,011,EDITBOX,ConnSessId,DEFAULT,DEFAULT,12,8,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg018=`042,004,058,011,EDITBOX,WSDomain,DEFAULT,DEFAULT,2,0,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg019=`004,004,035,011,STATICTEXT,DEFAULT,"Domain Name",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg020=`071,196,064,011,PUSHBUTTON,DEFAULT,"&About",8,11,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg021=`073,018,041,011,STATICTEXT,DEFAULT,"Selected Server",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
TSExpMainDlg022=`074,034,062,011,EDITBOX,SelectedServer,DEFAULT,DEFAULT,22,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
ButtonPushed=Dialog("TSExpMainDlg",0) ; WinBatch will not display this dialog.
; Define the dialog box used to send messages...
SendMsgDlgFormat=`WWWDLGED,6.1`
SendMsgDlgCaption=`Send a message to a terminal server session`
SendMsgDlgX=-01
SendMsgDlgY=-01
SendMsgDlgWidth=312
SendMsgDlgHeight=224
SendMsgDlgNumControls=026
SendMsgDlgProcedure=`DEFAULT`
SendMsgDlgFont=`DEFAULT`
SendMsgDlgTextColor=`DEFAULT`
SendMsgDlgBackground=`DEFAULT,DEFAULT`
SendMsgDlg001=`003,147,036,012,PUSHBUTTON,DEFAULT,"&Send",1,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg002=`003,161,036,012,PUSHBUTTON,DEFAULT,"Cancel",0,23,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg003=`003,003,044,012,STATICTEXT,DEFAULT,"Message Title",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg004=`003,021,044,012,STATICTEXT,DEFAULT,"Message Text",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg005=`051,003,256,012,EDITBOX,SendMsgTitle,DEFAULT,DEFAULT,2,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg006=`051,021,256,060,MULTILINEBOX,SendMsgText,DEFAULT,DEFAULT,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg007=`053,087,076,086,GROUPBOX,DEFAULT,"Buttons",DEFAULT,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg008=`133,087,076,086,GROUPBOX,DEFAULT,"Icons",DEFAULT,11,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg009=`213,087,074,086,GROUPBOX,DEFAULT,"Default Button",DEFAULT,17,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg010=`059,097,018,012,RADIOBUTTON,SendMsgButtons,"OK",1,5,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg011=`059,109,048,012,RADIOBUTTON,SendMsgButtons,"OK / Cancel",2,6,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg012=`059,121,066,012,RADIOBUTTON,SendMsgButtons,"Aborty / Retry / Ignore",3,7,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg013=`059,133,056,012,RADIOBUTTON,SendMsgButtons,"Yes / No / Cancel",4,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg014=`059,145,034,012,RADIOBUTTON,SendMsgButtons,"Yes / No",5,9,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg015=`059,157,046,012,RADIOBUTTON,SendMsgButtons,"Retry / Cancel",6,10,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg016=`139,097,044,012,RADIOBUTTON,SendMsgIcon,"None",65536,12,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg017=`139,109,044,012,RADIOBUTTON,SendMsgIcon,"Hand",16,13,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg018=`139,121,044,012,RADIOBUTTON,SendMsgIcon,"Question mark",32,14,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg019=`139,133,052,012,RADIOBUTTON,SendMsgIcon,"Exclamation point",48,15,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg020=`139,145,044,012,RADIOBUTTON,SendMsgIcon,"Asterisk",64,16,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg021=`219,109,044,012,RADIOBUTTON,SendMsgDefBtn,"Button 2",256,19,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg022=`219,097,044,012,RADIOBUTTON,SendMsgDefBtn,"Button 1",65536,18,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg023=`219,121,044,012,RADIOBUTTON,SendMsgDefBtn,"Button 3",512,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg024=`053,181,036,008,STATICTEXT,DEFAULT,"Timeout Value",DEFAULT,99,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg025=`093,179,024,012,SPINNER,SendMsgTimeout,"0",DEFAULT,21,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SendMsgDlg026=`053,195,066,012,CHECKBOX,SendMsgWaitFlag,"Wait for user response?",1,22,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
ButtonPushed=Dialog("SendMsgDlg",0) ; WinBatch will not display this dialog.
; Declare other important subroutines...
#DefineFunction ListTSServers(DomainName)
ErrorMode(@OFF)
ServerList = wntServerList('',DomainName,33554432)
RC = LastError()
ErrorMode(@CANCEL)
If (RC != 0)
TempMsg = StrCat('wntServerList("","',DomainName,'",33554432) RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Error! Unable to obtain a list of terminal server systems.')
Message('ListTSServers()',TempMsg)
Return ''
EndIf
Return ServerList
#EndFunction
#DefineFunction ListTSSessions(ServerSpec)
ErrorMode(@OFF)
SessionArr = wtsEnumSessions(ServerSpec)
RC = LastError()
ErrorMode(@CANCEL)
If (RC != 0)
TempMsg = StrCat('wntEnumSessions("',ServerSpec,'") RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Error! Unable to obtain a list of terminal server sessions.')
Message('ListTSSessions',TempMsg)
Return ''
EndIf
Return SessionArr[1]
#EndFunction
#DefineFunction ListTSProcesses(ServerSpec,SessId)
ErrorMode(@OFF)
ProcessArr = wtsEnumProcesses(ServerSpec,SessId)
RC = LastError()
ErrorMode(@CANCEL)
If (RC != 0)
TempMsg = StrCat('wntEnumProcesses("',ServerSpec,'",',SessId,') RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Error! Unable to obtain a list of terminal server processes.')
Message('ListTSProcesses()',TempMsg)
Return ''
EndIf
; TempMsg = StrCat('Total processes for Session #',SessId,' is ',ProcessArr[0],'.')
; Message('ListTSProcesses()',TempMsg)
ProcList = ''
ValueDelim = ''
FieldDelim = StrCat(@TAB,@TAB)
For i = 1 To ProcessArr[0]
If (i > 1) Then ValueDelim = @CRLF
ProcList = StrCat(ProcList,ValueDelim,ItemExtract(i,ProcessArr[1],@TAB),FieldDelim,'"',ItemExtract(i,ProcessArr[2],@TAB),'"')
Next
Return ProcList
#EndFunction
#DefineFunction GetTSSessInfo(ServerSpec,SessId)
ErrorMode(@OFF)
SessInfoArr = wtsQuerySessionInfo(ServerSpec,SessId)
RC = LastError()
ErrorMode(@CANCEL)
If (RC != 0)
TempMsg = StrCat('wntQuerySessionInfo("',ServerSpec,'",',SessId,') RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Error! Unable to obtain session information.')
Message('GetTSSessInfo()',TempMsg)
Return ''
EndIf
SessInfo = StrCat( 'Session Name = ',SessInfoArr[0])
SessInfo = StrCat(SessInfo,@CRLF,'Connection State = ',SessInfoArr[1])
SessInfo = StrCat(SessInfo,@CRLF,'Client Address = ',SessInfoArr[2])
SessInfo = StrCat(SessInfo,@CRLF,'Client Name = ',SessInfoArr[3])
SessInfo = StrCat(SessInfo,@CRLF,'Client Protocol = ',SessInfoArr[4])
SessInfo = StrCat(SessInfo,@CRLF,'Client Hardware Id = ',SessInfoArr[5])
SessInfo = StrCat(SessInfo,@CRLF,'Client Product Id = ',SessInfoArr[6])
SessInfo = StrCat(SessInfo,@CRLF,'Client Build # = ',SessInfoArr[7])
SessInfo = StrCat(SessInfo,@CRLF,'Client Directory = ',SessInfoArr[8])
SessInfo = StrCat(SessInfo,@CRLF,'Client horizontal resolution = ',SessInfoArr[9])
SessInfo = StrCat(SessInfo,@CRLF,'Client vertical resolution = ',SessInfoArr[10])
SessInfo = StrCat(SessInfo,@CRLF,'Client color depth = ',SessInfoArr[11])
SessInfo = StrCat(SessInfo,@CRLF,'OEM Id string = ',SessInfoArr[12])
SessInfo = StrCat(SessInfo,@CRLF,'Domain name = ',SessInfoArr[13])
SessInfo = StrCat(SessInfo,@CRLF,'Username = ',SessInfoArr[14])
SessInfo = StrCat(SessInfo,@CRLF,'Application name = ',SessInfoArr[15])
SessInfo = StrCat(SessInfo,@CRLF,'Initial program = ',SessInfoArr[16])
SessInfo = StrCat(SessInfo,@CRLF,'Working directory = ',SessInfoArr[17])
SessInfo = StrCat(SessInfo,@CRLF,'Current Time [GMT] = ',SessInfoArr[18])
SessInfo = StrCat(SessInfo,@CRLF,'Login Time [GMT] = ',SessInfoArr[19])
SessInfo = StrCat(SessInfo,@CRLF,'Last Input Time [GMT] = ',SessInfoArr[20])
SessInfo = StrCat(SessInfo,@CRLF,'Connect Time [GMT] = ',SessInfoArr[21])
SessInfo = StrCat(SessInfo,@CRLF,'Disconnect Time [GMT] = ',SessInfoArr[22])
Return SessInfo
#EndFunction
#DefineFunction GetTSConnSessId(ServerSpec)
TempServer1 = StrUpper(StrReplace(ServerSpec,'\',''))
TempServer2 = StrUpper(Environment('COMPUTERNAME'))
If ((TempServer1 == TempServer2) || (TempServer1 == ''))
ErrorMode(@OFF)
SessId = wtsGetActiveConsoleSessId()
RC = LastError()
ErrorMode(@CANCEL)
If (RC != 0)
TempMsg = StrCat('wntGetActiveConsoleSessId() RC = ',RC)
TempMsg = StrCat(TempMsg,@CRLF,@CRLF,'Error! Unable to obtain active console session id #.')
Message('GetTSConnSessId()',TempMsg)
Return ''
EndIf
Else
SessId = ''
EndIf
Return SessId
#EndFunction
; Display the main dialog. We will stay inside the dialog until the 'Close' button has
; been clicked, at which time this function will return and then we'll simply exit from
; the script.
ButtonPushed=Dialog("TSExpMainDlg")
:Done
Exit
:CANCEL
IntControl(72,2,0,0,0)
Return