VBS et Active Directory

cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007 - 15 mai 2007 à 09:41
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007 - 5 juin 2007 à 09:41
Bonjour, voici mon problème
 
J'ai un soft qui me crée automatiquement mes comptes Users dans le CN=Users par défaut (et pas moyen de modifier ce soft...).
Le soft est installé sur les postes clients et lorsqu'un user se connecte (va sur le serveur ldap-> vérifie login/pwd -> créér ce compte dans l'AD)
Voulant appliquer des GPOs assez restrictives pour mes utilisateurs, je dois les appliquer sur des OUs.
Je viens de trouver un bout de script pour déplacer un compte utilisateur vers une OU (Microsoft)
Cela marche manuellement sur mon serveur de test :  




Set objOU = GetObject("LDAP://ou=user-test,ou=TEST,dc=dom2000,dc=local" )
 
objOU.MoveHere _
    "LDAP://cn=toto,cn=users,dc=dom2000,dc=local", vbNullString
Ma question est la suivante :
N'étant pas un spécialiste du scripting ou de la prog en général, comment faire pour récupérer automatiquement mes comptes qui sont créés automatiquement dans le conteneur 'Users' et les déplacer automatiquement vers une OU désirée.
Certainement une histoire de boucle dès qu'un nouvel User est créé ???
Sachant que le script ci-dessus marche bien mais en manuel, or mon problème le soft va chercher dans l'annuaire LDAP du taf (25000comptes) hors de question de les déplacer à la main. 
 
J'espère avoir clairement expliquer mon problème.
Merci par avance

16 réponses

cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
18 mai 2007 à 08:50
J'ai réussi pour l'instant à modifier le script comme suivant :

Set objConfiguration = GetObject("[ldap://ou=TEST,dc=dom2000,dc=local LDAP://ou=TEST,dc=dom2000,dc=local]") 
objConfiguration.Filter= Array("user")


Do
For Each objUser in objConfiguration 
     If objUser.cn="toto5" Then


      Else


Set objOU = GetObject("[ldap://ou=user-test,ou=TEST,dc=dom2000,dc=local LDAP://ou=user-test,ou=TEST,dc=dom2000,dc=local]")
objOU.MoveHere _
    "[ldap://cn LDAP://cn]=" & objUser.cn & ",ou=TEST,dc=dom2000,dc=local", vbNullString


      End If
Next
Loop

Mon script quand je le lance, marche c'est à dire que mes comptes User changent automatiquement d'OU, mais celà ne marche que pour des utilisateurs déjà créés.
Une nouvelle personne qui se créé dans l'AD aura un message d'erreur et bougera finalement quand même dans la bonne OU mais avec un compte désactivé par défaut.

2 problèmes se posent, n'étant pas spécialiste en programmation, on m'a dit qu'il fallait éviter de faire un Do ... Loop (ok mais quoi faire à la place ???)
Si je lances mon script en permanence, le serveur monte à 80% en ressources utilisées, si je lances mon script via une tâche planifiée, je ne peux pas descendre en dessous de la minute pour répéter mon script.....

Donc, je pensais plutôt à lancer le script dès qu'il y a un changement dans l'AD (création d'un compte User).... serait-ce du WMI ???
Si qq peut m'aider là dessus (au niveau de la gestion d'évenement), merci encore.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 mai 2007 à 09:05
Bonjour;

je ne sais pas l'écrire en VBS, mais ce devrait être l'équivalent de quelque chose comme ce qui suit, pour toutes 2es 5 secondes  :

Private Sub Command1_Click()
 depart = Timer
 Do
  If Timer > depart + 5 Then
    MsgBox "j'exécute mes instructions"
    depart = Timer
  End If
 Loop
End Sub
Si tu n'as pas de fonction Timer avec VBS, tu peux utiliser l'heure elle-même (Time, Now...)
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 mai 2007 à 09:18
avec Time (si tu l'as) et Dateadd (si tu l'as), ce serait :

Private Sub Command1_Click()
 depart = Time
 Do
  If Time > DateAdd("s", 5, depart) Then
    MsgBox "oui"
    depart = Time
  End If
 Loop
