Hola Ariel
Adjunto un ejemplo, espero que te sea de utilidad.
Saludos
José Paez
*- Determina si esta en una sesion de Terminal ServerLocal lnSessionId,
lcClientName, lcClientIpAddressLocal llErrorPublic gcTerminal
llError = .F.On Error llError = .T.
gcTerminal = Upper( Sys( 0 ) )= GetClientInfo( @lnSessionId, @lcClientName,
@lcClientIpAddress )If Not llError And lnSessionId > 0 Then gcTerminal = Upper(
Alltrim( Str( lnSessionId ) ) + " - " + lcClientName )Endif
Messagebox( gcTerminal )
Function GetClientInfo(SessionId, ClientName, ClientIpAddress )
******************************************************************
*----------------------------------------------- * Nombre del cliente en
una red de Terminal * sessionID será cero si se corre la aplicación de
forma “normal” * y será distinta de cero si es un terminal del Terminal
Server * * local SessionId, ClientName, ClientIpAddress *
* ? GetClientInfo(@SessionId, @ClientName, @ClientIpAddress ) *
? 'SessionId: ', SessionId * ? 'ClientName: ', ClientName *
? 'ClientIpAddress: ', 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, iClientAddress = Repl( Chr(0), 4 + 20)nBytes
= 0ppBuffer = 0
&& ClientIpAddresssts = WTSQuerySessionInformation( ;
WTS_CURRENT_SERVER_HANDLE, ; WTS_CURRENT_SESSION, ; WTSClientAddress, ;
@ppBuffer, ; @nBytes ; )
ClientIpAddress = ""
Do Case Case Not 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), "", ".") + Alltrim(Str(Asc(Substr(ClientAddress, i,
1)))) Endfor EndcaseEndcase
&& SessionIdsts = WTSQuerySessionInformation( ; WTS_CURRENT_SERVER_HANDLE, ;
WTS_CURRENT_SESSION, ; WTSSessionId, ; @ppBuffer, ; @nBytes ;
)SessionId = 0
Do Case Case Not Empty(sts) Declare RtlMoveMemory In win32api Long
@Dest, Long Src, Long BytesToCopy = RtlMoveMemory( @SessionId,
ppBuffer, 4) = WTSFreeMemory( ppBuffer )Endcase
&& ClientNamests = WTSQuerySessionInformation( ;
WTS_CURRENT_SERVER_HANDLE, ; WTS_CURRENT_SESSION, ; WTSClientName, ;
@ppBuffer, ; @nBytes ; )ClientName = Repl(Chr(0), 255)
Do Case Case Not 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 = ""EndcaseEndfunc
******************************************************************Function
GetClientInfo(SessionId, ClientName, ClientIpAddress )
****************************************************************** *--
Devuelve el nombre del cliente en terminal services
******************************************************************
#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 addressLocal ClientAddress, nBytes,
sts, iClientAddress = Repl( Chr(0), 4 + 20)nBytes = 0ppBuffer
= 0
&& ClientIpAddresssts = WTSQuerySessionInformation( ;
WTS_CURRENT_SERVER_HANDLE, ; WTS_CURRENT_SESSION, ; WTSClientAddress, ;
@ppBuffer, ; @nBytes ; )
ClientIpAddress = ""Do Case Case Not 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 EndcaseEndcase
&& SessionIdsts = WTSQuerySessionInformation( ; WTS_CURRENT_SERVER_HANDLE, ;
WTS_CURRENT_SESSION, ; WTSSessionId, ; @ppBuffer, ; @nBytes ; )
SessionId = 0
Do Case Case Not Empty(sts) Declare RtlMoveMemory In win32api Long
@Dest, Long Src, Long BytesToCopy = RtlMoveMemory( @SessionId,
ppBuffer, 4) = WTSFreeMemory( ppBuffer )Endcase
&& ClientNamests = WTSQuerySessionInformation( ;
WTS_CURRENT_SERVER_HANDLE, ; WTS_CURRENT_SESSION, ; WTSClientName, ;
@ppBuffer, ; @nBytes ; )
ClientName = Repl(Chr(0), 255)
Do Case Case Not 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 = ""EndcaseEndfunc
******************************************************************Function
isTerminal() ******************************************************************
* This function will determine if the machine is a Terminal Server. *
It will return .T. if it is and .F. if not.
****************************************************************** Local
cTerminal Local nSessionId, cClientName, ClientIpAddress
cTerminal = Alltrim(Left(Sys(0), At("#", Sys(0)) - 1)) =
GetClientInfo(@nSessionId, @cClientName, @ClientIpAddress )
cClientName = Iif(Type("cClientName ") = "C",
Alltrim(Upper(Transform(cClientName))), "") If cClientName <> cTerminal
And Not Empty(cClientName) cTerminal = cClientName Return .T.
Else Return .F. EndifEndfunc
From: [email protected]
To: [email protected]
Subject: [GUFA] nombre de sesion en terminal services
Date: Tue, 22 Sep 2015 01:02:07 -0300
Hola a todos .:
Alguno sabe como puedo determinar el nombre de usuario o sesión en terminal
services. Osea, tengo varias máquinas conectadas mediante terminal sevices
a un windows server 2012, por ejemplo,
y necesito determinar que operación hizo cada usuario. Yo utilizo VFP 6.0
con SP5.
Hay alguna función que me ayude a determinar esto ?
Saludos
Ariel Sznaiderberg
Onix