[.NET2] WRAPPER POUR API WINDOWS TERMINAL SERVICES.

cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 - 17 juin 2008 à 17:51
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
2 sept. 2009 à 15:33
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 oct. 2008 à 23:24
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
17 oct. 2008 à 17:01
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 1
3 juil. 2008 à 11:23
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
3 juil. 2008 à 11:05
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 1
3 juil. 2008 à 10:33
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
3 juil. 2008 à 10:29
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 1
3 juil. 2008 à 10:17
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
2 juil. 2008 à 13:17
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 1
2 juil. 2008 à 12:02
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
18 juin 2008 à 17:52
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
18 juin 2008 à 13:51
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
18 juin 2008 à 11:52
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
18 juin 2008 à 10:42
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
18 juin 2008 à 09:51
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
18 juin 2008 à 08:18
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
18 juin 2008 à 08:06
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
18 juin 2008 à 08:05
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 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 juin 2008 à 18:28
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
17 juin 2008 à 17:51
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
Rejoignez-nous