2009-10-02 3 views
5

Próbuję napisać skrypt, aby zarejestrować adres IP klienta Windows, z którego użytkownik zainicjował zdalny pulpit, aby zalogować się do systemu Windows Server. Jak przechwycić adres IP klienta na serwerze?Jak uzyskać adres IP klienta pulpitu zdalnego?

+1

co wielu klientów przyszedł z tego samego serwera proxy? – Dewfy

+0

Załóżmy, że nie ma proxy ;-) – BlueGene

+0

Ciekawość, w jaki sposób wykonujecie skrypt? – chaz

Odpowiedz

5

Więc ignorować proxy ...

  • użyciu środowiska var: clientname w domenie można rozwiązać go z powrotem do OD

bez kontrolera domeny:

  • używając WMI skrypt, który można uzyskać w Dzienniku zdarzeń, źródło: Zabezpieczenia, poszukaj kategorii Loguj/Wyloguj, gdzie nazwa użytkownika = zmienna środowiskowa USERNAME
1

Jeśli używasz PowerShell lub języka .NET, wersja trunk z Cassia library obsługuje to - po prostu pobierz najnowszą kompilację z build server (zaloguj się jako gość i użyj linku artefaktów). Aby wydrukować zdalne adresy wszystkich sesji na serwerze lokalnym, można użyć coś jak następuje:

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

Jeśli chcesz korzystać z „czystym” 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

Otrzymuję błąd "UnrecognizedToken", gdy wykonuję to w Powershell – Jeremy

+0

Czy jesteś pewien, że użyłeś całego kodu, ponieważ kilka linii wydaje się wypaść z bloku kodu? – Remko