clear
?getuserlocalinfo()
function getuserlocalinfo
local sessionid, clientname, clientipaddress
if getclientinfo(@sessionid, @clientname, @clientipaddress ) =.t.
isessionid=sessionid
cclientname=clientname
endif
return 'Client name '+cclientname+' in session '+alltrim(str(isessionid))+' got ipAdrdress: '+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