Bonjour à tous,
Le script suivant permet de donner automatiquement les droits en modification à un dossier à un utilisateur dont le login correspond au nom du dossier, mais uniquement si le compte de l'utilisateur en question est bien présent et actif sur le domaine Active Directory auquel il appartient.
Cela permet de vérifier sur un serveur qui héberge des profils Windows itinérants que les droits sont bien paramétrés sur chaque dossier profil utilisateur
Concrètement, si dans un répertoire vous avez des dossiers du style :
- <nom utilisateur 1>
- <nom utilisateur 2>
- <nom utilisateur 3>
- ect
le script vérifie si <nom utilisateur 1> existe dans Active Directory, que le compte est actif dans AD, et si c'est bien le cas il donne les droits à <nom d'utilisateur 1> pour modifier le dossier <nom d'utilisateur 1>. Sinon, le script déplace le répertoire <nom d'utilisateur 1> dans un dossier "OLD".
Il passe ensuite au répertoire <nom d'utilisateur 2> et ainsi de suite puis génère des logs pour chaque dossier traité.
► Afficher le textescript
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.10.2
Author: Neutro
Script Function:
Application automatique droits ACL via vérification Active Directory
#ce ----------------------------------------------------------------------------
; Script Start - Add your code below here
#include <File.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <AD.au3>
#RequireAdmin
;vérification que setacl.exe existe
if fileexists(@scriptdir & "\setacl.exe") == 0 Then
msgbox("", "Erreur !", "Setacl.exe doit être copié dans le même répertoire d'execution que setrights.exe !")
Exit
endif
$repertoire_travail = @scriptdir
$ok = fileopen(@scriptdir & "\ok.log", 10)
$erreurs = fileopen(@scriptdir & "\erreurs.log", 10)
$test_ad = _AD_Open()
if $test_ad == 0 Then
msgbox("","Erreur","Impossible de se connecter à l'AD avec les droits administrateurs !")
Exit
EndIf
$logins = _FileListToArray($repertoire_travail, "*", 2, FALSE)
if isarray($logins) == 0 Then
msgbox("","Erreur","Impossible de récupérer les noms des dossiers !")
exit
EndIf
;comme le répertoire des profils contient parfois .V2, on ne garde que ce qu'il y a avant le . du dossier
for $i = 1 to $logins[0] step 1
if stringinstr($logins[$i], ".") <> 0 then
$separation = stringinstr($logins[$i], ".")
$logins[$i] = stringleft($logins[$i], $separation - 1)
EndIf
Next
$dossiers = _FileListToArray($repertoire_travail, "*", 2, TRUE)
if isarray($dossiers) == 0 Then
msgbox("","Erreur","Impossible de récupérer le chemin des dossiers !")
exit
EndIf
;on vérifie que le répertoire OLD existe dans le répertoire de travail.
If FileExists($repertoire_travail & "\OLD") == 0 then DirCreate($repertoire_travail & "\OLD")
for $i = 1 to $logins[0] step 1
if $logins[$i] <> "OLD" then ;si on a un répertoire nommé OLD, forcément on ne le traite pas car c'est le dossier de classement des anciens dossiers !
$userdetails = _AD_GetObjectProperties($logins[$i], "userAccountControl")
if isarray($userdetails) then
if stringinstr($userdetails[1][1], "ACCOUNTDISABLE") then
;le compte AD existe mais est désactivé, on déplace le répertoire dans \OLD\
Dirmove($dossiers[$i], $repertoire_travail & "\OLD", 1)
filewrite($erreurs, $logins[$i] & " - " & "Compte désactivé !" & @CRLF)
else
if stringinstr($userdetails[1][1], "NORMAL_ACCOUNT") then
;l'utilisateur est présent et activé dans l'AD, on ajoute les droits pour celui-ci à son dossier
RunWait(@scriptdir & '\SetACL.exe -on ' & $dossiers[$i] & ' -ot file -actn ace -ace "n:BQEDEL\' & $logins[$i] & ';p:change"')
filewrite($ok, $logins[$i] & " - " & $userdetails[1][1] & @CRLF)
Else
;l'utilisateur est présent dans l'AD mais l'état du compte ne contient pas la description "NORMAL_ACCOUNT"
;on ne déplace pas le dossier dans /OLD/, on log seulement l'anomalie
filewrite($erreurs, $logins[$i] & " - " & $userdetails[1][1] & @CRLF)
EndIf
endif
Else
;le compte AD n'existe pas ou plus, on déplace le dossier dans /OLD/
Dirmove($dossiers[$i], $repertoire_travail & "\OLD", 1)
filewrite($erreurs, $logins[$i] & " - " & "Utilisateur introuvable dans l'AD" & @CRLF)
endif
endif
Next
_AD_Close()
Pour fonctionner, il faut que le programme "SetACL.exe" soit situé dans le répertoire d’exécution du script et d'ajouter la bibliothèque AD dans votre répertoire "Include" d'AutoIT. Bibliothèque disponible
sur le forum anglais ici.
Le script ne sera surement pas utilisé en l'état par d'autres personnes mais cela donne un aperçu de comment manipuler des droits windows et des informations tirées d'un active directory