End Sub

Bref, tu peux utiliser tout ce que VBS t'offre pour vois si 5 secondes se sont écoulées
0
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
18 mai 2007 à 13:42
Oui en vbs les 2 fonctions Time() et Dateadd() éxistent aussi.
DateAdd([ interval], [ number], [ date])

Par contre, quand je lance ta fonction :
depart = Time
 Do
  If Time > DateAdd("s", 5, depart) Then
    (ma fonction à moi)
    depart = Time
  End If
 Loop

J'ai un problème, dans l'ajout de mes utilisateurs nouveaux.
Message d'erreurs (malgrès le déplacement et la désactivation du compte)
Le message d'erreur vient du fait que le script tourne en permanence...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 mai 2007 à 13:47
Je sais...
Mais il s'agit là d'un problème différent de celui du rythme à donner à l'exécution d'instructions (je n'ai réponsu qu'en ce qui concerne cet aspect de cadence pour libérer ton processeur)
0
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
18 mai 2007 à 13:53
J'obtiens qqchose de correct en faisant ceci :

depart = Time
Set objConfiguration = GetObject("[ldap://ou=TEST,dc=dom2000,dc=local LDAP://ou=TEST,dc=dom2000,dc=local]")
 
objConfiguration.Filter= Array("user")


Do
If Time > DateAdd("s", 5, depart) Then
For Each objUser in objConfiguration  
  If objUser.cn="toto5" Then
  Else


Set objOU = GetObject("[ldap://ou=user-test,ou=TEST,dc=dom2000,dc=local LDAP://ou=user-test,ou=TEST,dc=dom2000,dc=local]")
objOU.MoveHere _
    "[ldap://cn LDAP://cn]=" & objUser.cn & ",ou=TEST,dc=dom2000,dc=local", vbNullString


 End If
Next


depart = Time
End If
Loop

Je te remercie encore pour la fonction Time (les nouveaux utilisateurs sont bien déplacés automatiquement sans bug)
Mais malheureusement le script est executé en permance en lançant un exe sur le serveur windows (cscript.exe) et le processeur tourne à 100%

Donc, il faut que je me tourne vers une autre solution ...
0
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
22 mai 2007 à 11:05
En continuant à chercher; je vois que mon problème est plus compliqué que prévu, il fait appel à du VBS et du WMI :

premier script qui permet de bouger les Users d'un conteneur à un autre :

-------------------------------------------------------------------------
Set objConfiguration = GetObject _
  ("[ldap://cn=Users,dc=dom2000,dc=local LDAP://cn=Users,dc=dom2000,dc=local]")
 
objConfiguration.Filter= Array("user")
For Each objUser in objConfiguration
 
 If objUser.cn="Administrateur" Then


 ElseIf objUser.cn="Invité" Then
 ElseIf objUser.cn="krbtgt" Then
 ElseIf objUser.cn="IUSR_SERVTEST" Then
 ElseIf objUser.cn="IWAM_SERVTEST" Then
 ElseIf objUser.cn="TsInternetUser" Then


 Else


Set objOU = GetObject("[ldap://ou=user-test,ou=TEST,dc=dom2000,dc=local LDAP://ou=user-test,ou=TEST,dc=dom2000,dc=local]")
objOU.MoveHere _
    "[ldap://cn LDAP://cn]=" & objUser.cn & ",cn=Users,dc=dom2000,dc=local", vbNullString


  End If


Next
----------------------------------------

et le second script qui analyse l'observateur d'événement ('sécurité') à la recherche d'une création de compte :

-------------------------------------
' CAPTURE données de l'Observateur d'évènements : requête WQL
TComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Security)}!\" & TComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * FROM Win32_NTLogEvent WHERE Logfile = 'Security'")




For Each objEvent in colLoggedEvents ' -> Parcourt les objEvent de la collection
 If objEvent.EventIdentifier = "624" Then
'Wscript.Echo "EventIdentifier: " & objEvent.EventIdentifier


