[Résolu]Python & Active Directory : groupes d'un utilisa

skaiffer
[Résolu]Python & Active Directory : groupes d'un utilisa

Bonjour,

J'esayes de récupérer les groupes d'un utilisteur :

************************************************************
import win32com.client
user ="username"
domain = "domain"
objOU = win32com.client.GetObject("WinNT://" + domain + "/" + user + ",user")

for grp in objOU.Groups:
print grp.Name

************************************************************
Ce script me génère une erreur : "TypeError: iteration over non-sequence"

Quand j'utilise un objet folder, l'iterration sur subfolder fonctionne correctembnt.

Le même script en vbs fontionne.

************************************************************
user ="username"
domain = "domain"
Set objOU = GetObject("WinNT://" & domain & "/" & user & ",user")

For Each grp In objOU.Groups
WScript.Echo grp.Name
Next
************************************************************

Pareil en Perl, pas de soucis.

Je suis débutant en Python et je n'ai pas trop d'idées sur le problème.
Je travilles avec une distrib ActivePython mais j'ai essayé avec la distrib de Python.org & PyWin32, sans resultat.

Cordialement

fredericmazue

Il y a erreur dans ton script et deux remarques supplémentaires à faire. Surtout dues au fait qu'apprendre Python en même que de faire du COM sour Windows est assez particulier.
Voici le script corrigé

# -*- coding: iso-8859-1 *-*

import win32com.client 
user ="username" 
domain = "domain" 

objOU = win32com.client.GetObject("WinNT://" + domain + "/" + user + ",user") 


for grp in objOU.Groups(): 
    print grp.Name.encode('iso-8859-1', 'ignore') 

Première ligne.
Si tu utilises un Python 2.4 ou plus, il est sage (Windows COM ou pas) de spécifier un encodage de caractères, surtout si tu dois récupérer des chaînes de quelque part, sans savoir à l'avance ce qu'elles contiennent (et c'est le cas ici justement).
Mais ceci ne concernait pas ton erreur.

En ce qui concerne ton erreur, tu as écrit:

for grp in objOU.Groups

La subtilité est que objOU.Groups est une interface COM/Automation là. Ce n'est donc pas une liste de chaînes comme tu le pensais. Pas une liste, donc pas une séquence, donc tu peux pas itérer dedans, d'où ton message d'erreur.
Python fait une différence entre une méthode, une fonction et l'appel de la fonction ou de la méthode. L'intérêt est qu'ainsi tu peux passer des fonctions à d'autres fonctions sans les appeler, bref faire de la programmation fonctionnelle avec Python. Pour appeler une fonction (et ici la méthode de l'interface COM, ça revient au même) faut le demander. Donc:
for grp in objOU.Groups()

Enfin, j'ai ajouté un appel à encode pour les chaînes à imprimer. Si ça se trouve il n'y a pas besoin. Mais *attention* tu fais du COM, donc le système (Windows) retourne ce qu'il veut (unicode, ascii, etc) sans te demander ton avis. Dans cette situation, avec l'appel à encode tu es tranquille quoi qu'il arrive.

Bon Python :D (Un de mes langages favoris)

skaiffer
Python & Active Directory : groupes d'un utilisateur

Cela fonctionne, merci beaucoup.

Etant admin poste de travail sous windows, je ne peux pas me passer des objects COM.

Merci bien pour la réactivité, c'est impressionnant !