Connaitre l'ensemble des méthodes d'un objet

Connaitre l'ensemble des méthodes d'un objet - VB/VBA/VBS - Programmation

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...
Reply

Marsh Posté le 11-05-2007 à 00:17:19   

Reply

Marsh Posté le 11-05-2007 à 08:37:53    

J'ai ce qu'il te faut
Va voir tes messages privés

Reply

Marsh Posté le 05-07-2007 à 15:10:25    

OK, j'ai trouvé ce script qui fait en partie ce que je demandais :
 


On Error Resume Next
strDomain = "."
Set objComputer = GetObject("WinNT://" & strDomain )
objComputer.Filter = Array( "User" )
For Each objUser In objComputer
 wscript.echo vbCrLf
 wscript.echo "treating " & objUser.Name
 Set objClass = GetObject(objUser.Schema)
 wscript.echo "Properties = " & getproperties(objClass)
 WScript.Echo "Mandatory properties for " & objUser.Name & ":"
 For Each objManproperty In objClass.MandatoryProperties
  WScript.Echo objManproperty, objUser.Get(objproperty)
 Next  
  WScript.Echo "Optional properties for " & objUser.Name & ":"
 For Each objOptProperty In objClass.OptionalProperties
  WScript.Echo objOptProperty, objUser.Get(objOptProperty)
 Next
Next


 
Ce script parcoure les objets de type "User" et affiche toutes leurs propriétés déclarées.
 
Le resultat ressemble à ça :


treating AD-Roudoudou
Class = WinNT://Blabla/Schema/User
Mandatory properties for AD-Roudoudou:
Optional properties for AD-Roudoudou:
Description Administrative account
FullName RouDouDou Jean-Claude
BadPasswordAttempts 0
HomeDirDrive
HomeDirectory
LoginHours ??????????ÿ
LoginScript
MaxPasswordAge 2592000
MaxStorage -1
MinPasswordAge 259200
MinPasswordLength 8
objectSid ?
Parameters                                                 P☺CtxCfgPresent????☺C
txCfgFlags1????☺CtxCallback????☺CtxShadow????☺CtxMaxConnectionTime????☺CtxMaxDis
connectionTime????☺CtxMaxIdleTime????☺CtxKeyboardLayout????*☻☺CtxMinEncryptionLe
vel? ☻☺CtxWorkDirectory? ☻☺CtxNWLogonServer?↑☻☺CtxWFHomeDir?"☻☺CtxWFHomeDirDrive
? ☻☺CtxWFProfilePath?"☻☺CtxInitialProgram?"☻☺CtxCallbackNumber?
PasswordAge 0
PasswordExpired 1
PasswordHistoryLength 8
PrimaryGroupID 513
Profile
UserFlags 513
RasPermissions 1
Name RouDouDou


 
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 ?


Message édité par madmartigan le 11-09-2007 à 11:11:37

---------------
Mieux vaut fermer sa gueule et passer pour un con, plutot que de l'ouvrir, et montrer qu'on l'est...
Reply

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.

Reply

Marsh Posté le 05-07-2007 à 16:28:26    

tegu a écrit :

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.


 
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)
Set objClass = objWMIService.Get(ClassesPulldown.Value)
For Each objProperty in objClass.Properties_
      If objProperty.IsArray Then
           blablabla
      Else
           blablabla
      End If
Next


 
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  :jap:


---------------
Mieux vaut fermer sa gueule et passer pour un con, plutot que de l'ouvrir, et montrer qu'on l'est...
Reply

Marsh Posté le 05-07-2007 à 16:42:33    

attention, on dirait que tu confonds objclass et objuser :non:

Reply

Marsh 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.

 

Message cité 1 fois
Message édité par tegu le 05-07-2007 à 17:37:03
Reply

Marsh Posté le 06-07-2007 à 12:32:16    

jpcheck a écrit :

attention, on dirait que tu confonds objclass et objuser :non:


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  :cry:


---------------
Mieux vaut fermer sa gueule et passer pour un con, plutot que de l'ouvrir, et montrer qu'on l'est...
Reply

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 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.


 
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 :

  • s'il y a bien quelque chose
  • comprendre un peu comment tout ça s'organise
  • voir s'il n'y a pas là dedans quelques mot-clés qui puissent me mettre sur la voie

)
 
Le "scriptomatic.hta" de microsoft a l'air de faire cela :  

  • parcourir une machine et en ressortir l'ensemble des WMI Namespaces
  • Parcourir ce Namespace et en ressortir l'ensemble des WMI Classes
  • Parcourir cette WMI Class et en ressortir l'ensemble des objects
  • Parcourir chaque objet et en ressortir l'ensemble des propriétés


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  :jap:


---------------
Mieux vaut fermer sa gueule et passer pour un con, plutot que de l'ouvrir, et montrer qu'on l'est...
Reply

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

Reply

Marsh Posté le 06-07-2007 à 13:14:41   

Reply

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...  
 
???


---------------
Mieux vaut fermer sa gueule et passer pour un con, plutot que de l'ouvrir, et montrer qu'on l'est...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed