Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Nombre de máquina o IP cliente en Terminal Server? (https://www.clubdelphi.com/foros/showthread.php?t=83227)

cmagno 23-05-2013 16:28:11

Nombre de máquina o IP cliente en Terminal Server?
 
Hola a todos. Estuve buscando en el foro y vi varios hilos con título similar, pero en ninguno encontré una respuesta. Mi caso es el siguiente: tengo una aplicación hecha en Delphi7 + Oracle 10g. La aplicación corre en un servidor Terminal Server y es usada por aproximadamente 1000 usuarios en diversas ciudades. Por disposiciones legales, nos exigen generar un informe diario de ventas que debe incluir la máquina cliente desde la que se solicita el reporte y el servidor donde se procesa. El problema es que al estar sobre terminal server, para la aplicación el cliente y el servidor son el mismo. Cómo puedo hacer para que mi aplicación desde Terminal Server conozca el nombre de la máquina o la IP del equipo cliente que se conecta?.

Gracias de antemano por al colaboración.

newtron 23-05-2013 17:23:14

Hola.

Si lo que quieres averiguar es el nombre del equipo echa un vistazo a esto

El tema de la ip es peliagudo porque la ip local se puede repetir en cientos de ordenadores y la ip de internet normalmente será dinámica así que de poco te servirá, de todas formas si te interesara puedes hacer una búsqueda en los foros y podrás averiguar cualquiera de las dos.

Saludos

juanelo 23-05-2013 17:28:15

Te dejo el codigo en C++ como lo tengo implementado.

Código Delphi [-]
DWORD IDSes=0;
// Se debe de incluir Wtsapi32.h 
//Wtsapi32.dll

  LPTSTR pData = NULL;
  DWORD cbReturned = 0;
  char Cliente[150],IP[20];
  AnsiString Nombre=""; 
    ProcessIdToSessionId(GetCurrentProcessId(),&IDSes);
    if( WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, IDSes, WTSClientName , &pData, &cbReturned) )//Obtenemos el nombre de pc
    {
      memset(Cliente,'\x0',150);
      strcpy(Cliente,pData);     
    }
   if(WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, IDSes, WTSSessionAdressV4 , &pData, &cbReturned) )//Obtenemos la IP de la sesion
    {
      memset(IP,'\x0',20);
      strcpy(IP,pData);      
    }
    WTSFreeMemory(pData);

Te comento depenendiendo de la version de Wtsapi32.dll que tengas y de la version de compilador, las opciones de "llamado" a esta funcion puede variar.
Te dejo esta liga para que puedas checar toda la informacion. Espero te sirva.

NOTA IMPORTANTE: El valor de WTSSessionAdressV4 solo es soportado a partir de Win7 y de Win 2008 server R2

cmagno 23-05-2013 22:54:04

Hola, gracias por las respuestas.

Newtron... con GetComputerName obtengo el nombre de la máquina donde está alojada la aplicación, es decir el mismo servidor Terminal y lo que requiero es tanto el cliente (el que se conectar al Terminal) como el servidor Terminal.

Juanelo, voy a darle un vistazo al código para ver si puede serme útil.

Si es posible hacerlo directamente con Delphi sería genial. Gracias.

juanelo 24-05-2013 01:02:07

Cita:

Empezado por cmagno (Mensaje 461134)
Si es posible hacerlo directamente con Delphi sería genial. Gracias.

Claro que es posible hacerlo en Delphi, son simples llamadas al API de windows.
Te puedo garantizar que al menos en C++ funciona perfecto.
Saludos

olbeup 24-05-2013 09:46:37

Cita:

Empezado por cmagno (Mensaje 461087)
Hola a todos. Estuve buscando en el foro y vi varios hilos con título similar, pero en ninguno encontré una respuesta. Mi caso es el siguiente: tengo una aplicación hecha en Delphi7 + Oracle 10g. La aplicación corre en un servidor Terminal Server y es usada por aproximadamente 1000 usuarios en diversas ciudades. Por disposiciones legales, nos exigen generar un informe diario de ventas que debe incluir la máquina cliente desde la que se solicita el reporte y el servidor donde se procesa. El problema es que al estar sobre terminal server, para la aplicación el cliente y el servidor son el mismo. Cómo puedo hacer para que mi aplicación desde Terminal Server conozca el nombre de la máquina o la IP del equipo cliente que se conecta?.

Gracias de antemano por al colaboración.

Hola cmagno,

Mira haber esta:

Código Delphi [-]
function GetIDComputerName: String;

  function GetEnvVarValue(const VarName: String): String;
  var
    BufSize: Integer;
  begin
    BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
    if (BufSize > 0) then
    begin
      SetLength(Result, BufSize -1);
      GetEnvironmentVariable(PChar(VarName), PChar(Result), BufSize);
    end
    else
      Result := '';
  end;

begin
  // Esto es para Terminal Server
    //   Primero recoger en LOCAL (CLIENTNAME) si devuelve '' nada esto significa que el
    // CLIENTNAME no existe en TERMINAL SERVER eso quiere decir que estamos en
    // LOCAL y la variable suya es COMPUTERNAME
  Result := GetEnvVarValue('CLIENTNAME');
  if (Length(Result) = 0) then
    Result := GetEnvVarValue('COMPUTERNAME');
end;

Un saludo

cmagno 28-05-2013 19:14:24

Perfecto!. Muchas gracias!


La franja horaria es GMT +2. Ahora son las 06:22:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi