[Résolu][Scripting]Ouverture de session/Mappage selon groupes

Ouverture de session/Mappage selon groupes [Résolu][Scripting] - VB/VBA/VBS - Programmation

Marsh Posté le 02-03-2007 à 11:59:30    

Bijour tout le monde,
 
Je suis en stage de BTS info reseau actuellement et j'aurais besoin de conseils/aide pour mon projet parce que j'avoue ramer un ti peu en ce moment :p
 
Le sujet est simple : Refonte du systeme d'ouverture de session Active directory.
 
Actuellement, quand un utilisateur se connecte, un .bat s'execute et utilise la fonction Ifmember pour trouver a quel groupe appartient l'utilisateur et donc quel lecteur il faut lui mapper
 
Le probleme aujourd'hui est qu'il y a 135 groupes ayant besoin d'un mapping de lecteur et environ 2500 utilisateurs (1connexion = 135 tests, *2500 => 337500 test si tous les utilisateurs se connectent) soit trop d'appel au serveur pour une connexions et donc des ouverture longue pour les utilisateur loin du serveur.
 
On ne gère pas les users via UO (donc on peut avoir dans une UO, des utilisateurs ayant besoin de lecteurs different).
 
Le script utilisé est du type:
 
Code:
 
    %LOGONSERVER%\Netlogon\ifmember <Groupe1> <Groupe2> <Groupe...n>  
  if not errorlevel 1 goto users
  --------------------------------------------------------------------------------------
  le reste s'exécute si l’utilisateur fait partie du groupe sinon passe à la section d'après
  --------------------------------------------------------------------------------------
  call %LOGONSERVER%\Netlogon\groupes\<NomDuFichier.bat>
 
Mon idée serait de ne faire qu'un seul appel au serveur pour recuperer tout les groupes de l'utilisateur et ensuite boucler dans un script pour effectuer les tests sur ces groupes et mapper les lecteurs (le but est de minimiser les appels au serveur, 1 etant le nec plus ultra :p )
 
Ceci dit le scripting et moi ca fait 2 (ou +), je pensais recuperer les groupes dans un tableau puis effectuer les test dessus
 
Vala vala, si vous avez des suggestions je suis preneur :] Google est trop fatigué pour m'aider ^^ Merci.
 
Ps: je sais pas si il fallait le mettre dans la partie reseau ou ici :O ^^


Message édité par Madoo le 08-03-2007 à 16:41:51
Reply

Marsh Posté le 02-03-2007 à 11:59:30   

Reply

Marsh Posté le 02-03-2007 à 14:05:49    

Je ne m'y connais pas en scripting, mais comme je vais avoir un peu la même problématique d'ici peu, je vais participier ^^.
 
deja, le script que tu lances, tu le lances depuis le poste où l'utilisateur se connecte, et non pas depuis le serveur. Donc ton script doit prendre en compte des infos du style %USERNAME% donc via active directory tu dois pouvoir identifier direct le groupe auquel il appartient et non pas un test if if if...
Au pire, l'équivalent d'un switch case devrait aller plus vite...
 
Non ?

Reply

Marsh Posté le 02-03-2007 à 14:23:42    

La partie de code postée est celle utilisé depuis quelques années et marche parfaitement ^^ seul soucis c'est que son execution devient lourde au fil du temps.

 

En gros il faut que je lui redonne un 'ti coup de jeune :)

 

J'ai trouvé ca sur le fofo sinon qui répond en partie a ma question :) http://forum.hardware.fr/hfr/Windo [...] 8738_1.htm


Message édité par Madoo le 02-03-2007 à 14:24:53
Reply

Marsh Posté le 06-03-2007 à 08:41:34    

j'ai  3 question:
 
1) tu as un serveur AD?
2)tu connais son nom?
3)tu as les autorisation pour fair des modifs?
si c'est oui pour les 3 question alors
      je vais te proposer un petit script que j'utilise a ma boite
       mais si tu veux presenter sa au pti c'est pas le top
sinon bas je peut pas faire grand chose perso

Reply

Marsh Posté le 06-03-2007 à 11:31:38    

Y a un serveur AD, je connais son nom :) et possibilité aussi de faire les modifs si le script est jugé adapté par mon maitre de stage je pense (on le testera avant de toute façon ^^)
 
Ceci dit le script en lui meme que j'ai recuperé semble bon, je me connecte a la base, je recupere une liste des groupes de l'utilisateurs et j'effectue les tests en bouclant dans le script.
 
Le but 1er est atteint => 1 seul appel au serveur par connexion d'un utilisateur.
 
Sinon ca sera ma soutenance de projet ^^ et je dois aussi developper une petite application permettant au service DOI (direction de l'organisation et de l'informatique) de créer de nouveau scripts, modifer ou supprimer des scripts existant (un peu à la scriptomatic) et tournant avec une base de données pour des opérations de reporting (liens entre users-AD, groupes, lecteurs reseaux utilisés, etc...)
 
Vala vala :)

Reply

Marsh Posté le 06-03-2007 à 12:04:08    

whou que du bonheur
 
sinon j'avais sa a te proposer:
 
' ****************************
' * Récupération de variable *
' ****************************
Set WSHShell = WScript.CreateObject("WScript.Shell" )
Set WshNetwork = WScript.CreateObject("WScript.Network" )
Set WshSysEnv = WshShell.Environment("Volatile" )
server = WshSysEnv("LOGONSERVER" )
 
 
' ****************************
' * Définition des variables *
' ****************************
 
User = wshNetwork.UserName
Domain = wshNetwork.userdomain
Computer = wshNetwork.ComputerName
serveurAD = ("NomDuServeur" )
 
 
'*******************************************************************
'* Etablie les requête LDAP auprès du serveurAD pour récupérer les *
'*  paramètres sur l'utilisateur et l'odinateur      *
'*******************************************************************
 
Dim strSearchPath, strCriteria, strProperties,strScope, objConnect, objCommand, objRecordset, reg
 
 'connection au serveur AD
Set objConnect = CreateObject("ADODB.Connection" )
Set objCommand = CreateObject("ADODB.Command" )
objConnect.Provider = "ADsDSOObject"
objConnect.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnect
objCommand.Properties("Page Size" ) = 100000
objCommand.Properties("Timeout" ) = 300000 'seconds
 
 'recherche dans le domaine fr
strSearchPath = "<LDAP://" & serveurAD & "/DC=Les param du domaine>"
 'recherche dans les sous-conteneurs
strScope = "subTree"
 
 '*********** Recherche la ville et le service de l'utilisateur dans AD ***********
 '*********** Onglet ADDRESS champ: l (ville)
 '*********** Onglet ORGANISATION champ: department (service) ***********
 
 'recherche l'objet correspondant à l'utilisateur
 'objet de category person, de class user
 'attribut userprincipalname : xxxxx@fr.com
strCriteria = "(&(objectCategory=person)(objectClass=user)(userPrincipalName=" & User & "*))"
 
 'récupère les attributs l et department au niveau de l'ad
strProperties = "l, department, displayname, physicaldeliveryofficename"
 
 'Défini la requête
objCommand.CommandText  = strSearchPath & ";" & strCriteria & ";" & strProperties & ";" & strScope
 
 'lance la requête et récupère le résultat
Set objRecordset = objCommand.Execute
 'on se positionne sur le premier objet trouvé (qui est normalement le seul renvoyé)
objRecordset.MoveFirst
 'récupère l'attribut l, et l'enregistre dans la variable ville
ville = objRecordset.Fields("l" ).Value
 'récupère l'attribut department, et l'enregistre dans la variable Department
Department = objRecordset.Fields("department" ).Value
 'récupère l'attribut dsiplayname, et l'enregistre dans la variable displayname
displayname = objRecordset.Fields("displayname" ).Value
 'récupère l'attribut physicaldeliveryofficename, et l'enregistre dans la variable physicaldeliveryofficename
physicaldeliveryofficename = objRecordset.Fields("physicaldeliveryofficename" ).Value
 
