Announcement

Collapse
No announcement yet.

Client IP-Adresse während einer Terminal Server Sitzung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Client IP-Adresse während einer Terminal Server Sitzung

    Hallo,
    ich suche eine Lösung um die IP-Adresse des Clients während einer TS Sitzung zu ermitteln.
    Ich bin hierbei auf den MDSN Seiten von Microsoft fündig geworden leider nur in C++ !

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wts_client_address_str.asp

    Wie kann ich das in Delphi 6 umsetzen?

    typedef struct _WTS_CLIENT_ADDRESS { DWORD AddressFamily;
    BYTE Address[20];} WTS_CLIENT_ADDRESS, *PWTS_CLIENT_ADDRESS;


  • #2
    mit der CBuilder Komponente ServerSocket ganz einfach:
    ServerSocket->Socket->Connections[n]->RemoteAddress;
    Dieselbe Komponente gibts doch sicher auch in Delphi,
    die -> müssen durch . ersetzt werden.
    n ist die Nummer der Client->Verbindung,
    am besten die Hilfe dazu noch mal lesen

    Comment


    • #3
      Benötige auch die Client ID.

      Wie kann ich in VB .Net die realisieren?!?!?!?
      http://www.mschnuerer.de

      Comment


      • #4
        Hallo Peter,<br>
        auf dieser Seite <a href=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wtsquerysessioninformation.asp>WTSQuerySessionInfo rmation</a>
        und <a href=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wts_client_address_str.asp>WTS_CLIENT_ADDRESS</a> ist doch alles, was du brauchst.<br>
        Hier ist die Lösung in Delphi, dieser Beispiel ermitteln, ob es sich um eine locale oder remote (TS) Session handelt und ziegt die IP. <br>

        <h2>1. Teil:</h2>
        <style>
        <!--
        /* Font Definitions */
        @font-face
        {font-family:Courier;
        panose-1:0 0 0 0 0 0 0 0 0 0;
        mso-font-charset:0;
        mso-generic-font-family:modern;
        mso-font-formatther;
        mso-font-pitch:fixed;
        mso-font-signature:3 0 0 0 1 0;}
        /* Style Definitions */
        p.MsoNormal, li.MsoNormal, div.MsoNormal
        {mso-style-parent:"";
        margin:0cm;
        margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:12.0pt;
        font-family:"Times New Roman";
        mso-fareast-font-family:"Times New Roman";}
        p.MsoBodyText, li.MsoBodyText, div.MsoBodyText
        {margin:0cm;
        margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:9.0pt;
        mso-bidi-font-size:12.0pt;
        font-family:Courier;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman";
        ;}
        @page Section1
        {size:595.3pt 841.9pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;
        mso-header-margin:35.4pt;
        mso-footer-margin:35.4pt;
        mso-paper-source:0;}
        div.Section1
        {page:Section1;}
        -->
        </style>

        <div class=Section1>

        <p class=MsoNormal><b><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'>const<o></o></span></b></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">*</span>MAX_ADAPTER_NAME_LENGTH = 260;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">*</span>MAX_ADAPTER_ADDRESS_LENGTH = 8;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">*</span></span><span lang=FR style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;mso-ansi-language:FR'>MAX_ADAPTER_DESCRIPTION_LENGTH
        = 132;<o></o></span></p>

        <p class=MsoNormal><span lang=FR style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;mso-ansi-language:FR'><![if !supportEmptyParas]>&nbsp;<![endif]><o></o></span></p>

        <p class=MsoNormal><b><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'>type</span></b><span
        style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Courier;
        '><span style="mso-spacerun: yes">*
        </span>PIP_ADDR_STRING = ^TIP_ADDR_STRING;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">***** </span>TIP_ADDR_STRING = record<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">*********** </span>Next ointer;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">*********** </span>IpAddress:array[0..15] of char;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">*</span><span style="mso-spacerun: yes">**********
        </span>IpMask:array[0..15] of char;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">*********** </span>ContextWORD;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">****** </span>end;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><![if !supportEmptyParas]>&nbsp;<![endif]><o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">**** </span></span><span lang=FR style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;mso-ansi-language:FR'>PIP_ADAPTER_INFO =
        ^TIP_ADAPTER_INFO;<o></o></span></p>

        <p class=MsoNormal><span lang=FR style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;mso-ansi-language:FR'><span style="mso-spacerun:
        yes">**** </span></span><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'>TIP_ADAPTER_INFO = record<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>Next: pointer;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>ComboIndex : DWORD;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH - 1] of char;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH - 1]
        of char;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>AddressLength: UINT;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>Address: array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of byte;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>Index: DWORD;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>AdapterType: UINT;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>DhcpEnabled: UINT;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>CurrentIpAddress: PIP_ADDR_STRING;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>IpAddressList: TIP_ADDR_STRING;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>GatewayList: TIP_ADDR_STRING;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>DhcpServer: TIP_ADDR_STRING;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>HaveWins: BOOL;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>PrimaryWinsServer: TIP_ADDR_STRING;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>SecondaryWinsServer: TIP_ADDR_STRING;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>LeaseObtained : integer;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">******* </span>LeaseExpires: integer;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><span style="mso-spacerun:
        yes">***** </span>end;<o></o></span></p>

        <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
        12.0pt;font-family:Courier;'><![if !supportEmptyParas]>&nbsp;<![endif]><o></o></span></p>
        &#10

        Comment


        • #5
          Hallo Peter,<br>
          auf dieser Seite <a href=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wtsquerysessioninformation.asp>WTSQuerySessionInfo rmation</a>
          und <a href=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wts_client_address_str.asp>WTS_CLIENT_ADDRESS</a> ist doch alles, was du brauchst.<br>
          Hier ist die Lösung in Delphi, dieser Beispiel ermitteln, ob es sich um eine locale oder remote (TS) Session handelt und ziegt die IP. <br>
          <style>
          <!--
          /* Font Definitions */
          @font-face
          {font-family:Courier;
          panose-1:0 0 0 0 0 0 0 0 0 0;
          mso-font-charset:0;
          mso-generic-font-family:modern;
          mso-font-formatther;
          mso-font-pitch:fixed;
          mso-font-signature:3 0 0 0 1 0;}
          /* Style Definitions */
          p.MsoNormal, li.MsoNormal, div.MsoNormal
          {mso-style-parent:"";
          margin:0cm;
          margin-bottom:.0001pt;
          mso-pagination:widow-orphan;
          font-size:12.0pt;
          font-family:"Times New Roman";
          mso-fareast-font-family:"Times New Roman";}
          p.MsoBodyText, li.MsoBodyText, div.MsoBodyText
          {margin:0cm;
          margin-bottom:.0001pt;
          mso-pagination:widow-orphan;
          font-size:9.0pt;
          mso-bidi-font-size:12.0pt;
          ;
          mso-fareast-font-family:"Times New Roman";
          mso-bidi-font-family:"Times New Roman";
          ;}
          @page Section1
          {size:595.3pt 841.9pt;
          margin:70.85pt 70.85pt 2.0cm 70.85pt;
          mso-header-margin:35.4pt;
          mso-footer-margin:35.4pt;
          mso-paper-source:0;}
          div.Section1
          {page:Section1;}
          -->
          </style>
          <div class=Section1 style="font-family:Courier">
          <p class=MsoNormal><b><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'>const<o></o></span></b></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">*</span>MAX_ADAPTER_NAME_LENGTH = 260;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">*</span>MAX_ADAPTER_ADDRESS_LENGTH = 8;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">*</span></span><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;mso-ansi-language:FR'>MAX_ADAPTER_DESCRIPTION_LENGTH
          = 132;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;mso-ansi-language:FR'><![if !supportEmptyParas]>&nbsp;<![endif]><o></o></span></p>
          <p class=MsoNormal><b><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'>type</span></b><span
          style='font-size:9.0pt;mso-bidi-font-size:12.0pt;;
          '><span style="mso-spacerun: yes">*
          </span>PIP_ADDR_STRING = ^TIP_ADDR_STRING;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">***** </span>TIP_ADDR_STRING = record<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">*********** </span>Next ointer;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">*********** </span>IpAddress:array[0..15] of char;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">*</span><span style="mso-spacerun: yes">**********
          </span>IpMask:array[0..15] of char;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">*********** </span>ContextWORD;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">****** </span>end;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><![if !supportEmptyParas]>&nbsp;<![endif]><o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">**** </span></span><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;mso-ansi-language:FR'>PIP_ADAPTER_INFO =
          ^TIP_ADAPTER_INFO;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;mso-ansi-language:FR'><span style="mso-spacerun:
          yes">**** </span></span><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'>TIP_ADAPTER_INFO = record<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>Next: pointer;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>ComboIndex : DWORD;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH - 1] of char;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH - 1]
          of char;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>AddressLength: UINT;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>Address: array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of byte;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>Index: DWORD;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>AdapterType: UINT;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>DhcpEnabled: UINT;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>CurrentIpAddress: PIP_ADDR_STRING;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>IpAddressList: TIP_ADDR_STRING;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>GatewayList: TIP_ADDR_STRING;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>DhcpServer: TIP_ADDR_STRING;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>HaveWins: BOOL;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>PrimaryWinsServer: TIP_ADDR_STRING;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>SecondaryWinsServer: TIP_ADDR_STRING;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>LeaseObtained : integer;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">******* </span>LeaseExpires: integer;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><span style="mso-spacerun:
          yes">***** </span>end;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:9.0pt;mso-bidi-font-size:
          12.0pt;;'><![if !supportEmptyParas]>&nbsp;<![endif]><o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;'>function <span
          style='color:navy'>ProcessIdToSessionId</span>(dwProcessIdWORD;var
          pSessionIdWORD):boolean; stdcall;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;'>function <span
          style='color:navy'>GetAdaptersInfo</span>(pAdapterInfo:PIP_ADAPTER_INFO; var
          pOutBufLen:integer)WORD; stdcall;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;'><![if !supportEmptyParas]>&nbsp;<![endif]><o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;color:silver;'>{$IFDEF
          UNICODE}<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;'>function <span
          style='color:navy'>WTSOpenServer</span>(pServerName: PWideChar): THandle;
          stdcall;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;color:silver;'>{$EXTERNALSYM
          WTSOpenServer}<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;color:silver;'>{$ELSE}<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;'>function <span
          style='color:navy'>WTSOpenServer</span>(pServerName: PAnsiChar): THandle;
          stdcall;<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:12.0pt;
          ;color:silver'>{$EXTERNALSYM WTSOpenServer}<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:12.0pt;
          ;color:silver'>{$ENDIF}<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;color:silver;'>{$IFDEF
          UNICODE}<o></o></span></p>
          <p class=MsoNormal><span style='font-size:8.0pt;mso-bidi-font-size:
          12.0pt;;'>function <span style='color:navy'>WTSQuerySessionInformat

          Comment


          • #6
            <p>Hallo Peter,<br>
            auf dieser Seite <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wtsquerysessioninformation.asp">WTSQuerySessionInf ormation</a>
            und <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wts_client_address_str.asp">WTSQuerySessionInforma tion</a>
            ist doch alles, was du brauchst.<br>
            Hier ist die Lösung in Delphi, dieser Beispiel ermittelt, ob es sich um eine locale oder remote (TS) Session handelt und ziegt die
            IP.&nbsp;<br>
            <font face="Courier" size="1"><b>const</b><br>
            &nbsp;&nbsp;&nbsp; MAX_ADAPTER_NAME_LENGTH = 260;<br>
            &nbsp;&nbsp;&nbsp; MAX_ADAPTER_ADDRESS_LENGTH = 8;<br>
            &nbsp;&nbsp;&nbsp; MAX_ADAPTER_DESCRIPTION_LENGTH = 132;<br>
            <br>
            <b>
            type </b>PIP_ADDR_STRING = ^TIP_ADDR_STRING;<br>
            &nbsp;&nbsp;&nbsp;&nbsp; TIP_ADDR_STRING = record<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            Next ointer;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            IpAddress:array[0..15] of char;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            IpMask:array[0..15] of char;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            ContextWORD;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            <br>
            &nbsp;&nbsp;&nbsp; PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;<br>
            &nbsp;&nbsp;&nbsp; TIP_ADAPTER_INFO = record<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next: pointer;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboIndex : DWORD;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH - 1] of char;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH - 1] of char;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLength: UINT;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Address: array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of byte;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index: DWORD;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdapterType: UINT;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DhcpEnabled: UINT;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CurrentIpAddress: PIP_ADDR_STRING;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IpAddressList: TIP_ADDR_STRING;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GatewayList: TIP_ADDR_STRING;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DhcpServer: TIP_ADDR_STRING;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HaveWins: BOOL;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrimaryWinsServer: TIP_ADDR_STRING;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SecondaryWinsServer: TIP_ADDR_STRING;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeaseObtained : integer;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeaseExpires: integer;<br>
            &nbsp;&nbsp;&nbsp; end;<br>
            <br>
            function ProcessIdToSessionId(dwProcessIdWORD;var pSessionIdWORD):boolean; stdcall;<br>
            function GetAdaptersInfo(pAdapterInfo:PIP_ADAPTER_INFO; var pOutBufLen:integer)WORD; stdcall;<br>
            <br>
            <font color="#C0C0C0">
            {$IFDEF UNICODE}<br>
            </font>
            function WTSOpenServer(pServerName: PWideChar): THandle; stdcall;<br>
            <font color="#C0C0C0">
            {$EXTERNALSYM WTSOpenServer}<br>
            {$ELSE}<br>
            </font>
            function WTSOpenServer(pServerName: PAnsiChar): THandle; stdcall;<br>
            <font color="#C0C0C0">
            {$EXTERNALSYM WTSOpenServer}<br>
            {$ENDIF}<br>
            {$IFDEF UNICODE}<br>
            </font>
            function WTSQuerySessionInformation(hServer: THandle; SessionId: DWORD;<br>
            WTSInfoClass: DWORD; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;<br>
            <font color="#C0C0C0">
            {$EXTERNALSYM WTSQuerySessionInformation}<br>
            {$ELSE}<br>
            </font>
            function WTSQuerySessionInformation(hServer: THandle; SessionId: DWORD;<br>
            WTSInfoClass: DWORD; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;<br>
            <font color="#C0C0C0">
            {$EXTERNALSYM WTSQuerySessionInformation}<br>
            {$ENDIF}<br>
            </font>
            implementation<br>
            <br>
            function ProcessIdToSessionId; external kernel32 name 'ProcessIdToSessionId';<br>
            function GetAdaptersInfo; external 'IPHlpApi.dll' name 'GetAdaptersInfo';<br>
            <font color="#C0C0C0">
            {$IFDEF UNICODE}<br>
            </font>
            function WTSOpenServer; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSOpenServerW';<br>
            <font color="#C0C0C0">
            {$ELSE}<br>
            </font>
            function WTSOpenServer; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSOpenServerA';<br>
            <font color="#C0C0C0">
            {$ENDIF}<br>
            {$IFDEF UNICODE}<br>
            </font>
            function WTSQuerySessionInformation; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSQuerySessionInformationW';<br>
            <font color="#C0C0C0">
            {$ELSE}<br>
            </font>
            function WTSQuerySessionInformation; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSQuerySessionInformationA';<br>
            <font color="#C0C0C0">
            {$ENDIF}<br>
            </font>
            <br>
            <br>
            <b>
            procedure ShowLocalIP;<br>
            </b>
            var&nbsp;&nbsp; p : pointer;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l,e : integer;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai: TIP_ADAPTER_INFO;<br>
            begin<br>
            &nbsp;&nbsp;&nbsp; l:= 0;<br>
            &nbsp;&nbsp;&nbsp; GetAdaptersInfo(nil,l);<br>
            &nbsp;&nbsp;&nbsp; GetMem(p,l + 1);<br>
            &nbsp;&nbsp;&nbsp; e:= GetAdaptersInfo(p,l);<br>
            &nbsp;&nbsp;&nbsp; if e = ERROR_SUCCESS then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; ai:= TIP_ADAPTER_INFO(p^);<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; repeat<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            ShowMessage(string(ai.AdapterName) + CHR(10) +<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;string(ai.Description) + CHR(10) +<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;string(ai.IPAddressList.IpAddres s));<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            if ai.Next &lt;> nil then ai:= TIP_ADAPTER_INFO(ai.Next^);<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; until ai.Next = nil;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
            &nbsp;&nbsp;&nbsp; FreeMem(p,l);<br>
            end; /<font color="#C0C0C0">/ end of procedure ShowLocalIP</font><br>
            <br>
            <b>
            type<br>
            </b>
            &nbsp;&nbsp;&nbsp; TIP = record<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressFamily: DWORD;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Address: array[0..19] of byte;<br>
            &nbsp;&nbsp;&nbsp; end;<br>
            &nbsp;&nbsp;&nbsp; TCName = array[0..MAX_COMPUTERNAME_LENGTH] of char;</font>

            <p><font face="Courier" size="1"><br>
            <b>
            <font color="#FF0000">
            procedure GetClientIP;<br>
            </font>
            </b>
            var<br>&nbsp;&nbsp;&nbsp; PID,SID : DWORD;<br>
            &nbsp;&nbsp;&nbsp; CName: TCName;<br>
            &nbsp;&nbsp;&nbsp; IP : string;<br>
            &nbsp;&nbsp;&nbsp; i : DWORD;<br>
            &nbsp;&nbsp;&nbsp; hSrv : THandle;<br>
            &nbsp;&nbsp;&nbsp; p: Pointer;<br>
            begin<br>
            &nbsp;&nbsp;&nbsp; <font color="#800000">PID:= GetCurrentProcessID</font>;<br>
            &nbsp;&nbsp;&nbsp; <font color="#800000">ProcessIdToSessionId(PID,SID)</font>;<br>
            &nbsp;&nbsp;&nbsp; i:= MAX_COMPUTERNAME_LENGTH + 1;<br>
            &nbsp;&nbsp;&nbsp; <font color="#800000">GetComputerName(CName,i)</font>;<br>
            &nbsp;&nbsp;&nbsp; if SID = 0 then <font color="#C0C0C0"> //local session</font><br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowLocalIP<br>
            &nbsp;&nbsp;&nbsp; else begin <font color="#C0C0C0">//remote session</font><br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; hSrv:=<font color="#800000"> WTSOpenServer(CName)</font>;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; if hSrv &lt;> 0 then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <font color="#C0C0C0">//IP of the client</font><br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;
            if <font color="#800000"> WTSQuerySessionInformation(hSrv,SID,14 </font><font color="#C0C0C0"> {WTSClientAddress}</font><font color="#800000">,p,i)</font> then<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            begin<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
            IP:= IntToStr(TIP(p^).Address[2]) + '.' +<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
            IntToStr(TIP(p^).Address[3]) + '.' +<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
            IntToStr(TIP(p^).Address[4]) + '.' +<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
            IntToStr(TIP(p^).Address[5]) + '.';<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &

            Comment


            • #7
              <p>Hallo Peter,<br>
              auf dieser Seite <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wtsquerysessioninformation.asp">WTSQuerySessionInf ormation</a>
              und <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wts_client_address_str.asp">WTSQuerySessionInforma tion</a>
              ist doch alles, was du brauchst.<br>
              Hier ist die Lösung in Delphi, dieser Beispiel ermittelt, ob es sich um eine locale oder remote (TS) Session handelt und ziegt die
              IP.&nbsp;<br>
              <font face="Courier" size="1"><b>const</b><br>
              &nbsp;&nbsp;&nbsp; MAX_ADAPTER_NAME_LENGTH = 260;<br>
              &nbsp;&nbsp;&nbsp; MAX_ADAPTER_ADDRESS_LENGTH = 8;<br>
              &nbsp;&nbsp;&nbsp; MAX_ADAPTER_DESCRIPTION_LENGTH = 132;<br>
              <br>
              <b>
              type </b>PIP_ADDR_STRING = ^TIP_ADDR_STRING;<br>
              &nbsp;&nbsp;&nbsp;&nbsp; TIP_ADDR_STRING = record<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              Next ointer;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              IpAddress:array[0..15] of char;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              IpMask:array[0..15] of char;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              ContextWORD;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
              &nbsp;&nbsp;&nbsp; PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;<br>
              &nbsp;&nbsp;&nbsp; TIP_ADAPTER_INFO = record<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next: pointer;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboIndex : DWORD;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH - 1] of char;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH - 1] of char;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLength: UINT;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Address: array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of byte;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index: DWORD;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdapterType: UINT;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DhcpEnabled: UINT;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CurrentIpAddress: PIP_ADDR_STRING;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IpAddressList: TIP_ADDR_STRING;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GatewayList: TIP_ADDR_STRING;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DhcpServer: TIP_ADDR_STRING;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HaveWins: BOOL;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrimaryWinsServer: TIP_ADDR_STRING;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SecondaryWinsServer: TIP_ADDR_STRING;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeaseObtained : integer;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeaseExpires: integer;<br>
              &nbsp;&nbsp;&nbsp; end;<br>
              <br>
              function ProcessIdToSessionId(dwProcessIdWORD;var pSessionIdWORD):boolean; stdcall;<br>
              function GetAdaptersInfo(pAdapterInfo:PIP_ADAPTER_INFO; var pOutBufLen:integer)WORD; stdcall;<br>
              <font color="#C0C0C0">
              {$IFDEF UNICODE}<br>
              </font>
              function WTSOpenServer(pServerName: PWideChar): THandle; stdcall;<br>
              <font color="#C0C0C0">
              {$EXTERNALSYM WTSOpenServer}<br>
              {$ELSE}<br>
              </font>
              function WTSOpenServer(pServerName: PAnsiChar): THandle; stdcall;<br>
              <font color="#C0C0C0">
              {$EXTERNALSYM WTSOpenServer}<br>
              {$ENDIF}<br>
              {$IFDEF UNICODE}<br>
              </font>
              function WTSQuerySessionInformation(hServer: THandle; SessionId: DWORD;<br>
              WTSInfoClass: DWORD; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;<br>
              <font color="#C0C0C0">
              {$EXTERNALSYM WTSQuerySessionInformation}<br>
              {$ELSE}<br>
              </font>
              function WTSQuerySessionInformation(hServer: THandle; SessionId: DWORD;<br>
              WTSInfoClass: DWORD; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;<br>
              <font color="#C0C0C0">
              {$EXTERNALSYM WTSQuerySessionInformation}<br>
              {$ENDIF}<br>
              </font>
              <b>
              implementation<br>
              </b>
              function ProcessIdToSessionId; external kernel32 name 'ProcessIdToSessionId';<br>
              function GetAdaptersInfo; external 'IPHlpApi.dll' name 'GetAdaptersInfo';<br>
              <font color="#C0C0C0">
              {$IFDEF UNICODE}<br>
              </font>
              function WTSOpenServer; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSOpenServerW';<br>
              <font color="#C0C0C0">
              {$ELSE}<br>
              </font>
              function WTSOpenServer; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSOpenServerA';<br>
              <font color="#C0C0C0">
              {$ENDIF}<br>
              {$IFDEF UNICODE}<br>
              </font>
              function WTSQuerySessionInformation; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSQuerySessionInformationW';<br>
              <font color="#C0C0C0">
              {$ELSE}<br>
              </font>
              function WTSQuerySessionInformation; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSQuerySessionInformationA';<br>
              <font color="#C0C0C0">
              {$ENDIF}<br>
              </font>
              <b>
              procedure ShowLocalIP;<br>
              </b>
              var&nbsp;&nbsp; p : pointer;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l,e : integer;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai: TIP_ADAPTER_INFO;<br>
              begin<br>
              &nbsp; l:= 0;<br>
              &nbsp; GetAdaptersInfo(nil,l);<br>
              &nbsp; GetMem(p,l + 1);<br>
              &nbsp; e:= GetAdaptersInfo(p,l);<br>
              &nbsp; if e = ERROR_SUCCESS then<br>
              &nbsp;&nbsp; begin<br>
              &nbsp;&nbsp;&nbsp;&nbsp; ai:= TIP_ADAPTER_INFO(p^);<br>
              &nbsp;&nbsp;&nbsp;&nbsp; repeat<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              ShowMessage(string(ai.AdapterName) + CHR(10) +<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;string(ai.Description) + CHR(10) +<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;string(ai.IPAddressList.IpAddress)); <br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              if ai.Next &lt;> nil then ai:= TIP_ADAPTER_INFO(ai.Next^);<br>
              &nbsp;&nbsp;&nbsp;&nbsp; until ai.Next = nil;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;end;<br>
              &nbsp;&nbsp;&nbsp; FreeMem(p,l);<br>
              end; /<font color="#C0C0C0">/ end of procedure ShowLocalIP</font><br>
              <br>
              <b>
              type </b>TIP = record<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressFamily: DWORD;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Address: array[0..19] of byte;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
              &nbsp;&nbsp;&nbsp;&nbsp; TCName = array[0..MAX_COMPUTERNAME_LENGTH] of char;</font>

              <p><font face="Courier" size="1">
              <b>
              <font color="#FF0000">
              procedure GetClientIP;<br>
              </font>
              </b>
              var<br>&nbsp;&nbsp;&nbsp; PID,SID : DWORD;<br>
              &nbsp;&nbsp;&nbsp; CName: TCName;<br>
              &nbsp;&nbsp;&nbsp; IP : string;<br>
              &nbsp;&nbsp;&nbsp; i : DWORD;<br>
              &nbsp;&nbsp;&nbsp; hSrv : THandle;<br>
              &nbsp;&nbsp;&nbsp; p: Pointer;<br>
              begin<br>
              &nbsp;&nbsp;<font color="#800000">PID:= GetCurrentProcessID</font>;<br>
              &nbsp;&nbsp; <font color="#800000">ProcessIdToSessionId(PID,SID)</font>;<br>
              &nbsp;&nbsp;i:= MAX_COMPUTERNAME_LENGTH + 1;<br>
              &nbsp;&nbsp; <font color="#800000">GetComputerName(CName,i)</font>;<br>
              &nbsp;&nbsp;if SID = 0 then <font color="#C0C0C0"> //local session</font><br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowLocalIP<br>
              &nbsp;&nbsp;else begin <font color="#C0C0C0">//remote session</font><br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ; hSrv:=<font color="#800000"> WTSOpenServer(CName)</font>;<br>
              &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if hSrv &lt;> 0 then<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;
              begin<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;
              <font color="#C0C0C0">//IP of the client</font><br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;
              if <font color="#800000"> WTSQuerySessionInformation(hSrv,SID,14 </font><font color="#C0C0C0"> {WTSClientAddress}</font><font color="#800000">,p,i)</font> then<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              begin<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              IP:= IntToStr(TIP(p^).Address[2]) + '.' +<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
              IntToStr(TIP(p^).Address[3]) + '.' +<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
              IntToStr(TIP(p^).Address[4]) + '.' +<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
              IntToStr(TIP(p^).Address[5]) + '.';<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
              ShowMessage(<font color="#800000"><b>'Client IP ' + IP)</b></font>;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              end;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              <font color="#C0C0C0">//name of the client</font><br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              if <font color="#800000"> WTSQuerySessionInformation(hSrv,SID,10 </font><font color="#C0C0C0"> {WTSClientName}</font><font color="#800000">,p,i)</font> then<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              begin<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;
              CName:= TCName(p^);<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;
              showmessage(<b><font color="#800000">'Client name ' + CName</font></b>);<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              end;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;end;<br>
              &

              Comment


              • #8
                <p>Hallo Peter,<br>
                auf dieser Seite <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wtsquerysessioninformation.asp">WTSQuerySessionInf ormation</a>
                und <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wts_client_address_str.asp">WTSQuerySessionInforma tion</a>
                ist doch alles, was du brauchst.<br>
                Hier ist die Lösung in Delphi, dieser Beispiel ermittelt, ob es sich um eine locale oder remote (TS) Session handelt und ziegt die
                IP.&nbsp;<br>
                <font face="Courier" size="1"><b>const</b><br>
                &nbsp;&nbsp;&nbsp; MAX_ADAPTER_NAME_LENGTH = 260;<br>
                &nbsp;&nbsp;&nbsp; MAX_ADAPTER_ADDRESS_LENGTH = 8;<br>
                &nbsp;&nbsp;&nbsp; MAX_ADAPTER_DESCRIPTION_LENGTH = 132;<br>
                <b>
                type </b>PIP_ADDR_STRING = ^TIP_ADDR_STRING;<br>
                &nbsp;&nbsp;&nbsp;&nbsp; TIP_ADDR_STRING = record<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                Next ointer;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                IpAddress:array[0..15] of char;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                IpMask:array[0..15] of char;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ContextWORD;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
                &nbsp;&nbsp;&nbsp; PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;<br>
                &nbsp;&nbsp;&nbsp; TIP_ADAPTER_INFO = record<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next: pointer;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboIndex : DWORD;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH - 1] of char;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH - 1] of char;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLength: UINT;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Address: array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of byte;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index: DWORD;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdapterType: UINT;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DhcpEnabled: UINT;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CurrentIpAddress: PIP_ADDR_STRING;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IpAddressList: TIP_ADDR_STRING;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GatewayList: TIP_ADDR_STRING;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DhcpServer: TIP_ADDR_STRING;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HaveWins: BOOL;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrimaryWinsServer: TIP_ADDR_STRING;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SecondaryWinsServer: TIP_ADDR_STRING;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeaseObtained : integer;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeaseExpires: integer;<br>
                &nbsp;&nbsp;&nbsp; end;<br>
                function ProcessIdToSessionId(dwProcessIdWORD;var pSessionIdWORD):boolean; stdcall;<br>
                function GetAdaptersInfo(pAdapterInfo:PIP_ADAPTER_INFO; var pOutBufLen:integer)WORD; stdcall;<br>
                <font color="#C0C0C0">
                {$IFDEF UNICODE}<br>
                </font>
                function WTSOpenServer(pServerName: PWideChar): THandle; stdcall;<br>
                <font color="#C0C0C0">
                {$EXTERNALSYM WTSOpenServer}<br>
                {$ELSE}<br>
                </font>
                function WTSOpenServer(pServerName: PAnsiChar): THandle; stdcall;<br>
                <font color="#C0C0C0">
                {$EXTERNALSYM WTSOpenServer}<br>
                {$ENDIF}<br>
                {$IFDEF UNICODE}<br>
                </font>
                function WTSQuerySessionInformation(hServer: THandle; SessionId: DWORD;<br>
                WTSInfoClass: DWORD; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;<br>
                <font color="#C0C0C0">
                {$EXTERNALSYM WTSQuerySessionInformation}<br>
                {$ELSE}<br>
                </font>
                function WTSQuerySessionInformation(hServer: THandle; SessionId: DWORD;<br>
                WTSInfoClass: DWORD; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;<br>
                <font color="#C0C0C0">
                {$EXTERNALSYM WTSQuerySessionInformation}<br>
                {$ENDIF}<br>
                </font>
                <b>
                implementation<br>
                </b>
                function ProcessIdToSessionId; external kernel32 name 'ProcessIdToSessionId';<br>
                function GetAdaptersInfo; external 'IPHlpApi.dll' name 'GetAdaptersInfo';<br>
                <font color="#C0C0C0">
                {$IFDEF UNICODE}<br>
                </font>
                function WTSOpenServer; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSOpenServerW';<br>
                <font color="#C0C0C0">
                {$ELSE}<br>
                </font>
                function WTSOpenServer; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSOpenServerA';<br>
                <font color="#C0C0C0">
                {$ENDIF}<br>
                {$IFDEF UNICODE}<br>
                </font>
                function WTSQuerySessionInformation; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSQuerySessionInformationW';<br>
                <font color="#C0C0C0">
                {$ELSE}<br>
                </font>
                function WTSQuerySessionInformation; external '<font color="#000080">wtsapi32.dll</font>' name 'WTSQuerySessionInformationA';<br>
                <font color="#C0C0C0">
                {$ENDIF}<br>
                </font>
                <b>
                procedure ShowLocalIP;<br>
                </b>
                var&nbsp;&nbsp; p : pointer;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l,e : integer;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai: TIP_ADAPTER_INFO;<br>
                begin<br>
                &nbsp; l:= 0;<br>
                &nbsp; GetAdaptersInfo(nil,l);<br>
                &nbsp; GetMem(p,l + 1);<br>
                &nbsp; e:= GetAdaptersInfo(p,l);<br>
                &nbsp; if e = ERROR_SUCCESS then<br>
                &nbsp;&nbsp; begin<br>
                &nbsp;&nbsp;&nbsp;&nbsp; ai:= TIP_ADAPTER_INFO(p^);<br>
                &nbsp;&nbsp;&nbsp;&nbsp; repeat<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ShowMessage(string(ai.AdapterName) + CHR(10) +<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;string(ai.Description) + CHR(10) +<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;string(ai.IPAddressList.IpAddress)); <br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                if ai.Next &lt;> nil then ai:= TIP_ADAPTER_INFO(ai.Next^);<br>
                &nbsp;&nbsp;&nbsp;&nbsp; until ai.Next = nil;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;end;<br>
                &nbsp;&nbsp;&nbsp; FreeMem(p,l);<br>
                end; /<font color="#C0C0C0">/ end of procedure ShowLocalIP</font><br>
                <br>
                <b>
                type </b>TIP = record<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressFamily: DWORD;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Address: array[0..19] of byte;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>
                &nbsp;&nbsp;&nbsp;&nbsp; TCName = array[0..MAX_COMPUTERNAME_LENGTH] of char;</font>

                <p><font face="Courier" size="1">
                <b>
                <font color="#FF0000">
                procedure GetClientIP;<br>
                </font>
                </b>
                var PID,SID : DWORD;<br>
                &nbsp;&nbsp;&nbsp; CName: TCName;<br>
                &nbsp;&nbsp;&nbsp; IP : string;<br>
                &nbsp;&nbsp;&nbsp; i : DWORD;<br>
                &nbsp;&nbsp;&nbsp; hSrv : THandle;<br>
                &nbsp;&nbsp;&nbsp; p: Pointer;<br>
                begin<br>
                &nbsp;&nbsp;<font color="#800000">PID:= GetCurrentProcessID</font>;<br>
                &nbsp;&nbsp; <font color="#800000">ProcessIdToSessionId(PID,SID)</font>;<br>
                &nbsp;&nbsp;i:= MAX_COMPUTERNAME_LENGTH + 1;<br>
                &nbsp;&nbsp; <font color="#800000">GetComputerName(CName,i)</font>;<br>
                &nbsp;&nbsp;if SID = 0 then ShowLocalIP <font color="#C0C0C0">//local session</font><br>
                &nbsp;&nbsp;else begin <font color="#C0C0C0">//remote session</font><br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ; hSrv:=<font color="#800000"> WTSOpenServer(CName)</font>;<br>
                &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if hSrv &lt;> 0 then<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;
                begin<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;
                <font color="#C0C0C0">//IP of the client</font><br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;
                if <font color="#800000"> WTSQuerySessionInformation(hSrv,SID,14 </font><font color="#C0C0C0"> {WTSClientAddress}</font><font color="#800000">,p,i)</font> then<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                begin<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                IP:= IntToStr(TIP(p^).Address[2]) + '.' +<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
                IntToStr(TIP(p^).Address[3]) + '.' +<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
                IntToStr(TIP(p^).Address[4]) + '.' +<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
                IntToStr(TIP(p^).Address[5]) + '.';<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;
                ShowMessage(<font color="#800000"><b>'Client IP ' + IP)</b></font>;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                end;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                <font color="#C0C0C0">//name of the client</font><br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                if <font color="#800000"> WTSQuerySessionInformation(hSrv,SID,10 </font><font color="#C0C0C0"> {WTSClientName}</font><font color="#800000">,p,i)</font> then<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                begin<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;
                CName:= TCName(p^);<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;
                showmessage(<b><font color="#800000">'Client name ' + CName</font></b>);<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                end;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;end;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;< br>
                <font color="#FF0000">
                end

                Comment

                Working...
                X