2009-10-02 4 views
5

Я пытаюсь написать сценарий для регистрации IP-адреса клиента Windows, с которого пользователь инициировал удаленный рабочий стол для входа в Windows Server. Как захватить IP-адрес клиента на сервере?Как получить IP-адрес клиента удаленного рабочего стола?

+1

насчет нескольких клиентов пришли с того же прокси-сервера? – Dewfy

+0

Давайте просто предположим, что нет прокси ;-) – BlueGene

+0

Из любопытства, как вы выполняете свой скрипт? – chaz

ответ

5

Итак, вы игнорируете прокси ...

  • с использованием среды вар: CLIENTNAME в домене вы можете разрешить его обратно в IP

без контроллера домена:

  • с помощью WMI сценарий, который вы можете получить в журнале событий, источник: безопасность, поиск категории Вход/Выход, где username = переменная среды USERNAME
1

Если вы используете PowerShell или язык .NET, эта версия поддерживает Cassia library - просто возьмите последнюю сборку из build server (войдите как гость и используйте ссылку артефактов). Для того, чтобы напечатать удаленные адреса всех сессий на локальном сервере, вы можете использовать что-то вроде следующего:

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

Если вы хотите использовать «чистый» 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

Я получаю сообщение об ошибке «UnrecognizedToken», когда я выполняю это в Powershell – Jeremy

+0

Вы уверены, что используете полный код, поскольку несколько строк, похоже, выпадают из блока кода? – Remko

Смежные вопросы