2009-10-02 11 views
5

Sto provando a scrivere uno script per registrare l'indirizzo IP del client Windows da cui l'utente ha avviato Desktop remoto per accedere a Windows Server. Come acquisire l'indirizzo IP del client nel server?Come ottenere l'indirizzo IP del client desktop remoto?

+1

Che dire di più client è venuto dallo stesso server proxy? – Dewfy

+0

Supponiamo che non ci sia un proxy ;-) – BlueGene

+0

Fuori dalla curiosità, come stai eseguendo il tuo script? – chaz

risposta

5

Quindi, si ignorano proxy ...

  • usando l'ambiente var: CLIENTNAME nel dominio è possibile risolvere di nuovo al IP

senza controller di dominio:

  • utilizzando WMI script è possibile accedere al registro eventi, fonte: sicurezza, cercare la categoria Accesso/disconnessione dove nome utente = variabile di ambiente USERNAME
1

Se si utilizza PowerShell o un linguaggio .NET, la versione trunk di Cassia library supporta questo: è sufficiente acquisire l'ultima build dal build server (accedere come ospite e utilizzare il collegamento artefatti). Per stampare gli indirizzi remoti di tutte le sessioni sul server locale, è possibile utilizzare qualcosa di simile al seguente:

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

Se si desidera utilizzare "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

Viene visualizzato un errore "UnrecognizedToken" quando eseguo questa operazione in PowerShell – Jeremy

+0

Sei sicuro di aver utilizzato il codice completo, dal momento che alcune righe sembrano cadere fuori dal blocco di codice? – Remko

Problemi correlati