Set WSHShell = CreateObject("WScript.Shell")
WSHShell.Run "cscript c:\scripts\moveuser.vbs"


 End If
Next
----------------------------------------------------

Donc dans ce script dès qu'il détecte une création de compte , il lance le premier script qui bouge mes Users.
Or si je lance ce script en permanence le processeur monte à 100%.
Connaissez-vous un peu WMI et la détection d'événement ? Qui lancerait un script suite à un événement détecté ????

Merci par avance
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
27 mai 2007 à 20:57
 Bonsoir à tous

L'exemple, ci-dessous,  permet de surveiller un process.

'script de notification d'évènements
'
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:" &_
 "{impersonationLevel=impersonate}!" &_
 "\" & strComputer & "\root\cimv2")

Set objEventSource = objSWbemServices.ExecNotificationQuery( _
 "SELECT * FROM __InstanceOperationEvent " &_
 "WITHIN 1 " &_
 "WHERE TargetInstance " &_
 "ISA 'Win32_Process' " &_
 "AND TargetInstance.Name = 'calc.exe'")

Set objShell = WScript.CreateObject("WScript.Shell")

Set objEventObject = objEventSource.NextEvent()
Select Case objEventObject.Path_.Class
 Case "__InstanceCreationEvent"
 Wscript.Echo "An instance of calc.exe was just started."
 Case "__InstanceDeletionEvent"
 Wscript.Echo "An instance of calc.exe was just stopped."
 Case "__InstanceModificationEvent"
 Wscript.Echo "An instance of calc.exe was just modified."
 'objShell.AppActivate "objEventObject"
End Select

Set objSWbemServices = Nothing
Set objEventSource = Nothing
Set objEventObject = Nothing

Set objShell = Nothing
WScript.Echo "script terminé"

within  = fréquence du lancement de la requête en secondes

jean-marc
0
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
31 mai 2007 à 16:22
JMO je te remercie pour ton aide.


Mais je veux surveiller plutôt un événement dans le Gestionnaire d'événements de Windows pas un process.


En cherchant un peu plus, j'en suis là :


----------------------------------------------------------------------------------------


' CAPTURE données de l'Observateur d'évènements : requête WQL
strComputer = "."


Set objWMIService = GetObject("winmgmts:{(Security)}\" & strComputer & "\root\cimv2")


Set colMonitoredEvents objWMIService.ExecNotificationQuery("Select * from __InstanceCreationEvent Where " & "TargetInstance ISA 'Win32_NTLogEvent' " & "and TargetInstance.EventCode '624' ")


Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    ' Wscript.Echo objLatestEvent.TargetInstance.User
    ' Wscript.Echo objLatestEvent.TargetInstance.TimeWritten
    ' Wscript.Echo objLatestEvent.TargetInstance.Message
    ' Wscript.Echo
   
Set WSHShell = CreateObject("WScript.Shell")
WSHShell.Run "cscript c:\scripts\moveuser.vbs"


Loop


----------------------------------------------------------------------------------------


Ce qui est bizarre, c'est que mon script fonctionnait la semaine dernière. Mais depuis que j'ai redémarré le serveur de test (que ce soit en automatique ou lançer à la main) le script ne veux plus rien savoir, en gros il ne rentre jamais ds la boucle du Do...Loop puisqu'il ne me lance pas mon autre script !!!
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
31 mai 2007 à 16:52
 Bonjour à tous

La synthaxe de ta boucle me semble suspecte (où est la condition ???):

Répète un bloc d'instructions tant qu'une condition est True ou
jusqu'à ce qu'une condition devienne True.

Do [{While | Until} [ condition]]
   [[ statements]]
   [ExitDo]
   [[ statements]]
Loop

Vous pouvez aussi utiliser la syntaxe suivante :

Do
   [[ statements]]
   [ExitDo]
   [[ statements]]
Loop [{While | Until} [ condition]]

jean-marc
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
31 mai 2007 à 18:18
Re,

Désolé [auteurdetail.aspx?ID=1061960 helpme51] , la boucle est correcte. L'erreur est dans la query.

jean-marc
0
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
31 mai 2007 à 18:43
Cad dans ma requête ???

Car le script trouvez sur le site de Microsoft

http://www.microsoft.com/technet/scriptcenter/resources/qanda/aug05/hey0816.mspx

Donc je ne comprends pas trop.
Le nombre '624' correspond à la détection de l'événement création user.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
31 mai 2007 à 19:34
Re,

Je suis entrain de regarder mes scripts concernant la logevent
+ google ExecNotificationQuery.

Ci-dessous testé at home ça fonctionne (très peu de cpu):

strComputer = "."
Set objWMIService = GetObject("winmgmts:{(Security)}\" & strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * from __InstanceCreationEvent Where " & "TargetInstance ISA 'Win32_NTLogEvent' " &_
"and TargetInstance.EventCode = '20159' ")
'
' 20159 = numéro d'évenement généré à ma déconnexion réseau (activée manuellement pour tester)
'
Do
  MsgBox "test entrée boucle - le script va attendre l'évenement"
  Set objLatestEvent = colMonitoredEvents.NextEvent
  Msgbox objLatestEvent.TargetInstance.Message
  Set WSHShell = CreateObject("WScript.Shell")
  WSHShell.Run "D:\Mes_scripts_VBFrance\JMO.vbs" 'contient un msgbox
Loop

jean-marc
0
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
4 juin 2007 à 16:34
Bonjour JMO,
En effet, le script ne 'marche plus' , depuis le reboot de mon serveur de test.
Quand je lances le script, grâce au messagebox, je vois qu'on rentre bien ds la boucle (Do...Loop). Mais dès qu'un utilisateur se loggue, l'événement 624 (création d'user) ne semble plus être détecter, et donc le compte nvellement créer n'est pas déplacé automatiquement vers l'OU désiré grâce à l'appel du second script (voir msg précédent).

