[.NET2] WRAPPER POUR API WINDOWS TERMINAL SERVICES.

Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
- - Dernière réponse : cedricsynix
Messages postés
4
Date d'inscription
samedi 21 janvier 2006
Statut
Membre
Dernière intervention
2 septembre 2009
- 2 sept. 2009 à 15:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47023-net2-wrapper-pour-api-windows-terminal-services

cedricsynix
Messages postés
4
Date d'inscription
samedi 21 janvier 2006
Statut
Membre
Dernière intervention
2 septembre 2009
-
Salut,

Tout d'abord, merci de partages tes efforts et connaissances avec nous autres.
J'aimerais savoir comment récupérer l'IP du client. Pas l'ip lan mais WAN.
Quand je fais ceci, c'est l'ip 192.168.x.x qui est retournée et non 212.166.x.x
Console.WriteLine(sess_ext.WTSClientAddress.ToString)


Si qq d'autre à une idée pour trouver l'ip d'un client connecté, ca m'intéresse :)

Merci d'avance,

Cédric
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Etrange, cela tourne depuis des mois sur des applis sous Windows2000 Pro et XP et RAS...
As-tu un cluster de monter sur tes serveurs TSE ?
nethobbit
Messages postés
1
Date d'inscription
samedi 24 décembre 2005
Statut
Membre
Dernière intervention
17 octobre 2008
-
Je crois avoir le même problème que Dimitriusai. J'utilise le dll à partir d'une classe dans une appli Winforms en C#. Je peux exécuter l'application une fois ou deux, mais à la longue l'appli gèle lors de l'appel à la fonction Close() de la dll. Et j'ai un processus "vshost" qui persiste toujours. Le "try/catch" que j'ai codé n'est jamais atteint car je n'ai aucun retour de l'appel à Close().
dimitriusai
Messages postés
76
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
7 mai 2009
-
rien n'est levé, le try catch ne détecte rien du tt. Le programme plante simplement. Dans la boucle suivante.

Try
For i As Integer = 0 To MysqlResult1.Count - 1
Dim wts As New WTSHelper()
Dim count As Integer = 0
Dim hServer As IntPtr = wts.Open(MysqlResult1(i).Item(0).ToString)
MsgBox(MysqlResult1(i).Item(0).ToString)

For Each sess As Integer In wts.EnumAllSessionsId(hServer)

Dim sess_ext As WTSLib.WTS_SESSION_INFO_EXT = wts.GetSessionInfos(hServer, sess)

sess_ext.ToString()
Dim tab As New ArrayList
Dim tab2(3)
tab2(0) = sess_ext.WTSUserName
tab2(1) = sess_ext.WTSClientName
tab2(2) = sess_ext.WTSSessionId
tab2(3) = statuschng(sess_ext.WTSConnectState)
'tab.Add(tab2)
'DataGridView1.Rows.Add(tab)

Next
wts.Close(hServer)
Next

Catch ex As Exception
MsgBox("catch" & ex.Message)
End Try

J'ai réutilisé ta dll en vb.net
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Que veux-tu dire par "cela plante" ?
Tu as une exception de levée ?
dimitriusai
Messages postés
76
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
7 mai 2009
-
Ok merci. Je vais abandonner cette solution car de mon coté cela plante après un ou deux serveurs et les infos ne sont pas tjrs correct alors que le handle est bien ouvert et fermé comme tu l'expliques bien dans ta source.

Je ne vois vraiment pas d'où vient le problème.
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Pas d'erreur après bouclage sur 3 serveurs TS.
Mais à chaque changement de serveur TS tu dois ouvrir un handler sur celui-ci et le libérer à la fin avec les méthodes Open("NomServeurTs") et Close() comme dans l'exemple.

++
dimitriusai
Messages postés
76
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
7 mai 2009
-
Après quelques heures de travail, j'ai réussi à faire fonctionner wts, sur un serveur, mais mon but est de tester plusieurs serveurs, je fais donc une boucle afin de récupérer ces informations (dans le domaine bien sur ^^) mais il y a un plantage de wts après quelques serveurs.
Qu'en penses-tu ? le fais tu sur plusieurs serveurs ou sur un serveur unique ?
Connais tu unes autre solution afin de récupérer ce genre d'information.

Merci d'avance et Cordialement.(USAI.D)
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Cette méthode utilise une méthode non documentée de l'api de wts. Il se peut que ton client ne prenne pas en charge celle-ci.
Lance le débogage et regarde à quel moment dans GetTimeInfo l'exception est levée.
dimitriusai
Messages postés
76
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
7 mai 2009
-
Hello, j'ai testé ton appli et fait une exception qui est levée.
Et ce lors de cette ligne ci

WTSLib.SessionTimeInfos sess_t = wts.GetTimeInfo(hServer, sess, sess_ext.WTSConnectState);

Qui permet d'avoir les informations de temps.

Une exception non gérée du type 'System.ExecutionEngineException' s'est produite dans WTSLib.dll
Si tu as une idée

Merci d'avance
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Ah ok. je l'ai essayé uniquement sur des postes dans un domaine avec un utilisateur admin de son poste.
Je vais essayé sur une session tse !
cs_eldim
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
oui sur un des server j'ai du ica mais sur l'autre ça a planté pareil... peut-être un problème de droit... pourtant je l'ai exécuté en tant qu'admin du domain... à partir d'une session tse c'est surement parce que j'étais sur une session non ?
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Etrange j'ai testé sur 2 serveurs TS avec chacun 10/15 sessions et aucun problème...
Tu as des sessions qui utilisent un autre protocole que rdp ?
cs_eldim
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
je l'ai executé sur un 2 serveurs différents chacun ayant un faible nombre de sessions ouvertes : pas plus de 15. Certains ont des sessions déconnectées mais toujours actives. Le programme donne en gros entre 3 et 5 sessions correctement puis donne un ID de session et plante
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
La gestion des execptions est surement à revoir j'en conviens !
Pourtant j'en ai fait des séries de test avant de le mettre en prod où je bosse.
Où, à quel moment, le contexte (nb de sessions, sur domaine ?, etc...) ??
cs_eldim
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
Oups, j'aurais pas du mettre 10... stack overflow exception sur win2003 contenant plusieurs sessions rdp et ica
cs_eldim
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
aller un ptit 10
cs_eldim
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
lol, j'ai regardé plus en détail le reste du code... purée c'est clair bien commenté, bien classé et surtout j'y ai appri un truc sympa : l'utilisation du yield que je ne connaissais pas. bon boulot
cs_Willi
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Salut eldim,
+1 pour Environment.UserDomainName ;)
cs_eldim
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
Salut,
ça à pas l'air mal même si je n'ai pas vu toutes les infos...
ce qui serait un plus c'est d'utiliser Environment.UserDomainName
à la place de ton domain en dur