Как получить IP-адрес клиента удаленного рабочего стола? - PullRequest
5 голосов
/ 02 октября 2009

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

Ответы [ 3 ]

5 голосов
/ 02 октября 2009

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

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

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

  • используя WMI-скрипт, вы можете попасть в Event Log, источник: Security, найти категорию Logon / Logoff, где username = переменная окружения
1 голос
/ 08 октября 2009

Если вы хотите использовать «чистый» 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
1 голос
/ 05 октября 2009

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

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