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                                      

Responder a