Ouverture de session/Mappage selon groupes [Résolu][Scripting] - VB/VBA/VBS - Programmation
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 ?
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
 http://forum.hardware.fr/hfr/Windo [...] 8738_1.htm
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 
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 ^^)
 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 
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?
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  
 
 
Marfi de l'aide ^^ ,)
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 
 
 
 
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 ?  ) des lecteurs au cas ou
) des lecteurs au cas ou  
 
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 
 
Marsh Posté le 07-03-2007 à 12:23:35
Lol nan, la c'est juste pour tester si ca marche  
  
 
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  (jme vois mal ecrire XXX Case blabla
 (jme vois mal ecrire XXX Case blabla  )
)
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
  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  
 
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 
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  
 
 
[EDIT]Bonne chance  
 
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
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 lutilisateur 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
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
Message édité par Madoo le 08-03-2007 à 16:41:51