Ce script est avant tout destiné aux administrateurs qui doivent modifier des autorisations NTFS sur différents dossiers.
Il utilise 2 fichiers en entrée (n'oubliez pas de les adapter à vos besoins ; pour l'instant ils contiennent quelques exemples) :
- - le fichier dossiers.dat qui contient la liste des différents dossiers à traiter
- le fichier droits.dat qui contient la liste des autorisations ntfs à appliquer sur ces dossiers
Vous trouverez en pièces jointes les 4 fichiers nécessaires.if StringInStr($strElement.name, "mongroupe")
Bonne journée à tous !
► Afficher le texte
Code : Tout sélectionner
;=======================================================================================================================
; appel des librairies
;=======================================================================================================================
#include <GUIConstantsEx.au3>
#include <GuiButton.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
#Include <Array.au3>
#Include <string.au3>
;=======================================================================================================================
; déclaration des variables
;=======================================================================================================================
Opt('MustDeclareVars', 1)
; variables spécifiques à la fenetre
LOCAL $valider, $annuler, $reponse, $strFin, $fermer
LOCAL $progressbar
LOCAL $intTOP = 20
LOCAL $intHauteur = 260
LOCAL $intCoches, $intCompteur
LOCAL $inputGroupe, $labelMessage
; variables nécessaires aux tableaux
GLOBAL $arrAutorisations[1][1][1][1]
$arrAutorisations[0][0][0][0] = 0
; variable contenant la liste des autorisations à appliquer par défaut
GLOBAL $strDroitsDefaut = _ImporterDroits("droits.dat")
; autres variables
LOCAL $strNomGroupe
; définition des couleurs
LOCAL $color_BOUTON = "0x0000FF"
LOCAL $color_MESSAGE = "0x5FFB17"
LOCAL $color_FOND = "0x595454"
LOCAL $color_TEXTE = "0xFFF380"
LOCAL $color_FENETRE = "0x737CA1"
;-----------------------------------------------------------
; On charge la liste des dossiers
;-----------------------------------------------------------
_ImporterDossiers("dossiers.dat")
;-----------------------------------------------------------
; On ouvre la boite de dialogue
;-----------------------------------------------------------
GUICreate("Authorisations NTFS", 400, $intHauteur, -1, -1, $WS_EX_CLIENTEDGE)
; on affiche le groupe SPECIAL pour vérification
GUICtrlCreateLabel("Vérifier le nom du groupe SPECIAL :", 20, $intTOP, 200, 15, 0x01)
; on change la couleur du fond, la couleur du texte et les attributs de la police
GUICtrlSetBkColor ( -1, $color_FOND )
GUICtrlSetColor ( -1, $color_TEXTE )
GUICtrlSetFont ( -1, 9, 800, 4)
$intTOP = $intTOP + 30
; on récupère le nom du groupe de travail
$strNomGroupe = _GroupeSpecial()
; on affiche le champ du groupe
$inputGroupe = GUICtrlCreateInput($strNomGroupe, 40, $intTOP - 3, 120, 21, 0x01)
;-----------------------------------------------------------
; On traite les différents dossiers un par un
;-----------------------------------------------------------
; on affiche le label des dossiers
$intTOP = $intTOP + 50
GUICtrlCreateLabel("Valider les dossiers à mettre à jour :", 20, $intTOP - 5, 240, 15, 0x01)
; on change la couleur du fond, la couleur du texte et les attributs de la police
GUICtrlSetBkColor ( -1, $color_FOND )
GUICtrlSetColor ( -1, $color_TEXTE )
GUICtrlSetFont ( -1, 9, 800, 4)
$intTOP = $intTOP + 20
; on récupère le nombre de dossiers
LOCAL $intNbrDossiers = $arrAutorisations[0][0][0][0]
; pour chaque dossier
For $i = 1 to ($intNbrDossiers ) Step 1
; on affiche une case à cocher
Assign("boxNom" & $i, GUICtrlCreateCheckbox($arrAutorisations[$i][0][0][1], 40, $intTOP, 300, 20))
; on coche la case
GUICtrlSetState(-1, 1)
$intTOP = $intTOP + 25
Next
;-----------------------------------------------------------
; On prépare le bas de la fenetre
;-----------------------------------------------------------
; on prépare le label des messages
$intTOP = $intTOP + 15
$labelMessage = GUICtrlCreateLabel("", 20, $intTOP, 360, 15, 0x01)
; on change la couleur du texte et les attributs de la police
GUICtrlSetColor ( $labelMessage, $color_MESSAGE )
GUICtrlSetFont ( $labelMessage, 9, 450, 2)
; on affiche une barre de progression
$intTOP = $intTOP + 15
$progressbar = GUICtrlCreateProgress(20, $intTOP, 360, 20)
; on affiche le bouton ANNULER et on lui attribut la valeur PAR DEFAUT
$intTOP = $intTOP + 40
$annuler = GUICtrlCreateButton("Annuler", 230, $intTOP - 10, 70, 30)
GUICtrlSetState ( $annuler, $GUI_DEFBUTTON)
; on change la couleur du texte et les attributs de la police
GUICtrlSetColor ( $annuler, $color_BOUTON )
GUICtrlSetFont ( $annuler, 9, 800)
; on affiche le bouton FERMER
$fermer = GUICtrlCreateButton("Fermer", 305, $intTOP - 10, 80, 30)
; on change la couleur du texte et les attributs de la police
GUICtrlSetColor ( $fermer, $color_BOUTON )
GUICtrlSetFont ( $fermer, 9, 800)
; on cache le bouton FERMER
GUICtrlSetState ( $fermer, $GUI_DISABLE + $GUI_HIDE)
; on affiche le bouton VALIDER
$valider = GUICtrlCreateButton("Valider", 310, $intTOP - 10, 70, 30)
; on change la couleur du texte et les attributs de la police
GUICtrlSetColor ( $valider, $color_BOUTON )
GUICtrlSetFont ( $valider, 9, 800)
; on change la couleur de fond
GUISetBkColor($color_FENETRE)
; on valide l'affichage de la fenetre
GUISetState()
;-----------------------------------------------------------
; On traite les évènements de la fenetre
;-----------------------------------------------------------
Do
$reponse = GUIGetMsg()
$strFin = "NON"
Select
Case $reponse = $valider
$intCoches = 0
$intCompteur = 1
; on calcule le nombre de cases qui sont cochées
For $i = 1 to ($intNbrDossiers ) Step 1
If _IsChecked(Eval("boxNom" & $i)) then $intCoches = $intCoches + 1
GUICtrlSetState ( Eval("boxNom" & $i), $GUI_DISABLE)
Next
; on désactive les boutons ANNULER et VALIDER
GUICtrlSetState ( $annuler, $GUI_DISABLE)
GUICtrlSetState ( $valider, $GUI_DISABLE)
; on traite chaque case à cocher
For $i = 1 to ($intNbrDossiers ) Step 1
; on met à jour la barre de progression
GUICtrlSetData($progressbar, $intCompteur * (100 / $intCoches))
; on vérifie si la case est cochée
If _IsChecked(Eval("boxNom" & $i)) then
$intCompteur = $intCompteur + 1
; on affiche un message pour informer l'utilisateur
GUICtrlSetData ( $labelMessage, "Mise à jour du " & $arrAutorisations[$i][1][0][0] & " « " & $arrAutorisations[$i][0][1][0] & " » en cours...")
; on appelle la fonction qui traite les dossiers
_TraiterDossier($arrAutorisations[$i][0][0][1], GUICtrlRead($inputGroupe))
EndIf
Next
; on supprime les boutons
GUICtrlDelete($annuler)
GUICtrlDelete($valider)
; on affiche un message de fin
GUICtrlSetData ( $labelMessage, "Mise à jour terminée !")
; on met une pause pour temporiser l'affichage
GUICtrlSetState ( $fermer, $GUI_ENABLE + $GUI_SHOW)
Case $reponse = $fermer
$strFin = "OUI"
EndSelect
Until $reponse = $annuler or $strFin = "OUI"
;=======================================================================================================================
;=======================================================================================================================
;=======================================================================================================================
; fin du programme
;=======================================================================================================================
;=======================================================================================================================
;=======================================================================================================================
;=======================================================================================================================
; fonction de recherche du groupe SPECIAL
;=======================================================================================================================
Func _GroupeSpecial()
LOCAL $strSpecial = "NON TROUVE"
LOCAL $objNetwork, $strComputer, $objGroup, $strElement, $strClasse
; on récupère le nom de l'ordinateur
$objNetwork = ObjCreate("WScript.Network")
$strComputer = $objNetwork.ComputerName
; on récupère la liste des utilisateurs et groupes d'utilisateurs
$objGroup = ObjGet("WinNT://" & $strComputer & ",computer")
; on traite les groupes un par un
for $strElement in $objGroup
$strClasse = $strElement.Class
; on regarde si l'élément est un groupe
if $strClasse = "Group" then
; on vérifie si le nom du groupe correspond à celui qu'on recherche
if StringInStr($strElement.name, "mongroupe") then $strSpecial = $strElement.name
endif
next
Return $strSpecial
EndFunc
;=======================================================================================================================
; fonction d'importation de la liste des dossiers
;=======================================================================================================================
Func _ImporterDossiers($strDossiersImport)
LOCAL $DossiersFichier, $DossiersLigne
LOCAL $intDossiersNbr
LOCAL $strDossiersChemin
LOCAL $arrDossiersDetail[2]
; on ouvre le fichier
$DossiersFichier = FileOpen(@ScriptDir & "\" & $strDossiersImport, 0)
; on va lire les lignes une par une
While 1
; on lit le contenu de la ligne
$DossiersLigne = FileReadLine($DossiersFichier)
If @error = -1 Then ExitLoop
; on vérifie que la ligne ne soit pas un commentaire
If StringLeft($DossiersLigne, 2) <> "/*" Then
; on decompose le contenu de la ligne
$arrDossiersDetail = _StringExplode($DossiersLigne, ";")
; on récupère le nom du dossier
$strDossiersChemin = $arrDossiersDetail[2]
If FileExists($strDossiersChemin) Then
;on récupère le nombre de dossiers
$intDossiersNbr = $arrAutorisations[0][0][0][0] + 1
; on redimensionne le tableau des dossiers
ReDim $arrAutorisations[$intDossiersNbr + 1][2][2][2]
; on stocke le nom de la case à cocher dans la première colonne
$arrAutorisations[$intDossiersNbr][0][0][0] = "boxDossier" & $intDossiersNbr
; on stocke le type dans la 2ème colonne
$arrAutorisations[$intDossiersNbr][1][0][0] = $arrDossiersDetail[0]
; on stocke le nom dans la 3ème colonne
$arrAutorisations[$intDossiersNbr][0][1][0] = $arrDossiersDetail[1]
; on stocke le chemin dans la 4ème colonne
$arrAutorisations[$intDossiersNbr][0][0][1] = $arrDossiersDetail[2]
; on enregistre le nombre de dossiers
$arrAutorisations[0][0][0][0] = $intDossiersNbr
; on augmente la hauteur de le fenetre
$intHauteur = $intHauteur + 25
EndIf
EndIF
WEnd
FileClose($DossiersFichier)
EndFunc
;=======================================================================================================================
; fonction d'importation de la liste des droits
;=======================================================================================================================
Func _ImporterDroits($strDroitsImport)
LOCAL $DroitsFichier, $DroitsLigne
LOCAL $strDroitsRetour = ""
LOCAL $arrDroitsDetail[2]
; on ouvre le fichier
$DroitsFichier = FileOpen(@ScriptDir & "\" & $strDroitsImport, 0)
; on va lire les lignes une par une
While 1
; on lit le contenu de la ligne
$DroitsLigne = FileReadLine($DroitsFichier)
If @error = -1 Then ExitLoop
; on vérifie que la ligne ne soit pas un commentaire
If StringLeft($DroitsLigne, 2) <> "/*" Then
; on decompose le contenu de la ligne
$arrDroitsDetail = _StringExplode($DroitsLigne, ";")
; on prépare les autorisations avec le nom du groupe et le droit associé
$strDroitsRetour = $strDroitsRetour & " /grant=" & chr(34) & $arrDroitsDetail[0] & chr(34) & "=" & $arrDroitsDetail[1]
EndIF
WEnd
FileClose($DroitsFichier)
Return $strDroitsRetour
EndFunc
;=======================================================================================================================
; fonction de vérification des cases à cocher
;=======================================================================================================================
Func _IsChecked($control)
Return BitAnd(GUICtrlRead($control),$GUI_CHECKED) = $GUI_CHECKED
EndFunc
;=======================================================================================================================
; fonction d'affichage du message et d'execution de la commande
;=======================================================================================================================
Func _TraiterDossier($strTraiterDossier, $strTraiterGroupe)
LOCAL $strTraiterCommande = "subinacl"
LOCAL $strTraiterOption
LOCAL $strTraiterScript = "@ScriptDir"
;-----------------------------------------------------------
; on traite d'abord le dossier en lui même
;-----------------------------------------------------------
; on prépare les options pour la commande
$strTraiterOption = "/file " & chr(34) & $strTraiterDossier & chr(34)
; le paramètre "/perm" supprime les autorisations déjà en place
$strTraiterOption = $strTraiterOption & " /perm"
; on ajoute les droits par défaut
$strTraiterOption = $strTraiterOption & $strDroitsDefaut
; si un groupe special existe, on ajoute les droits pour ce groupe
If $strTraiterGroupe <> "NON TROUVE" Then $strTraiterOption = $strTraiterOption & " /grant=" & $strTraiterGroupe & "=C"
; on donne l'appartenance du dossier au administrateurs de la station
$strTraiterOption = $strTraiterOption & " /setowner=Administrateurs"
; on execute la commande
ShellExecuteWait ($strTraiterCommande, $strTraiterOption, $strTraiterScript, "open", @SW_HIDE)
;-----------------------------------------------------------
; on traite ensuite les fichiers et les sous-dossiers
;-----------------------------------------------------------
; on prépare les options pour la commande
$strTraiterOption = "/subdirectories " & chr(34) & $strTraiterDossier & "\*.*" & chr(34)
; le paramètre "/perm" supprime les autorisations déjà en place
$strTraiterOption = $strTraiterOption & " /perm"
; on ajoute les droits par défaut
$strTraiterOption = $strTraiterOption & $strDroitsDefaut
; si un groupe special existe, on ajoute les droits pour ce groupe
If $strTraiterGroupe <> "NON TROUVE" Then $strTraiterOption = $strTraiterOption & " /grant=" & $strTraiterGroupe & "=C"
; on donne l'appartenance du dossier au administrateurs de la station
$strTraiterOption = $strTraiterOption & " /setowner=Administrateurs"
; on execute la commande
ShellExecuteWait ($strTraiterCommande, $strTraiterOption, $strTraiterScript, "open", @SW_HIDE)
EndFunc