Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2949 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1522780
Madoo
Posté le 02-03-2007 à 11:59:30  profilanswer
 

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
mood
Publicité
Posté le 02-03-2007 à 11:59:30  profilanswer
 

n°1522840
jpcheck
Pioupiou
Posté le 02-03-2007 à 14:05:49  profilanswer
 

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 ?

n°1522845
Madoo
Posté le 02-03-2007 à 14:23:42  profilanswer
 

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
n°1524150
le_relou
Posté le 06-03-2007 à 08:41:34  profilanswer
 

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

n°1524238
Madoo
Posté le 06-03-2007 à 11:31:38  profilanswer
 

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

n°1524269
le_relou
Posté le 06-03-2007 à 12:04:08  profilanswer
 

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
n°1524396
Madoo
Posté le 06-03-2007 à 14:36:04  profilanswer
 

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 ^^ ,)

n°1524964
le_relou
Posté le 07-03-2007 à 09:23:28  profilanswer
 

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
 
 
 

n°1525113
Madoo
Posté le 07-03-2007 à 12:08:18  profilanswer
 

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

n°1525121
le_relou
Posté le 07-03-2007 à 12:13:49  profilanswer
 

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

mood
Publicité
Posté le 07-03-2007 à 12:13:49  profilanswer
 

n°1525129
Madoo
Posté le 07-03-2007 à 12:23:35  profilanswer
 

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 :/)

n°1525279
le_relou
Posté le 07-03-2007 à 15:04:37  profilanswer
 

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

n°1525418
Madoo
Posté le 07-03-2007 à 16:59:49  profilanswer
 

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
n°1525695
le_relou
Posté le 08-03-2007 à 10:23:50  profilanswer
 

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
n°1525939
Madoo
Posté le 08-03-2007 à 16:42:22  profilanswer
 

Done et merci ,)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[Résolu] [Oracle10g] Erreur connexion au serveur[PHP] comparaison string vs integer (résolu)
[résolu] locales ou êtes vous ?[RESOLU]Requêtes SQL ds un script...
[résolu] document.body.scrollTop renvoi toujours 0[Résolu] Créer un site dynamique rapidement et simplement
[Resolu] Tableau de byte -> float[C#][.net][RESOLU] Prob fermeture de connexion: bug .NET ?
[résolu] transfert de fichier php[Résolu] dynamic classpath et plugins
Plus de sujets relatifs à : [Résolu][Scripting]Ouverture de session/Mappage selon groupes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR