[R] Récupérer adresse IP d'un client TSE sous linux

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

[R] Récupérer adresse IP d'un client TSE sous linux

#1

Message par Yogui »

Bonjour,

je vais commencer par exposer la situation.

Sur notre réseau nous avons 60 % de clients léger (RDP) sous linux et hors domaine afin de simplifier les choses nous aimerions avoir un petit script qui permetterai de nous donner l'adresse IP du clients légers (@IPAddress1 nous retourne l'adresse du serveur)

Pour le moment j'ai trouvé comment récupérer le nom du client avec ça :

Code : Tout sélectionner

$oShell = ObjCreate("WScript.Shell")
$ProcessEnv = $oShell.Environment("PROCESS")
$ClientName = $ProcessEnv("Clientname")
MsgBox(0,'',$ClientName)
ça fonctionne !

Puisque nos clients ne sont pas enregistrer dans le DNS impossible de faire un ping.

En recherchant dans le forum US j'ai trouvécet API WTSQuerySessionInformation en particulier le paramètre WTSClientAddress problème je ne sais pas comment l'utiliser

(forum US : http://www.autoitscript.com/forum/index ... pi32&st=15)

Merci d'avance
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#2

Message par Tlem »

Avez-vous essayez ceci :

Code : Tout sélectionner

$ClientName = $ProcessEnv("ClientIP")
 
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 415
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#3

Message par jl56 »

bonjour a tous

je viens de trouver ceci sur le web
http://www.winserverkb.com/Uwe/Forum.as ... IP-Address

si j'ai bien compris ce script tu récupères, comme dans ton code le nom, du poste
puis tu t'en sert pour pinguer et trouver ainsi l'ip du poste client

a mon avis ta demande n'est valable que pour un reseau local

je viens de tester par ipwan
$ClientName = $ProcessEnv("ClientIP")
ca ne fonctionne pas, je testerai demain en reseau local

a+ jl56
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#4

Message par Yogui »

jl56 a écrit :bonjour a tous

je viens de trouver ceci sur le web
http://www.winserverkb.com/Uwe/Forum.as ... IP-Address

si j'ai bien compris ce script tu récupères, comme dans ton code le nom, du poste
puis tu t'en sert pour pinguer et trouver ainsi l'ip du poste client

a mon avis ta demande n'est valable que pour un reseau local

je viens de tester par ipwan
$ClientName = $ProcessEnv("ClientIP")
ca ne fonctionne pas, je testerai demain en reseau local

a+ jl56

le ping ne fonctionnera pas les client léger ne sont pas renseignier dans le dns

je test $ClientName = $ProcessEnv("ClientIP")
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#5

Message par Yogui »

j'ai tester avec casiment toutes les combinaisons entre adress et ip et client et ip ...

rien ne passe :(


j'ai trouvé ce petit lien :

http://techsupt.winbatch.com/TS/T000001010003F2.html qui j'espère va m'aider mais si quelqu'un trouve avant moi je suis preneur :D
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#6

Message par Yogui »

je met ici mes avancés sur le problème ça peux toujours aider.

Code : Tout sélectionner

$WshShell = ObjCreate("WScript.Shell")
$WshSysEnv = $WshShell.Environment("SYSTEM")
MsgBox(0,'nombre de processeurs',"sur cette machine il y a : "&$WshSysEnv("NUMBER_OF_PROCESSORS")&" processeur(s)")



$ProcessEnv = $WshShell.Environment("PROCESS")
$ClientName = $ProcessEnv("Clientname")
$WshNetwork = ObjCreate("WScript.Network")
$oDrives = $WshNetwork.EnumNetworkDrives
$oPrinters = $WshNetwork.EnumPrinterConnections
MsgBox(0,'nom de la machine =',$ClientName)
MsgBox(0,"Domaine","Domaine = " & $WshNetwork.UserDomain)
MsgBox(0,"Serveur","Nom serveur = " & $WshNetwork.ComputerName)
MsgBox(0,"utilisateur","Nom utilisateur  = " & $WshNetwork.UserName)

For $i = 0 to $oDrives.Count - 1 Step 2
    MsgBox(0,"lecteurs utilisés par la session :","Unité " & $oDrives.Item($i) & " = " & $oDrives.Item($i+1))

Next

For $i = 0 to $oPrinters.Count - 1 Step 2
        MsgBox(0,"imprimantes utilisées par la session ","port " & $oPrinters.Item($i) & " = " & $oPrinters.Item($i+1))
Next
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#7

Message par Yogui »

j'ai trouvé un bout de code qui fonctionne :mrgreen: problème c'est fait en delphi :(

Quelqu'un peux t il le traduire pour moi en autoit je pense vraiment que je risque d'y passer des heures merci

http://www.remkoweijnen.nl/blog/2007/10 ... p-address/
► Afficher le texte
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#8

Message par Yogui »

Je vais tenter autre chose :mrgreen:

Quelqu'un peux t il traduire ce code VBS il retourne le nom du poste mais je pense Pouvoir le modifier pour avoir l'IP monprolbème et surtout pour traduire le début Enum je ne connai pas

Code : Tout sélectionner

 Enum WTS_INFO_CLASS
        WTSInitialProgram = 0
        WTSApplicationName = 1
        WTSWorkingDirectory = 2
        WTSOEMIdWTSOEMIdNot = 3
        WTSSessionId = 4
        WTSUserName = 5
        WTSWinStationName = 6
        WTSDomainName = 7
        WTSConnectState = 8
        WTSClientBuildNumber = 9
        WTSClientName = 10
        WTSClientDirectory = 11
        WTSClientProductId = 12
        WTSClientHardwareId = 13
        WTSClientAddress = 14
        WTSClientDisplay = 15
        WTSClientProtocolType = 16
        WTSIdleTime = 17
        WTSLogonTime = 18
        WTSIncomingBytes = 19
        WTSOutgoingBytes = 20
        WTSIncomingFrames = 21
        WTSOutgoingFrames = 22
    End Enum
    Private Const WTS_CURRENT_SERVER_HANDLE As Integer = -1
    Private Declare Sub WTSFreeMemory Lib "wtsapi.dll" (ByVal memory As IntPtr)
    Private Declare Auto Function WTSGetActiveConsoleSessionId Lib "Kernek32.dll" () As Integer
    Private Declare Auto Function WTSQuerySessionInformation Lib "wtsapi32.dll" ( _
            ByVal hServer As Int32, _
            ByVal SessionId As Int32, _
            ByVal InfoClass As WTS_INFO_CLASS, _
            ByRef ppBuffer As IntPtr, _
            ByRef pCount As Int32) As Int32
    Private Function fnGetClientName() As String
        Dim R As String = ""
        Dim Buffer As IntPtr = IntPtr.Zero
        Try
            Dim bytesReturned As Integer
            Dim sessionInfo As Boolean = WTSQuerySessionInformation(IntPtr.Zero.ToInt32, -1, _
                WTS_INFO_CLASS.WTSClientName, Buffer, bytesReturned)
            R = System.Runtime.InteropServices.Marshal.PtrToStringAuto(Buffer)
        Catch ex As Exception
        Finally
            Try
                WTSFreeMemory(Buffer)
                Buffer = IntPtr.Zero
            Catch ex As Exception
            End Try
        End Try
        Return R
    End Function
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#9

Message par Yogui »

j'ai fait la même demande sur le forum US mais la réponse je me parle pas :(

il faut dire que mon anglais est très scolaire

http://www.autoitscript.com/forum/index ... opic=85643
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#10

Message par Tlem »

Une recherche rapide sur le forum Anglais avec le terme : Wtsapi32.dll
donne 3 liens dont un qui semble apporter un début de solution (l'utilisation de la dll) et un autre qui donne des infos sur la possibilité de faire quelque chose coté Citrix.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#11

Message par Yogui »

J'ai bien vu mais je n'arrive pas à appliquer leurs explications :oops:
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 415
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#12

Message par jl56 »

bonjour

J'avoue que je comprend pas ton besoin
dans le concept tse sert a ce connecter a un serveur TSE depuis n'importe ou
si le port d'un routeur (pour tse le tcp 3389) est ouvert, tu auras x fois la même adresse ip
pour les clients, si par exemple ce sont des utilisateurs qui se connectent depuis leur domicile ( la plupart des box et routeur maison utilisant la plage 192.168.1.x).
c'est pour cela, je pense, que l'adresse ip du poste client n'est par vu par le serveur
je viens d'aller sur le gestionnaire d'un terminal serveur w2k3 et il n'y a pas d'endroit ou l'on peut lire l'ip d'un client tse par contre tu vois le nom du poste.
sur linux ( system que je ne connais pas du moins en environnent pro) je suppose que chaque poste a son nom d'ordinateur. Sachant cela, si tes postes linux se trouvent sur un réseau local, avec n'importe quel sniffer , tu pourras par le nom du poste connaitre l'adresse ip ( voir un simple tableau de correspondance ip/nom du poste)
le script déjà vu précédemment fonctionne pour te donner le nom du poste

Code : Tout sélectionner

#include <GUIConstants.au3>
#Include <date.au3>
#include <EditConstants.au3>
$oShell = ObjCreate("WScript.Shell")
$ProcessEnv = $oShell.Environment("PROCESS")
$ClientName = $ProcessEnv("Clientname")
MsgBox(0,'',$ClientName)
 


a+ jl56
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#13

Message par Yogui »

En fait le concept TSE est surtout fait pour faire des économies d'argent et de temps.

A la place d'installer un Pc à une secrétaire on lui cole un TSE qui attaque une ferme de serveurs (nous en avons 6 ici) ou tout les logiciels sont déjà présent. (économie d'argent un client léger ne coute que 200 € et de temps pas d'installation)

Aucun routeur puisque tout se fait en interne. ou au pire par VPN

Le vrai besoin est le suivant :

Un client léger à pour adresse IP 172.20.150.230 il attaque la ferme TSE via un logiciel d'équilibrage de charge via un IP virtuel (Windows le fait très bien).

donc mon client léger 172.20.150.230 se connecte à une IP 172.20.1.118

Derrière Mon client j'ai une imprimante, je ne fait pas remonter les imprimantes par RDP (solution de facilité mais qui devient rapidement génant si les utilisateurs ne ferme par correctement les sessions...) mais j'installe les imprimantes en LPT sur chacun des serveurs avec pour IP l'IP des clients Léger.

Bref l'intéret de récupérer les informations d'une session (nom IP serveur imprimantes ...) et de simplifier la vie du service de hot line.


Pour information la récupération du nom de session se fait très bien en bat
echo %clientname%

Mais puisque les clients ne sont pas renseigner dans le DNS un Ping ne fonctionne pas.
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 415
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#14

Message par jl56 »

bonjour
mais j'installe les imprimantes en LPT sur chacun des serveurs avec pour IP l'IP des clients Léger
tu peut développer stp
(solution de facilité mais qui devient rapidement génant si les utilisateurs ne ferme par correctement les sessions...)
oui nous avons le même probleme. pour le regler nous avons paramétrer une tempo si la deconnexion dure plus de x minuters alors fermeture de session.
echo %clientname%
je me répète mais si tu es en réseau local et que tu connais le nom des postes tu peut avoir un tableau de corespondance nom/ip ( même si tu utilises un DHCP)

a+ jl56
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#15

Message par Yogui »

sur nos serveurs TS nous installons un service d'impression unix qui permet d'installer les imprimantes sur les serveurs ensuite nous gérons les droits grace aux sécurités. Après pour plus de renseignement je peux aller demander la méthode aux techniciens.

Par contre la méthode pour avoir les IP je veux bien (attention les clients ne sont pas renseignés dans le DNS) un Ping sur le nom d'une de ces machines ne retourne rien (de plus certaine de ces machines n'ont pas vraiment de nom la variable %clientname% me retourne le nom de la ligne de connexion RDP.)

Yogui
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Récupérer adresse IP d'un client TSE sous linux

#16

Message par Yogui »

Réponse à ma question :)

Comme l'utilisation de serveur tse et ou RDS ne se fait pas (ou peu) hors d'une entreprise je met la réponse ici.

L'idée est donc de récupérer le nom du client léger sur lequel est connecté un utilisateur et de l'ajouter en variable d'environement.
ce code doit être lancé sur la session distante
#EndRegion ;**** ????? ACNWrapper_GUI ****
Global $result,$index1
#include <Array.au3>
 Dim $hServer
Const $tagWTS_SESSION_INFO = "long SessionID;ptr SessionName;long State"
Func _WTSEnumSessions($hServer)
        Local $iResult
        $iResult = DllCall("Wtsapi32.dll", "bool", "WTSEnumerateSessionsW", "handle", $hServer, "long", 0, "long", 1, "ptr*", 0, "long*", 0)
        Local $aResult[$iResult[5] + 1][7] = [[$iResult[5]]]
        TCPStartup()
      _ArrayDisplay($aResult)
        For $i = 1 To $aResult[0][0]
                $tSessionInfo = DllStructCreate($tagWTS_SESSION_INFO, $iResult[4] + ($i - 1) * (@AutoItX64 + 1) * 12)
                $aResult[$i][0] = DllStructGetData($tSessionInfo, "SessionID")
                $aResult[$i][1] = DllStructGetData($tSessionInfo, "State")
                $aResult[$i][2] = _WTSReadStringW( DllStructGetData($tSessionInfo, "SessionName"), 0)
                $aResult[$i][3] = _WTSReadStringW(_WTSQuerySessionData($hServer, $aResult[$i][0], 7)) ; Domain name
                $aResult[$i][4] = _WTSReadStringW(_WTSQuerySessionData($hServer, $aResult[$i][0], 5)) ; User name
                $aResult[$i][5] = _WTSReadStringW(_WTSQuerySessionData($hServer, $aResult[$i][0], 10)) ; Client name
                $aResult[$i][6] = _GetHostIPAddresses($aResult[$i][3])
        Next
        DllCall("Wtsapi32.dll", "none", "WTSFreeMemory", "ptr", $iResult[4])
        Return $aResult
EndFunc ;==>_WTSEnumSessions

Func _WTSReadStringW($pStringW, $fFree = 1)
        If $pStringW = 0 Then Return ""
        Local $iResult
        $iResult = DllCall("Kernel32.dll", "long", "lstrlenW", "ptr", $pStringW)
        $iResult = DllCall("Kernel32.dll", "none", "RtlMoveMemory", "wstr", "", "ptr", $pStringW, "long", $iResult[0] * 2 + 2)
        If $fFree Then DllCall("Wtsapi32.dll", "none", "WTSFreeMemory", "ptr", $pStringW)
        Return $iResult[1]
EndFunc ;==>_WTSReadStringW

Func _WTSQuerySessionData($hServer, $iSessionID, $iInfoClass)
        Local $iResult
        $iResult = DllCall("Wtsapi32.dll", "bool", "WTSQuerySessionInformationW", "ptr", $hServer, "long", $iSessionID, "long", $iInfoClass, "ptr*", 0, "long*", 0)
        Return SetError(0, $iResult[5], $iResult[4])
EndFunc ;==>_WTSQuerySessionData

Func _GetHostIPAddresses($sHostName)
        Local $iResult
        $iResult = DllCall("Ws2_32.dll", "ptr", "gethostbyname", "str", $sHostName)
        If $iResult[0] = 0 Then Return ""
        Local $tHostent = DllStructCreate("ptr name;ptr aliases;word addrtype;word length;ptr addrlist", $iResult[0])
        Local $pAddrList = DllStructGetData($tHostent, "addrlist")
        Local $tAddress, $pAddress, $tLONG, $iResult, $sResult
        For $i = 0 To 1023
                $tAddress = DllStructCreate("ptr address", $pAddrList + $i * ((@AutoItX64 + 1) * 4))
                $pAddress = DllStructGetData($tAddress, "address")
                If $pAddress = 0 Then ExitLoop
                $tLONG = DllStructCreate("long LONG", $pAddress)
                $iResult = DllCall("Ws2_32.dll", "str", "inet_ntoa", "long", DllStructGetData($tLONG, "LONG"))
                $sResult &= $iResult[0] & ", "
        Next
        Return StringTrimRight($sResult, 2)
      _ArrayDisplay($sResult)
EndFunc ;==>_GetHostIPAddresses

$aSession = _WTSEnumSessions(0)
_ArrayDisplay($aSession)
_ArrayColDelete($aSession, 0)
_ArrayColDelete($aSession, 0)
_ArrayColDelete($aSession, 0)
_ArrayColDelete($aSession, 0)
_ArrayColDelete($aSession, 2)



For $index1 = 0 To _ArrayMaxIndex($aSession)+1 Step 1
   If $aSession[$index1][0] = @UserName Then
;~       ConsoleWrite($aSession[$index1][0] &"="& @UserName&@CRLF)
;~       FileWrite("c:\log.log",$aSession[$index1][0] &"="& @UserName&@CRLF)
      $result = ($aSession[$index1][1])
   EndIf
Next


EnvSet('ClientName',$result)
Répondre