Droits sur un répertoire

Messages postés
6
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
20 septembre 2006
-
Messages postés
5
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
11 septembre 2006
-
Bonjour

J'souhaite créer des répertoire au nom ( de connexion) de chaque utilisateur.
Mais j'ai un gros problème. J'ai bien fait le script qui me permet de créer un répertoire pour chaque utilisateur présent dans une OU de l'AD. La création fonctionne sans problème, mais, exécutant ce script en tant qu'adminsitrateur, c'est l'administrateur qui a les droits sur ces répertoires, et non chaque user.
Le problème est donc de pouvoir ajouter le droit pour chaque utilisateur d'accèder à son répertoire en R/W.
Je n'ai pas encore trouvé la solution
Si quelqu'un a des pistes...Suis preneur

Avec tous mes remerciement

Philippe

1 réponse

Messages postés
5
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
11 septembre 2006

Tiens voici un script que j'ai fait en reprenant des trucs à droite à gauche.
Il te permet de creer un user, de l'associer a un groupe par defaut et a un groupe specifique, de lui creer un repertoire perso et lui associer les droits complets pour les admins du domain et l'utilisateur.

il s'agit d'un script que j'avais utiliser dans un fichier hta, je ne t'ai copier que la partie script.
L'interet pour toi est dans les dernieres fonctions.

[ldap://RootDSE ]
'Récupération de l'environnement
set objRootDSE = getobject("[ldap://RootDSE LDAP://RootDSE]")
DomainName = objRootDSE.get("Rootdomainnamingcontext")

Set objSysInfo  =  CreateObject("ADSystemInfo")
DomainDNSName  =  objSysInfo.domainDNSName


DNSMail  = "toto.com" 'Renseigner le DNS du mail du nouvel utilisateur
DefaultPassword =  "PassWord" 'Renseigner le mot de passe par defaut qui sera associé au nouvel utilisateur


OUName   =  "Utilisateurs" 'Renseigner l'OU par defaut dans laquelle sera ajouté le nouvel utilisateur
DefaultGroup = "Toto" 'Renseigner le groupe par defaut dans lequel sera ajoute le nouvel utilisateur


AdminServer  =  "FilesServer" 'renseigner le serveur de stockage des repertoires
UsersHomeFolder = "D:\users" 'renseigner le chemin sur le serveur de stockage
DefaultShare = "Admins du domaine" 'renseigner ici un group ou utilisateur qui aura acces par defaut au repertoire (en plus de l'utilisateur)


strScript = SamAccountName & ".bat"


VerifOU(OUName)


Select Case ValidOU
Case "0"
 EraseVar
 Exit Sub
Case "1"
 main
End Select


'------
End Sub
'------


'------------
Function Main
'------------


Set dom  = GetObject("LDAP://" & ObjOU)


'saisir les infos utilisateurs
EnterUser


Select Case ValidUser
Case "0"
 MsgBox "Vous devez renseigner le LOGIN."
 EraseVar
 Exit Function
Case "1"
 ValidUser = "OK"
Case "2"
 EraseVar
 Exit Function
Case "3"
 MsgBox "Vous devez renseigner tous les champs."
 EraseVar
 Exit Function
End Select


'saisir le nom du groupe
EnterGroup


If ValidGroup <> 1 Then
 MsgBox "Vous devez sélectionner un groupe."
 EraseVar
 Exit Function
End if
 '-------------------------
 'Création de l'utilisateur
 '-------------------------
Set fso  =  CreateObject("Scripting.FileSystemObject")


