2009-10-02 29 views
5

Estoy intentando escribir una secuencia de comandos para registrar la dirección IP del cliente de Windows desde el que el usuario inició Escritorio remoto para iniciar sesión en el servidor de Windows. Cómo capturar la dirección IP del cliente en el servidor?¿Cómo obtener la dirección IP del cliente de escritorio remoto?

+1

¿Qué hay de varios clientes vino desde el mismo servidor proxy? – Dewfy

+0

Supongamos que no hay proxy ;-) – BlueGene

+0

Fuera de curiosidad, ¿cómo estás ejecutando tu script? – chaz

Respuesta

5

Por lo tanto, se ignoran proxy ...

  • usando el ambiente var: CLIENTNAME de dominio que puede resolver de nuevo a IP

sin controlador de dominio:

  • mediante WMI Puede acceder al registro de eventos, fuente: Seguridad, buscar categoría Inicio de sesión/Cerrar sesión donde nombre de usuario = variable de entorno NOMBRE DE USUARIO
1

Si está utilizando PowerShell o un idioma .NET, la versión troncal de Cassia library es compatible con esto: solo obtenga la última compilación del build server (inicie sesión como invitado y use el enlace artefactos). Para imprimir las direcciones remotas de todas las sesiones en el servidor local, se usa algo como lo siguiente:

ITerminalServicesManager manager = new TerminalServicesManager(); 
foreach (ITerminalServicesSession session in manager.GetLocalServer().GetSessions()) 
{ 
    IPEndPoint ipEndPoint = session.RemoteEndPoint as IPEndPoint; 
    if (ipEndPoint != null) 
    { 
     Console.WriteLine(ipEndPoint.Address); 
    } 
} 
1

Si desea utilizar "puro" Powershell 2.0:

$Wtsapi32 = @' 
using System; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace Wtsapi32 { 

    public enum WTS_INFO_CLASS 
    { 
     WTSInitialProgram, 
     WTSApplicationName, 
     WTSWorkingDirectory, 
     WTSOEMId, 
     WTSSessionId, 
     WTSUserName, 
     WTSWinStationName, 
     WTSDomainName, 
     WTSConnectState, 
     WTSClientBuildNumber, 
     WTSClientName, 
     WTSClientDirectory, 
     WTSClientProductId, 
     WTSClientHardwareId, 
     WTSClientAddress, 
     WTSClientDisplay, 
     WTSClientProtocolType 
    }; 

    [StructLayout(LayoutKind.Sequential)] 
    public struct WTS_CLIENT_ADDRESS 
    { 
     public uint AddressFamily; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
     public byte[] Address; 
    } 

    public class PS { 

     public const IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero; 
     public const int WTS_CURRENT_SESSION = -1; 

     [DllImport("wtsapi32.dll", EntryPoint="WTSQuerySessionInformation")] 
     public static extern bool WTSQuerySessionInformation(
      System.IntPtr hServer, 
      int sessionId, 
      WTS_INFO_CLASS wtsInfoClass, 
      out System.IntPtr ppBuffer, 
      out uint pBytesReturned); 

     [DllImport("wtsapi32.dll", EntryPoint="WTSFreeMemory")] 
     public static extern void WTSFreeMemory(
      IntPtr memory);   
    } 
} 
'@ 

Add-Type -TypeDefinition $Wtsapi32 
+0

Aparece un error de "UnrecognizedToken" cuando ejecuto esto en Powershell – Jeremy

+0

¿Estás seguro de que usaste el código completo, ya que unas pocas líneas parecen salirse del bloque de código? – Remko

Cuestiones relacionadas