Ensuite tu fais un case
selon la ville tu peut mettre les lecteur commun (ceux dont tous les users doivent avoir accès)
ensuite dans le département par exemple les lecteurs spécifiques qui s'ajoute au standard
 
ps : avec un bonne éditeur de script c'est plus parlant
 t'es en deuxieme année?


Message édité par le_relou le 06-03-2007 à 12:05:35
Reply

Marsh Posté le 06-03-2007 à 14:36:04    

Intérressant comme script :)
 
Mes mappages lecteurs se font par rapport au groupes de l'utilisateurs, il faut que je vois ce que ca peut donner en le modifiant :]
 
Actuellement je pars la dessus :  
 
' VBScript source code
Dim objRootLDAP, objGroup, objUser, objOU, objmemberOf
Dim strOU, strUser, strDNSDomain, strLDAP, List, objADSysInfo,arr,intlength,intNamelength,strGroupName
 
' Commands to bind to AD
Set objRootLDAP = GetObject("LDAP://RootDSE" )
Set objNetwork = CreateObject("Wscript.Network" )
 
'trouver le DN de l'utilisateur
Set objADSysInfo = CreateObject("ADSystemInfo" )
strUser = objADSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUser)
   

' Extract a list of Groups
Function getgroup()
Const E_ADS_PROPERTY_NOT_FOUND  = &h8000500D
Set objSysInfo = CreateObject("ADSystemInfo" )
MaxArgs = 50
ReDim ArgArray(MaxArgs)
strUserPath = "LDAP://" & objSysInfo.UserName
Set objUser = GetObject(strUserPath)
objmemberOf  = objUser.GetEx("memberOf" )
        If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then
                Wscript.Echo "Aucun groupes"
        Else
Dim i
i = 0
        For Each objGroup in objmemberOf
                objGroup = Mid(objGroup, 4, 330)
                arrGroup = Split(objGroup, "," )
               ' strList = strList & arrGroup(0) & vbcr
                ArgArray(i) = arrGroup(0)
                i = i + 1
        Next
i = i - 1
ReDim Preserve ArgArray(i)
getgroup = ArgArray
End If
End Function

 
'Connecter un lecteur en fonction du groupe
Select Case strGroupName
        Case "Grpname"  'changer grpname par nom du groupe
            objNetwork.MapNetworkDrive "X:", "\\Serveur\Partage"
         
End Select
WScript.Quit

 
La partie rouge est a adaptée (pas eu le temps encore ^^) :)
 
Sinon oue je suis en 2eme année de BTS ig (arle) et on a vu 0 scripts en cours donc c'est pô facile :p
 
Marfi de l'aide ^^ ,)

Reply

Marsh Posté le 07-03-2007 à 09:23:28    

utilise un msgbox("" ) plutot qu'un Wscript.Echo
un conseille pense a detruir les lecteur reseau avant de les remapper sinon tu risque d'avoir des PB
 
WshShell.RegDelete "HKEY_CURRENT_USER\Network\E\"
WshShell.RegDelete "HKEY_CURRENT_USER\Network\F\"
WshShell.RegDelete "HKEY_CURRENT_USER\Network\G\"

 
 
 
Pourquoi tu met ton code dans une fonction? Alors que tu y passe qu'une fois et forcement une
vu que tu fais des test.
As tu tester la partie en rouge? Avec un msgbox tu mets ton   ArgArray(i) ou arrGroup(0) dans la boucle pour savoir  
ce que tu récupérer
 
 
PS: moi aussi je suis en 2eme année ig mais en alternance et DEV dans une boite ou je fais + du réseaux donc je sais que c'est pas facile
 
 
 

Reply

Marsh Posté le 07-03-2007 à 12:08:18    

Hop la, vala le script retravaillé, il fonctionne (me mappe mes deux lecteur reseau ^^)
 
