Connaitre l'ensemble des méthodes d'un objet - VB/VBA/VBS - Programmation
Marsh Posté le 05-07-2007 à 15:10:25
OK, j'ai trouvé ce script qui fait en partie ce que je demandais :
|
Ce script parcoure les objets de type "User" et affiche toutes leurs propriétés déclarées.
Le resultat ressemble à ça :
|
La ligne "Parameters" m'interpelle. Les caractères bizaroïdes me font penser à des séparateurs de champs. J'ai testé cette ligne avec un IsArray() qui me retourne "False". Le champs "Parameters" est donc assimilable (à priori) à un tableau mais n'en est pas un.
CtxWorkDirectory, CtixInitialProgram, etc sont des noms de champs "Terminal Server Settings" (pour des Users de Domaine NT4.0), on a donc l'en-tête d'un tableau... Mais pas les données qu'il contient.
Quelqu'un a-t-il une idée pour accèder à ces données "cachées" ?
La liste des champs serait elle la liste des propriétés de cet objet ?
Marsh Posté le 05-07-2007 à 16:07:15
Le mieux est encore de consulter la documentation de l'objet.
Le site MSDN de Microsoft regorge d'informations.
Il en manque sûrement et certaines ne sont pas faciles à trouver mais c'est très souvent une aide précieuse.
Marsh Posté le 05-07-2007 à 16:28:26
tegu a écrit : Le mieux est encore de consulter la documentation de l'objet. |
Le problème c'est qu'effectivement toutes les propriétés ne sont pas toujours documentées.
L'idée c'est de faire un script "générique" dans lequel on puisse appeler un objet et qu'il nous ressorte la liste des propriétés qu'il contient.
Ici par exemple je dois pouvoir sortir TOUTES les propriétés connues de la machine et non seulement celles pour lequelles j'aurais trouvé un peu de doc (j'en oublierais nécessairement). Il faut que le produit soit "auto-adaptable".
il y a une propriété "properties_" qui a l'air de faire à peu près ça. C'est elle que le "scriptomatic.hta" de chez microsoft utilise.
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strLocalComputer & g_strCurrentNamespace) |
Mais très sincèrement je ne comprend pas comment ça marche, et si j'essaie de faire appel à cette propriété sur mon objet
objUser.Properties_ |
j'ai une erreur : object does not support this methode or property...
Je ne comprend pas pourquoi j'arrive à parcourir la collection "objClass.MandatoryProperties" et lui faire afficher ce qu'elle contient, mais que je n'airrive pas à créer ou parcourir une collection "objClass.MandatoryProperties.objProperty" pour en rebalayer la liste des sous-objets.
J'ai plus l'impression que c'est parce que mon code (ma boucle for) est mal écrit que parce que c'est impossible...
Si quelqu'un se sent prêt à relever le défi, je prend toutes les propositions
Marsh Posté le 05-07-2007 à 16:42:33
ReplyMarsh Posté le 05-07-2007 à 17:36:53
« il y a une propriété "properties_" qui a l'air de faire à peu près ça ». En fait tout est dans la partie en gras
« Le problème c'est qu'effectivement toutes les propriétés ne sont pas toujours documentées. »
Malheureusement les collections .Properties des objets ne contiennent pas toujours toutes les propriétés des objets en VBA/VBS ou VB6.
Surtout si on utilise des composants non microsoft.
Mais ce qui compte c'est que dans ton cas cela suffise.
Marsh Posté le 06-07-2007 à 12:32:16
jpcheck a écrit : attention, on dirait que tu confonds objclass et objuser |
C'est clair que la nuance entre les deux m'échappe totalement, je ne scripte que très peu et n'ai aucune formation en Poo.
J'ai lu pas mal de cours VBS sur le net, aucun ne m'a parru clair.
Alors je script, je me plante beaucoup et peu à peu je comprend vaguement comment ça se passe.
Cependant mon problème ne me semble pas anecdotique, il arrive fréquement qu'on doive manipuler les propriétés d'un objet sans nécessairement en connaitre la liste exhaustive.
Par exemple, pour un objet "fichier", si on accède à ses propriétés on ne trouvera pas la même chose si on a un fichier "texte", une image, un mp3... il se peut qu'on veuille simplement afficher ces propriétés, pour cela il doit bien y avoir une technique permettant d'extraire la liste des propriétés liées à cet objet.
Set objClass = GetObject(objUser.Schema) |
me parrait aller dans ce sens : on prend un objet, on en récuppère le schéma et cela nous donne la "classe". Or si ma mémoire est bonne, la classe définit la structure de l'objet, donc d'une certaine manière l'ensemble des propriétés.
J'ai le sentiment qu'il n'y a alors plus grand chose à faire pour lire ce schéma et en déduire ce que je cherche.
A moins que je ne me fourvoie totalement
Marsh Posté le 06-07-2007 à 12:44:47
tegu a écrit : « il y a une propriété "properties_" qui a l'air de faire à peu près ça ». En fait tout est dans la partie en gras |
Le problème c'est que j'ai encore du mal à distinguer "collection" et "array"...
Recuppérer la collection .properties_ ne génère pas d'erreur, mais je ne sais pas comment ensuite faire simplement afficher tout le contenu de la collection (sans chercher à faire de tri, c'est juste pour voir :
)
Le "scriptomatic.hta" de microsoft a l'air de faire cela :
Ouvrez le .HTA pour voir comment c'est fait et dites moi si vous pensez que cette approche est utilisable pour toute "class", tout "object", etc, ou si ça me marche que pour certain et pas dans d'autres...
Votre avis sur le sujet m'intéresse beaucoup
Marsh Posté le 06-07-2007 à 13:14:41
Une collection est un objet ; donc elle a ses méthodes et propriétés pour permettre une gestion correcte.
La variable objet peut être = Nothing
Mais surtout tu peux énumérer ses items dans une boucle For... Each sans avoir à gérer d'indice. C'est ça que fait ton code.
Dans ta question plus haut, la syntaxe « objClass.MandatoryProperties.objProperty » est incohérente parce que tu mélanges de la grammaire VBA/Objet avec des variables objet.
objClass est un objet dont tu veux exploiter les méthodes et propriétés : ok
MandatoryProperties est un objet collection de l'objet objClass
objProperty n'est ni une propriété, ni une collection, ni une méthode de
MandatoryProperties et ne peut pas être exploité comme tu l'écris.
Normalement si tu veux récupérer la propriété « Name » de ta collection MandatoryProperties, il faut utiliser la syntaxe MandatoryProperties("Name" ) qui devrait renvoyer un objet que tu peux stocker dans objProperty :
Set objProperty = objClass.MandatoryProperties("Name" )
Ou alors tu fais une boucle sur toutes le propriétés et tu testes, pour chacune, son nom ; quand tu tiens celle qui porte le nom que tu veux tu déclenches un traitement.
ATTENTION, je te parle de principes généraux qui ne s'appliquent peut-être pas dans ton cas ici ; je ne connais pas ce contexte et la syntaxe MandatoryProperties("Name" ) ne fonctionne pas pour tous les objets (cf. ce que j'ai dit précédemment).
Je ne sais pas si ça va t'aider
Marsh Posté le 04-10-2007 à 18:40:46
UP, parce que le problème est toujours d'actualité :
comment accèder aux propriété "TERMINAL SERVER" d'utilisateurs d'un domaine NT4.0...
???
Marsh Posté le 11-05-2007 à 00:17:19
Salut à tous...
Je suis confronté à un petit problème :
Je dois de temps en temps coder de petits scripts VBS. De temps en temps mais pas souvent, je ne suis pas programmeur mais admin système. Donc je n'ai pas d'automatismes en la matière, ce qui fait que je perd beaucoup de temps à simplement trouver (ou retrouver) les méthodes et les propriétés des objets que j'utilise.
Y a-t-il un moyen de connaitre pour un objet donné la liste des méthodes/propriétés disponibles ???
---------------
Mieux vaut fermer sa gueule et passer pour un con, plutot que de l'ouvrir, et montrer qu'on l'est...