Set newUsr   =  dom.Create("user", "CN=" & SamAccountName)
Set ProfileServer  =  fso.GetFolder("\" & AdminServer & "\users$") 'renseigner le répertoire racine des répertoires perso qui a été partagé sur le serveur


With newUsr
 .put "samAccountName", "" & SamAccountName
 .put "Name", "" & SamAccountName
 .put "userPrincipalName", SamAccountName & "@" & DomainDNSName
 .put "givenName", "" & FirstName
 .put "sn", "" & LastName
 .put "displayName", LastName & " " & FirstName
 .put "mail", LCase(FirstName) & "." & LCase(LastName) & "@" & DNSMail
 .put "description", "Groupe " & Right(Group, 1)
 .put "pwdLastSet", 0
 .put "scriptPath", strScript
 .setinfo
End With
With newUsr
 .setpassword DefaultPassword
 .accountdisabled  =  False
 .setinfo
End With


 '--------------------------------------------------------------------------
 'Ajouter l'utilisateur au groupe par defaut et au groupe défini en variable
 '--------------------------------------------------------------------------


Const ADS_PROPERTY_APPEND = 3


Dim objConnectionGrp, objConnectionUsr, objConnectionDefGrp, objCommandGrp, objCommandUsr, objCommandDefGrp, objRecordSetGrp, objRecordSetUsr, objRecordSetDefGrp
Dim dtStart


'Ouverture des connexions LDAP
dtStart    =  TimeValue(Now())
Set objConnectionGrp  =  CreateObject("ADODB.Connection")
Set objCommandGrp   =    CreateObject("ADODB.Command")
objConnectionGrp.Provider  =  "ADsDSOObject"
objConnectionGrp.Open "Active Directory Provider"
Set objCommandGrp.ActiveConnection = objConnectionGrp


Set objConnectionUsr   =  CreateObject("ADODB.Connection")
Set objCommandUsr   =    CreateObject("ADODB.Command")
objConnectionUsr.Provider  =  "ADsDSOObject"
objConnectionUsr.Open "Active Directory Provider"
Set objCommandUsr.ActiveConnection = objConnectionUsr


Set objConnectionDefGrp  =  CreateObject("ADODB.Connection")
Set objCommandDefGrp   =    CreateObject("ADODB.Command")
objConnectionDefGrp.Provider  =  "ADsDSOObject"
objConnectionDefGrp.Open "Active Directory Provider"
Set objCommandDefGrp.ActiveConnection = objConnectionDefGrp


objCommandGrp.CommandText =  "<LDAP://" & DomainName & ">;(&(objectCategory=group)" & "(samAccountName=" & Group & "));distinguishedName;subtree"
objCommandUsr.CommandText = "<LDAP://" & DomainName & ">;(&(objectCategory=user)" & "(samAccountName=" & SamAccountName & "));distinguishedName;subtree"
objCommandDefGrp.CommandText  =  "<LDAP://" & DomainName & ">;(&(objectCategory=group)" & "(samAccountName=" & DefaultGroup & "));distinguishedName;subtree"
 
Set objRecordSetGrp   =  objCommandGrp.Execute
Set objRecordSetUsr   =  objCommandUsr.Execute
Set objRecordSetDefGrp   =  objCommandDefGrp.Execute


 '----------------------------------
 'Ajout au groupe defini en variable
 '----------------------------------
Dim objGroup


If objRecordsetGrp.RecordCount <> 0 Then
     Set objGroup = GetObject("LDAP://" & objRecordSetGrp.Fields(0).Value)
 objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array(objRecordSetUsr.Fields(0).Value)
 objGroup.SetInfo
End If


Set objGroup  = Nothing


 '--------------------------
 'Ajout au groupe par defaut
 '--------------------------
Dim objDefaultGroup


Set objDefaultGroup = GetObject("LDAP://" & objRecordSetDefGrp.Fields(0).Value)
objDefaultGroup.PutEx ADS_PROPERTY_APPEND, "member", Array(objRecordSetUsr.Fields(0).Value)
objDefaultGroup.SetInfo


Set objDefaultGroup = Nothing


objConnectionGrp.Close
objConnectionUsr.Close
objConnectionDefGrp.Close


Set objConnectionGrp  =  Nothing
Set objConnectionUsr  =  Nothing
Set objConnectionDefGrp  =  Nothing
Set objCommandGrp   =  Nothing
Set objCommandUsr   =  Nothing
Set objCommandDefGrp   =  Nothing
Set objRecordSetGrp  =  Nothing
Set objRecordSetUsr   =  Nothing
Set objRecordSetDefGrp   =  Nothing
Set dtStart    =  Nothing


 '--------------------------------
 'Création du répertoire personnel
 '--------------------------------
If fso.FolderExists(ProfileServer & "" & SamAccountName) = False Then
  fso.CreateFolder(ProfileServer & "" & SamAccountName)
End If


 '---------------------
 'Partage du répertoire
 '---------------------
Dim FolderName, ShareName, Services, Share, ShareFolder


Const FILE_SHARE  = 0
Const MAXIMUM_CONNECTIONS = TRUE


FolderName  =  UsersHomeFolder & SamAccountName
ShareName  =  SamAccountName & "$"


Set Services  =  GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!\" & AdminServer & "\ROOT\CIMV2")
Set Share  =  Services.Get("Win32_Share")


ShareFolder = Share.Create (FolderName, ShareName, FILE_SHARE, MAXIMUM_CONNECTIONS, "")


Set FolderName   =  Nothing
Set ShareName  =  Nothing
Set Services   =  Nothing
Set Share   =  Nothing
Set ShareFolder  =  Nothing


 '-----------------------------------
 'Modification des ACLs du répertoire
 '-----------------------------------
NetbiosDomainName = split(DomainDNSName,".")
ReplaceACL ProfileServer & "" & SamAccountName,"add(" & NetbiosDomainName(0) & "" & SamAccountName & ":F)+add(" & DefaultShare & ":F)"


 '---
 'FIN
 '---


MsgBox "L'utilisateur " & FirstName & " " & Lastname & ", Matricule: " & SamAccountName & " a bien été créé."_
 & vbCrLf & vbCrLf & "Il est membre du groupe par défaut "  & DefaultGroup & ", ainsi que du groupe " & Group & "."_
 & vbCrLf & vbCrLf & "Le répertoire associé "  & SamAccountName & " a été créé et partagé sur le serveur " & AdminServer & "."_
& vbCrLf & vbCrLf & vbCrLf & vbCrLf & "Note: Il reste à paramétrer le quota du répertoire."_
 & vbCrLf & vbCrLf & "le script associé est modele.bat."


EraseVar


LoginTextBox.value = ""
FirstNameTextBox.value = ""
LastNameTextBox.value = ""


'-----------
End Function
'-----------


 


' ___________________________________
'
'  FUNCTIONS
' ___________________________________
'


'-----------------------
Function VerifOU(OUName)
'-----------------------
'On verifie si l'OU existe


Dim msg0, yn, objConnection, objCommand, objRecordSet


msg0 =  "L'OU: " & OUName & " n'éxiste pas."_
 & vbCrLf & vbCrLf & "Fermer la fenêtre et vérifier le nom de l'OU dans le script."


'Ouverture de la connexion LDAP
Set objConnection =  CreateObject("ADODB.Connection")
Set objCommand  =    CreateObject("ADODB.Command")
objConnection.Provider  =  "ADsDSOObject"
objConnection.Open "Active Directory Provider"


Set objCommand.ActiveConnection = objConnection


'On récupère le nom distingué de l'OU
objCommand.CommandText =  "<LDAP://" & DomainName & ">;(&(objectClass=organizationalUnit)" & "(name=" & OUName & "));distinguishedName;subtree"


Set objRecordSet =  objCommand.Execute


'on verifie si l'OU existe ou non
If objRecordset.RecordCount = 0 Then
 yn  =  MsgBox(msg0, vbQuestion + vbOKOnly, "Vérification de l'existence de l'OU")
 ValidOU =  0
 objConnection.Close
 Set msg0  = Nothing
 Set yn   = Nothing
 Set objConnection = Nothing
 Set objCommand  = Nothing
 Set objRecordSet = Nothing
 Exit Function
End If


objOU   =  objRecordSet.Fields(0).Value


objConnection.Close


Set msg0  = Nothing
Set yn   = Nothing
Set objConnection = Nothing
Set objCommand  = Nothing
Set objRecordSet = Nothing


ValidOU = 1


'-----------
End Function
'-----------




'-----------------
Function EnterUser
'-----------------
Dim InputPrompt1, InputPrompt2, InputPrompt3


InputPrompt1  =  LoginTextBox.value
InputPrompt2  =  FirstNameTextBox.value
InputPrompt3  =  LastNameTextBox.value


SamAccountName = UCase(InputPrompt1)


If SamAccountName <> Empty Then
 VerifUser(SamAccountName)
Else
 ValidUser  = 0
 Set InputPrompt1 =  Nothing
 Set InputPrompt2 =  Nothing
 Set InputPrompt3 =  Nothing
 Exit Function
end if


If ValidUser = 2 then
 Set InputPrompt1 =  Nothing
 Set InputPrompt2 =  Nothing
 Set InputPrompt3 =  Nothing
 Exit Function
End If


FirstName = Format_chaine(InputPrompt2)
If FirstName = Empty Then
 MsgBox "Le prénom de l'utilisateur n'a pas été renseigné."
 ValidUser  = 3
End If
LastName = UCase(InputPrompt3)
If LastName = Empty Then
 MsgBox "Le nom de l'utilisateur n'a pas été renseigné."
 ValidUser  = 3
End If


Set InputPrompt1 =  Nothing
Set InputPrompt2 =  Nothing
Set InputPrompt3 =  Nothing


'-----------
End Function
'-----------




'-----------------------
Function VerifUser(User)
'-----------------------
'On verifie si l'utilisateur existe


Dim msg0, yn, objConnection, objCommand, objRecordSet


msg0 =  "Le login " & User & " est déjà attribué."_
 & vbCrLf & vbCrLf & "Vérifier le nom du login."


'Ouverture de la connexion LDAP
Set objConnection =  CreateObject("ADODB.Connection")
Set objCommand  =    CreateObject("ADODB.Command")
objConnection.Provider  =  "ADsDSOObject"
objConnection.Open "Active Directory Provider"


Set objCommand.ActiveConnection = objConnection


'On récupère le nom distingué du groupe
objCommand.CommandText =  "<LDAP://" & DomainName & ">;(&(objectClass=user)" & "(name=" & user & "));distinguishedName;subtree"


Set objRecordSet =  objCommand.Execute


'on verifie si l'utilisateur existe deja
If objRecordset.RecordCount <> 0 Then
 yn = msgBox(msg0, vbQuestion + vbOKOnly, "Vérification de l'utilisation du Login")
 ValidUser = 2
 Exit Function
End if


ValidUser   = 1


objConnection.Close


Set msg0  = Nothing
Set yn   = Nothing
Set objConnection = Nothing
Set objCommand  = Nothing
Set objRecordSet = Nothing


'-----------
End Function
'-----------




'------------------
Function EnterGroup
'------------------
ValidGroup = 0
If GroupName(0).Checked Then
 Group = "GROUPE1"
 ValidGroup = 1
ElseIf GroupName(1).Checked Then
 Group = "GROUPE2"
 ValidGroup = 1
ElseIf GroupName(2).Checked Then
 Group = "GROUPE3"
 ValidGroup = 1
ElseIf GroupName(3).Checked Then
 Group = "GROUPE4"
 ValidGroup = 1
ElseIf GroupName(4).Checked Then
 Group = "GROUPE5"
 ValidGroup = 1
End If


'-----------
End Function
'-----------




'-----------------------------
Function Format_chaine(Chaine)
'-----------------------------
'Transforme la 1ere lettre de la chaine en maj


Dim intLen, Lchaine, intIdx, a, strFinale


intLen   =  Len(Chaine)
Lchaine  = LCase(Chaine)


For intIdx = 1 To intLen
    a = Mid(Lchaine, intIdx, 1)         If intIdx 1 Then a UCase(a)
        If intIdx > 2 Then             If Mid(Lchaine, intIdx - 1, 1) " " Then a UCase(a)             If Mid(Lchaine, intIdx - 1, 1) "-" Then a UCase(a)
        End If
    strFinale = strFinale & a
Next
Format_Chaine = strFinale


Set intLen = Nothing
Set Lchaine = Nothing
Set intIdx = Nothing
Set a  = Nothing


'-----------
End Function
'-----------




'---------------------------------------
Function ReplaceACL(foldernm, permspart)
'---------------------------------------
'Set permissions on users home directory


 If fso.FolderExists(foldernm)= False Then
 MsgBox "Sorry this folder is not present on the server"
 Else
 ChangeACLS foldernm, permspart, "REPLACE", "FOLDER"
 End If
'-----------
End Function
'-----------




'--------------------------------------------
Function ChangeAcls(FILE,PERMS,REDIT,FFOLDER)
'--------------------------------------------
'Edit ACLS of specified folder


 Const ADS_ACETYPE_ACCESS_ALLOWED  =  0
 Const ADS_ACETYPE_ACCESS_DENIED  =  1
 Const ADS_ACEFLAG_INHERIT_ACE   =  2
 Const ADS_ACEFLAG_SUB_NEW   =  9


Dim tmpcmdVar, cmdparts, nameVar, rightVar, tmpVar1, cmdArray, sd, dacl, x


 Set sd = sec.GetSecurityDescriptor("FILE://" & FILE)
 Set dacl = sd.DiscretionaryAcl


 If UCase(REDIT)="REPLACE" Then
  For Each existingAce In dacl
    dacl.removeace existingace
  Next
 End If
    
 'break up Perms into individual actions
 cmdArray = split(perms,"+")
  
 For x=0 to ubound(cmdarray)
  tmpVar1  = cmdarray(x)
  If UCase(left(tmpVar1,3))="DEL" Then
    ACLAction="DEL"
  Else
    ACLAction="ADD"
 End If


  tmpcmdVar = left(tmpVar1,len(tmpVar1)-1)
 tmpcmdVar = right(tmpcmdVar,len(tmpcmdVar)-4)
  cmdparts = split(tmpcmdVar,":")
  nameVar  = cmdparts(0)
  rightVar = cmdparts(1)


  If ACLAction="ADD" Then
    If UCase(FFOLDER)="FOLDER" Then
     addace dacl, namevar, rightvar, ADS_ACETYPE_ACCESS_ALLOWED, ADS_ACEFLAG_SUB_NEW
      addace dacl, namevar, rightvar, ADS_ACETYPE_ACCESS_ALLOWED, ADS_ACEFLAG_INHERIT_ACE
    Else
      addace dacl, namevar, rightvar, ADS_ACETYPE_ACCESS_ALLOWED, 0
    End If
  End If
 Next


 For Each ace in dacl
   If instr(ucase(ace.trustee),"NT AUTHORITY") then
     newtrustee = right(ace.trustee, len(ace.trustee)-instr(ace.trustee, ""))
     ace.trustee = newtrustee
   End If
 Next


 sd.DiscretionaryAcl = dacl
 sec.SetSecurityDescriptor sd


Set tmpcmdVar = Nothing
Set cmdparts = Nothing
Set nameVar = Nothing
Set rightVar = Nothing
Set tmpVar1 = Nothing
Set cmdArray = Nothing
Set x  = Nothing


'-----------
End Function
'-----------




'--------------------------------------------------------
Function addace(dacl,trustee, maskvar, acetype, aceflags)
'--------------------------------------------------------
 ' add ace to the specified dacl
 Const RIGHT_READ   =  &H80000000
 Const RIGHT_EXECUTE   =  &H20000000
 Const RIGHT_WRITE   =  &H40000000
 Const RIGHT_DELETE   =  &H10000
 Const RIGHT_FULL   =  &H10000000
 Const RIGHT_CHANGE_PERMS  =  &H40000
 Const RIGHT_TAKE_OWNERSHIP  =  &H80000


 Set ace = CreateObject("AccessControlEntry")
 ace.Trustee = trustee
 
 Select Case UCase(MaskVar)
 Case "F"
 ace.AccessMask = RIGHT_FULL
 Case "C"
 ace.AccessMask = RIGHT_READ or RIGHT_WRITE or RIGHT_EXECUTE or RIGHT_DELETE
 Case "R"
 ace.AccessMask = RIGHT_READ or RIGHT_EXECUTE
 End Select


 ace.AceType = acetype
 ace.AceFlags = aceflags
 dacl.AddAce ace
'-----------
End Function
'-----------