Je vois plus trop quoi tester ou vérifier ?


 
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
4 juin 2007 à 17:42
 Bonjour,

Je viens de tester les 2 scripts ci-dessous:
'___________________________________________
'1er script
strComputer = "."
Set objWMIService = GetObject("winmgmts:{(Security)}\" & strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * from __InstanceCreationEvent Where " & "TargetInstance ISA 'Win32_NTLogEvent' " &_
"and TargetInstance.EventCode = '0' ")
'
' 0 = numéro d'évenement généré par l'activation du 2ème script
'
Dim cpt : cpt=1
Do
  MsgBox "test entrée boucle - le script va attendre l'évenement",,"Boucle n° " & cpt
  Set objLatestEvent = colMonitoredEvents.NextEvent
  Msgbox objLatestEvent.TargetInstance.Message
  cpt=cpt+1
Loop
Set objWMIService = Nothing
Set colMonitoredEvents = Nothing
Set objLatestEvent = Nothing
'___________________________________________
'2ème script
'Ecriture dans le journal d'évènement LogEvent Application
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.LogEvent 0, "test_helpme51" &vbTab& Now
Set WshShell = Nothing
'___________________________________________
1) Activation du 1er script, donc du msgbox "Boucle n°1"
2) Activation du 2ème script, donc du msgbox "test_helpme51" &vbTab& Now
(message qui va être écrit dans la LogEvent - Application)
+ msgbox "Boucle n°2"

jean-marc
0
cs_helpme51 Messages postés 9 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 5 juin 2007
5 juin 2007 à 09:41
Tjrs moi,
J'ai vu sur 2 liens
http://groups.google.com/group/microsoft.public.wbem/browse_thread/thread/4f569781ec68af5c'hl=en&lr=&ie=UTF-8&oe=UTF-8&frame=right&seekm=%23bks5W5NAHA.282%40cppssbbsa02.microsoft.com

http://techsupt.winbatch.com/TS/T000001002F12.html

Une histoire de droit au niveau des eventlogs (sous win2k)

objService.Security_.Privileges.AddAsString("SeSecurityPrivilege")

Je ne sais pas trop comment modifier mon script pour inclure cette commande ?
0
Rejoignez-nous