Page 1 sur 1
[R] Récupérer adresse IP d'un client TSE sous linux
Posté : jeu. 04 déc. 2008 17:53
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : ven. 05 déc. 2008 00:18
par Tlem
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : ven. 05 déc. 2008 03:46
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : ven. 05 déc. 2008 09:05
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")
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : ven. 05 déc. 2008 10:44
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

Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : ven. 05 déc. 2008 14:42
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : ven. 05 déc. 2008 16:35
par Yogui
j'ai trouvé un bout de code qui fonctionne

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
uses JwaWinType, JwaWtsApi32, JwaWinsock2, ExtCtrls;
type
PWtsSessionInfoAArray = ^TWtsSessionInfoAArray;
TWtsSessionInfoAArray = array[0..ANYSIZE_ARRAY-1] of WTS_SESSION_INFOA;
var hServer: THandle;
SessionInfoPtr: PWtsSessionInfoAArray;
pCount: Cardinal;
ClientAddressPtr: PWtsClientAddress;
dwBytesReturned: Cardinal;
IPStr: String;
i: integer;
begin
if WtsEnumerateSessions(WTS_CURRENT_SERVER, 0, 1, PWTS_SESSION_INFO(SessionInfoPtr),
pCount) then
begin
for i := 0 to pCount - 1 do
begin
WTSQuerySessionInformation(WTS_CURRENT_SERVER, SessionInfoPtr^.SessionId,
WTSClientAddress, Pointer(ClientAddressPtr), dwBytesReturned);
case ClientAddressPtr^.AddressFamily of
AF_INET:
IPStr:= Format(‘%d.%d.%d.%d’, [ClientAddressPtr^.Address[2],
ClientAddressPtr^.Address[3], ClientAddressPtr^.Address[4],
ClientAddressPtr^.Address[5]]);
AF_INET6:
IPStr:= ‘IPv6 address not yet supported’;
AF_IPX:
IPStr:= ‘IPX is not supported’;
AF_NETBIOS:
IPStr:= ‘NETBIOS is not supported’;
AF_UNSPEC:
IPStr:= ‘Unspecified (console and listener session have no address)’;
end;
WTSfreeMemory(ClientAddressPtr);
end;
end;
// Don’t close the handle if it’s WTS_CURRENT_SERVER
WtsFreeMemory(SessionInfoPtr);
end;
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : lun. 08 déc. 2008 09:38
par Yogui
Je vais tenter autre chose
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : mar. 09 déc. 2008 08:25
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : mar. 09 déc. 2008 20:48
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.
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : mar. 09 déc. 2008 22:18
par Yogui
J'ai bien vu mais je n'arrive pas à appliquer leurs explications

Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : mer. 10 déc. 2008 21:11
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : jeu. 11 déc. 2008 12:30
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.
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : jeu. 11 déc. 2008 22:33
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : ven. 12 déc. 2008 09:07
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
Re: [..] Récupérer adresse IP d'un client TSE sous linux
Posté : lun. 21 nov. 2016 15:42
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 $hServerConst $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 $aResultEndFunc ;==>_WTSEnumSessionsFunc _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 ;==>_WTSReadStringWFunc _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 ;==>_WTSQuerySessionDataFunc _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]) EndIfNextEnvSet('ClientName',$result)