Nombre del cliente en una red de
Terminal
Por Gregory Adam
*--------------------------------------------------------------------------
function do_it()
local SessionId, ClientName, ClientIpAddress
?GetClientInfo(@SessionId, @ClientName, @ClientIpAddress )?'SessionId: ', SessionId
?'ClientName: ', ClientName
?'ClientIpAddress: ', ClientIpAddress
endfunc
*--------------------------------------------------------------------------
function GetClientInfo(SessionId, ClientName, ClientIpAddress )
#define WTS_CURRENT_SERVER_HANDLE (0)
#define WTS_CURRENT_SESSION (-1)
#define WTSSessionId (4)
#define WTSClientName (10)
#define WTSClientAddress (14)
#ifndef AF_INET
#define AF_INET 2
#endif
declare integer WTSQuerySessionInformation in Wtsapi32.dll ;
integer hServer, ;
integer SessionId, ;
Integer WTSInfoClass, ;
long @ ppBuffer, ;
integer @pBytesReturned
declare WTSFreeMemory in Wtsapi32.dll long address
local ClientAddress, nBytes, sts, i
ClientAddress = repl( chr(0), 4 + 20)
nBytes = 0
ppBuffer = 0
&& ClientIpAddress
sts = WTSQuerySessionInformation( ; WTS_CURRENT_SERVER_HANDLE, ; WTS_CURRENT_SESSION, ; WTSClientAddress, ; @ppBuffer, ; @nBytes ; ) ClientIpAddress = ''
do case
case !empty(sts)
declare RtlMoveMemory in win32api string @Dest, long Src, long BytesToCopy
=RtlMoveMemory( @ClientAddress, ppBuffer, nBytes) =WTSFreeMemory( ppBuffer ) do case
case left(ClientAddress,1) == chr(AF_INET)
for i = 7 to 7+ 3
ClientIpAddress = ClientIpAddress + iif(empty(ClientIpAddress), '', '.') + transform(asc(substr(ClientAddress, i, 1)))
endfor
endcase
endcase
&& SessionId
sts = WTSQuerySessionInformation( ; WTS_CURRENT_SERVER_HANDLE, ; WTS_CURRENT_SESSION, ; WTSSessionId, ; @ppBuffer, ; @nBytes ; )SessionId = 0
do case
case !empty(sts)
declare RtlMoveMemory in win32api long @Dest, long Src, long BytesToCopy
=RtlMoveMemory( @SessionId , ppBuffer, 4)
=WTSFreeMemory( ppBuffer )endcase
&& ClientName
sts = WTSQuerySessionInformation( ; WTS_CURRENT_SERVER_HANDLE, ; WTS_CURRENT_SESSION, ; WTSClientName, ; @ppBuffer, ; @nBytes ; )ClientName = repl(chr(0), 255)
do case
case !empty(sts)
declare RtlMoveMemory in win32api string @Dest, long Src, long BytesToCopy
=RtlMoveMemory( @ClientName, ppBuffer, len(ClientName))
=WTSFreeMemory( ppBuffer )ClientName = left(ClientName, at(chr(0), ClientName)-1)
otherwise
ClientName = ''
endcase
endfunc
*--------------------------------------------------------------------------
sessionID
será cero si se corre la aplicación de forma “normal” y será distinta de cero
si es un terminal del Terminal Server
FoxPress – Septiembre de
2005