' VBScript source code
        Dim objRootLDAP, objGroup, objUser, objOU, objmemberOf, objNetwork, objSysInfo
        Dim strOU, strUser, strDNSDomain, strLDAP, List, objADSysInfo, arr, intlength, intNamelength, strGroupName, strUserPath
        Dim grp(50)
        Dim arrgroup(50)  
        Dim getgroup
        Dim i As Integer
        Dim j As Integer
 
 
        ' Commands to bind to AD
        objRootLDAP = GetObject("LDAP://RootDSE" )
        objNetwork = CreateObject("Wscript.Network" )
 
        'trouver le DN de l'utilisateur
        objADSysInfo = CreateObject("ADSystemInfo" )
        strUser = objADSysInfo.UserName
        objUser = GetObject("LDAP://" & strUser)
 
        'Recup liste grp
        Const E_ADS_PROPERTY_NOT_FOUND = &H8000500D
        objSysInfo = CreateObject("ADSystemInfo" )
        strUserPath = "LDAP://" & objSysInfo.UserName
        objUser = GetObject(strUserPath)
        objmemberOf = objUser.GetEx("memberOf" )
        If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then
            MsgBox("Aucun groupes" )
        Else
 
            i = 0
            For Each objGroup In objmemberOf
                objGroup = Mid(objGroup, 4, 330)
                arrGroup = Split(objGroup, "," )
                ' strList = strList & arrGroup(0) & vbcr
                grp(i) = arrgroup(0)
                'MsgBox grp(i)
                i = i + 1
            Next
            i = i - 1
            ReDim Preserve grp(i)
            getgroup = grp
        End If
 
        'Connecter un lecteur en fonction du groupe.
        For j = LBound(getgroup) To UBound(getgroup)
            Select Case getgroup(j)
                Case "MAIRIE"  'changer grpname par nom du groupe
                    objNetwork = CreateObject("Wscript.Network" )
                    objNetwork.MapNetworkDrive("X:", "\\server\bleh\blah" )
 
                Case "Smtp_Internet"  'changer grpname par nom du groupe
                    objNetwork = CreateObject("Wscript.Network" )
                    objNetwork.MapNetworkDrive("Z:", "\\server\bleh" )
            End Select
        Next

 
Plus qu'a ajouter l'unmapping (ca se dit ? :p) des lecteurs au cas ou :o

Reply

Marsh Posté le 07-03-2007 à 12:13:49    

pour tous les users de ta boite tu na que 2lecteur reseau?
dans c'est cas la y a mieux
 

Reply

Marsh Posté le 07-03-2007 à 12:13:49   

Reply

Marsh Posté le 07-03-2007 à 12:23:35    

Lol nan, la c'est juste pour tester si ca marche :p  
 
de toute au max on peut mapper 26 lecteurs (et encore faut enlever A, C, D direct), ya environ 600groupes, au moins 2500 partages donc ce script est un debut de solution :p (jme vois mal ecrire XXX Case blabla :/)

Reply

Marsh Posté le 07-03-2007 à 15:04:37    

pas 26 vu c est deja utilisé :)  de plus je te conseille de laisser le E et le F pour les disques USB
en gros tu fais un script qui puisse etre modifier facilement aprés c sa
 
so good luck :D

Reply

Marsh Posté le 07-03-2007 à 16:59:49    

en gros toute la partie avant le mappage sera le tronc commun et l'outil que je vais developper aura pour effet de creer le petit morceau de script mappant les lecteurs en fonction des infos d'une bdd. (interface pratique evitant de taper du code pour generer un script et permettant des actions de reporting => verifications sur de lecteurs existants etc...).
 
C'est la que la difficulté augmente :D


Message édité par Madoo le 07-03-2007 à 17:01:02
Reply

Marsh Posté le 08-03-2007 à 10:23:50    

je crois que au niveaux du script c'est resolu
jpcheck est ce que tu as suivie?
donc tu peux mettre [Resolu] dans le titre du topic
 
et bonne chance pour la suite :bounce:
 
[EDIT]Bonne chance :D


Message édité par le_relou le 08-03-2007 à 16:48:51
Reply

Marsh Posté le 08-03-2007 à 16:42:22    

Done et merci ,)

Reply

Sujets relatifs:

Leave a Replay

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