J'ai fait il y a longtemps un vbs qui fait ça :
mais si l'AD est grosse, ça va être kilométrique
Je l'ai fait pour des Stations du domaine (vérification en cas
d'embrouille, par pour un contrôleur de domaine...)
Attention c'est super extra long ...
Voici d'abord son mode d'emploi.
=========================================================================
Autorisations_CSV.vbs HB 2009
But
Ce script permet de faire un bilan des autorisations de sécurité pour un
ensemble de fichiers et/ou de réper-toires. Les résultats sont regroupés
dans un fichier liste.csv de façon à faciliter la consultation et
l’étude des informations contenues...
Pour utiliser ce script
Vous devez avoir le droit d’écrire dans le répertoire où se trouve ce
script.
Saisir avec la souris les objets (fichiers et/ou répertoires) à traiter
puis, par glisser-déposer, Les amener sur le script
Autorisations_CSV.vbs . Un formulaire (géré par IE et par le script)
surgit ...
Signification des paramètres
Profondeur :
Objets pris en compte selon la valeur de ce paramètre numérique :
0 : Seulement les objets transmis.
1 : Les objets transmis et les objets "contenus dans les répertoires
transmis".
2 : ... et aussi les objets "contenus dans les 'répertoires contenus
dans les répertoires transmis' " ...
3 à 10 : etc... (récursivité) ...
Objets à traiter :
Il y a trois choix : Dossiers et Fichiers ou bien Dossiers ou bien
Fichiers
Types de fichiers :
On peut limiter le traitement à certains types de fichiers en
fournissant une ou plusieurs extensions. Le séparateur utilisé doit
alors être le point-virgule. Toute valeur différente de « .* » est
interprétée comme une liste d’extensions.
Valeur spéciale : .* Tout type de fichier ...
Extension unique :
.bat Fichiers .bat.
Liste d’extensions : .vbs; ; html
Fichiers .vbs, .html et sans extension.
Les espaces situés au début et/ou à la fin de chaque extension seront
supprimés...
Un espace seul sera donc interprété comme une chaîne vide (fichiers sans
extension).
Le nombre des extensions est limité à 20 et la longueur totale de la
saisie ne peut dépasser 100 caractères...
Résultat
Si vous fermez la fenêtre ("croix rouge") ou si vous choisissez le
bouton Annuler, rien ne sera fait...
Si vous choisissez le bouton Valider, le script fabriquera un fichier
liste.csv contenant les informations attendues.
Il s'agit d'un fichier CSV standard avec le point-virgule comme
séparateur de champs.
Ensuite, tout bon tableur vous permettra rapidement de présenter ces
données pour en faciliter la lecture.
Contenu du fichier liste.csv
Les 4 premières colonnes :
Le chemin L'utilisateur / le groupe concerné
Précision indiquant si ces autorisations sont héritées Le « masque »
indiquant les ACL ( pour info...)
Les 5 colonnes suivantes donnent les autorisations "basiques"
Ce sont des combinaisons d'autorisations élémentaires.
Cela correspond à ce que l'on peut voir avec l'onglet sécurité.
Les 4 colonnes suivantes donnent les autorisations "génériques" codées à
part dans les ACL...
Les 14 colonnes suivantes donnent les autorisations élémentaires :
Ce sont les autorisations auxquelles on accède par > onglet sécurité
> Paramètres avancés > modifier
============================================================================
voici maintenant le vbs
Attention, des retours de lignes intempestifs sont ajoutés (dans les
news) ... Il faudra bien tout relire
' =========== VARIABLES ============================================
' Tableaux
Dim Code(16), Nom(16)
Dim CodeSt(6), NomSt(6)
Dim CodeG(5), NomG(5)
Dim TablExt(20)
' objets
Dim ONET, FSO, oIE, ts, FichierListe, fdo, ObjArgs
' chaînes
Dim Machine, Chemin, FicHtml, Titre
Dim CheminFichier, EXT, Bidon, Cc
' Valeurs numériques
Dim Nb, NbArgs, IArgs, NbExt, KOI, PROFONDEUR , Ii
' DWORD de la BdR
DIM AGARDER
' Booléens
Dim FICHIERS, DOSSIERS, ChoixExt
' ============ Récupération des arguments transmis =================
Set ObjArgs = WScript.Arguments
Nb = ObjArgs.Count
NbArgs = Nb - 1
' ================= ze fso ,bien sûr ===============================
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
' ============== remplissage des tableaux =========================
INIT()
' ====================nom de la machine ============================
set ONET = WScript.CreateObject("wscript.Network")
Machine = ONET.ComputerName
set ONET = Nothing
' ================== Chemin du script ==============================
Chemin = WScript.ScriptFullName
' ============================================================
' =============== page html pour les paramètres ==============
' ============================================================
Titre = "Liste des ACL : Paramétrage"
FicHtml=Left(Chemin, InStrRev(Chemin, "\")) & "index.html"
Set ts = FSO.CreateTextFile(FicHtml, True)
' ============================================================
ts.writeline "<html>"
ts.writeline "<head>"
ts.writeline "<title>" & Titre & "</title>"
ts.writeline "<STYLE TYPE=""text/css"">"
ts.writeline " body {"
ts.writeline " font-family: Verdana;"
ts.writeline " font-size: 10 pt }"
ts.writeline " h1, h2, h3, h4, h5, h6 { font-family: Verdana }"
ts.writeline "</STYLE>"
ts.writeline "</head>"
ts.writeline "<body bgcolor=""#FFFFD2"">"
ts.writeline "<script language=""VBScript""> "
ts.writeline "<!--"
ts.writeline "Dim saibon "
ts.writeline "Sub OKAY_OnClick"
ts.writeline " saibon=1 "
ts.writeline "End Sub"
ts.writeline "Sub NIET_OnClick"
ts.writeline " saibon=-1 "
ts.writeline "End Sub"
ts.writeline "Sub Window_OnLoad()"
ts.writeline " saibon=0 "
ts.writeline "End Sub"
ts.writeline "Public Function Controle()"
ts.writeline " Controle=saibon"
ts.writeline "End function"
ts.writeline "'-->"
ts.writeline "</script>"
ts.writeline "<form name=""FORME"">"
ts.writeline "Profondeur de la recherche : "
ts.writeline "<select name=""PROF"" size=""1"">"
ts.writeline "<option selected>0</option>"
ts.writeline "<option>1</option>"
ts.writeline "<option>2</option>"
ts.writeline "<option>3</option>"
ts.writeline "<option>4</option>"
ts.writeline "<option>5</option>"
ts.writeline "<option>6</option>"
ts.writeline "<option>7</option>"
ts.writeline "<option>8</option>"
ts.writeline "<option>9</option>"
ts.writeline "<option>10</option>"
ts.writeline "</select><br><br>"
ts.writeline "Objets à traiter : "
ts.writeline "<select name=""DOSFICH"" size=""1"">"
ts.writeline "<option selected>Dossiers et Fichiers</option>"
ts.writeline "<option>Dossiers</option>"
ts.writeline "<option>Fichiers</option>"
ts.writeline "</select><br><br>"
ts.writeline "Type de fichiers à traiter (""<code>.*</code>"" pour
<b>tous</b> <u>ou bien</u> extension(s)) :<br>"
Ts.Writeline "<INPUT TYPE=""text"" STYLE=""FONT-FAMILY: Courier New;""
NAME=""TYPEFICH"" SIZE=60 MAXLENGTH=100 VALUE="".*"">"
Ts.Writeline "<br><small> Vous pouvez mettre jusqu'à 20
extensions en les séparant par des point-virgules."
Ts.Writeline "<br> Pour les fichiers sans extension vous
pouvez utiliser un chaîne vide ou un espace."
Ts.Writeline "<br><i> Ces données seront ignorées si seuls
les dossiers sont traités...</i></small>"
ts.writeline "<br><br><hr><br>"
ts.writeline "<center><input type=""button"" value="" Valider ""
name=""OKAY""> "
ts.writeline " <input
type=""button"" value="" Annuler "" name=""NIET""></center>"
ts.writeline "</form>"
ts.writeline "</body>"
ts.writeline "</html>"
ts.Close
set ts=nothing
' ============================================================
' Ouverture d'Internet Explorer
Set oIE = WScript.CreateObject("InternetExplorer.Application", "IE_")
oIE.Left = 100
oIE.Top = 50
oIE.Height = 300
oIE.Width = 580
oIE.MenuBar = 0
oIE.ToolBar = 0
oIE.StatusBar = 0
oIE.navigate FicHtml
oIE.Visible = 2
Do While (oIE.Busy)
WScript.Sleep 200
Loop
' ============================================================
' Attente d'action sur un bouton ou fermeture de la fenêtre
On Error Resume Next
Do
WScript.Sleep 100
Loop While (oIE.Document.Script.Controle() = 0)
' ============================================================
' Si on ferme directement IE sans passer par un bouton,
' on quitte le script
If Err <> 0 Then
FSO.DeleteFile FicHtml,true
Set FSO = Nothing
Wscript.quit
end if
' ============================================================
Test = oIE.Document.Script.Controle()
If Test = -1 Then
CloseIE
Set FSO = Nothing
Wscript.quit
end if
' ============================================================
' ============== Récupération des paramètres =================
' ============================================================
KOI = oIE.Document.FORME.DOSFICH.selectedIndex
PROFONDEUR = oIE.document.FORME.PROF.selectedIndex
EXT = oIE.document.FORME.TYPEFICH.Value
' ============================================================
CloseIE
' ============================================================
If EXT = ".*" then
ChoixExt = False
else
ChoixExt = True
TabExt = Split(EXT,";")
NbExt = UBound(TabExt)
For Ii = 0 to NbExt
TabExt(Ii) = TRIM(LCase(TabExt(Ii)))
Next
End If
DOSSIERS = (KOI = 0 Or KOI = 1)
FICHIERS = (KOI = 0 Or KOI = 2)
' ============================================================
' ============================================================
CheminFichier = Left(Chemin, InStrRev(Chemin, "\")) & "liste.csv"
Set FichierListe = FSO.OpenTextFile(CheminFichier, 2, True)
Bidon = "Chemin;Utilisateurs / Groupes;Hérité;Masque Complet"
' Première ligne du CSV : Nom des colonnes ===================
for Ii = 1 to 5
Bidon = Bidon & ";" & NomSt(Ii)
next
for Ii = 1 to 4
Bidon = Bidon & ";" & NomG(Ii)
next
for Ii = 1 to 14
Bidon = Bidon & ";" & Nom(Ii)
next
FichierListe.WriteLine Bidon
' =================== BOUCLE sur les arguments ====================
For IArgs = 0 to NbArgs
Cc = ObjArgs(IArgs)
If (FSO.FileExists(Cc) And FICHIERS) Then
If FLAGFICH(CC) then
Fichierliste.Writeline SONCAS(Cc)
End if
End If
If FSO.FolderExists(CC) then
Set fdo = FSO.GetFolder(Cc)
If DOSSIERS Then
Fichierliste.Writeline SONCAS(fdo.path)
End If
If PROFONDEUR > 0 then
Call Traite(fdo,1)
End If
end if
Next
' ========================================================================
Set FSO = Nothing
Fichierliste.Close
Set Fichierliste = Nothing
MsgBox "C'est fini..."
Wscript.quit
' ========================================================================
' ========================================================================
Sub Traite(fd,nivo)
If FICHIERS Then
For Each Sf In Fd.Files
If FLAGFICH(Sf.name) then
Fichierliste.Writeline SONCAS(sf.path)
End If
Next
End If
For Each sfg in fd.SubFolders
If DOSSIERS then
Fichierliste.Writeline SONCAS(sfg.path)
End If
If PROFONDEUR > nivo Then
Call Traite(sfg,nivo+1)
End If
Next
End Sub
'
===================================================================================
' Procédure qui traite un objet : avec WMI et les descripteurs de
sécurité ...
'
===================================================================================
Function SONCAS(CHE)
Dim CHECHE, Elt, Msg, Devant
Dim wmiFileSecSetting, Quissa
Dim DescripteurDeSecurite
Dim intControlFlags, Masque, AcT, TypeHerit
Dim RetVal, I
CHECHE = "'" & Replace(CHE,"\","\\") & "'"
Set wmiFileSecSetting =
GetObject("winmgmts:Win32_LogicalFileSecuritySetting.path=" & CHECHE)
RetVal = wmiFileSecSetting. _
GetSecurityDescriptor(DescripteurDeSecurite)
If Err <> 0 Then
SONCAS = "GetSecurityDescriptor failed" _
& Err.Number & VBCRLF & Err.Description
Exit Function
End If
Msg = ""
intControlFlags = DescripteurDeSecurite.ControlFlags
If intControlFlags AND &H4 Then
For Each ItemSecurite In DescripteurDeSecurite.DACL
Msg = Msg & CHE
Set Quissa = ItemSecurite.Trustee
If Trim(Quissa.Domain) = "" then
Devant = ""
Else
Devant = Quissa.Domain & "\"
End If
Msg = Msg & ";" & Devant & Quissa.Name
Masque = ItemSecurite.AccessMask
AcT = ItemSecurite.AceType
TypeHerit = ItemSecurite.AceFlags
If (TypeHerit and &H18) then
Msg = Msg & ";" & "X"
Else
Msg = Msg & ";" & " "
End If
Msg = Msg & ";" &"&h" & hex(Masque)
For I = 1 to 5
If (Masque AND CodeSt(I)) = CodeSt(I) then
If AcT = 0 then
Elt = "+"
else
Elt = "-"
End If
else
Elt = " "
End If
Msg = Msg & ";" & Elt
Next
For I = 1 to 4
If (Masque AND CodeG(I)) = CodeG(I) then
If AcT = 0 then
Elt = "+"
else
Elt = "-"
End If
else
Elt = " "
End If
Msg = Msg & ";" & Elt
Next
For I = 1 to 14
If (Masque AND Code(I)) = Code(I) then
If AcT = 0 then
Elt = "+"
else
Elt = "-"
End If
else
Elt = " "
End If
Msg = Msg & ";" & Elt
Next
Msg = Msg & VbCrlf
Next
SONCAS = Msg
Else
SONCAS = "Aucune information disponible..." & VbCrlf
End If
Set wmiFileSecSetting = Nothing
Set Quissa = Nothing
End Function
' ============================================================
' Fermeture d'Internet Explorer et suppression du fichier HTML
' ============================================================
Sub CloseIE
oIE.Quit
Set oIE = Nothing
RemetScriptIE
FSO.DeleteFile fichtml,true
End Sub
' ============================================================
' Détermine si un fichier doit être traité
' ============================================================
Function FLAGFICH(CHEM)
Dim RN, RR, Truc
If EXT = ".*" Then
FLAGFICH = TRUE
else
RN = right(CHEM,Len(CHEM)- InStrRev(CHEM, "\"))
If InStrRev(RN, ".")= 0 then
RR = ""
Else
RR = "." & right(RN,Len(RN)- InStrRev(RN, "."))
End If
Truc = False
For A = 0 to NbExt
Truc = Truc Or ( RR = TabExt(A))
Next
FLAGFICH = Truc
end if
End Function
' ==============================================================
' pb de sécurité dans IE le paramètre est modifié mais conservé
' ==============================================================
Sub PourScriptIE
Dim WS
Dim CLEBDR, VARBDR
Set WS = WScript.CreateObject("WScript.Shell")
CLEBDR = "HKEY_CURRENT_USER\Software\Microsoft\Internet
Explorer\Main\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN\"
VARBDR = CLEBDR & "iexplore.exe"
AGARDER = WS.RegRead(VARBDR)
WS.RegWrite VARBDR,0,"REG_DWORD"
Set WS = Nothing
End Sub
' ==============================================================
' pb de sécurité dans IE le paramètre est remis à la fin
' ==============================================================
Sub RemetScriptIE
Dim WS
Dim CLEBDR, VARBDR
Set WS = WScript.CreateObject("WScript.Shell")
CLEBDR = "HKEY_CURRENT_USER\Software\Microsoft\Internet
Explorer\Main\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN\"
VARBDR = CLEBDR & "iexplore.exe"
WS.RegWrite VARBDR,AGARDER,"REG_DWORD"
Set WS = Nothing
End Sub
'
==================================================================================
sub INIT()
CodeSt(1) = &h120089
NomSt(1) = "Lire"
CodeSt(2) = &h120116
NomSt(2) = "Ecrire"
CodeSt(3) = &h1200A9
NomSt(3) = "Lire-Exécuter"
CodeSt(4) = &h1301BF
NomSt(4) = "Modifier"
CodeSt(5) = &h1101FF
NomSt(5) = "Contrôle Total"
Code(1) = &h000001
Nom(1) = "Voir"
Nom(2) = "Ajouter un fichier"
Code(2) = &h000002
Nom(3) = "Ajouter un sous-dossier"
Code(3) = &h000004
Nom(4) = "Lire les attributs étendus"
Code(4) = &h000008
Nom(5) = "Ecrire des attributs étendus"
Code(5) = &h000010
Nom(6) = "Parcourir"
Code(6) = &h000020
Nom(7) = "Détruire un élément"
Code(7) = &h000040
Nom(8) = "Lire les attributs"
Code(8) = &h000080
Nom(9) = "Ecrire les attributs"
Code(9) = &h000100
Nom(10) = "Effacer un fichier"
Code(10)= &h010000
Nom(11) = "Lire des autorisations"
Code(11)= &h020000
Nom(12) = "Modifier des autorisations"
Code(12)= &h040000
Nom(13) = "S'approprier un élément"
Code(13)= &h080000
Nom(14) = "Synchroniser"
Code(14)= &h100000
NomG(1) = "G_ALL"
CodeG(1)= &h10000000
NomG(2) = "G_EXECUTE"
CodeG(2)= &h20000000
NomG(3) = "G_WRITE"
CodeG(3)= &h40000000
NomG(4) = "G_READ"
CodeG(4)= &h80000000
' Allure générale du masque : GGGG 0000 000x xxxx 0000 000x xxxx xxxx
' 0 : Bits libres
' G : Quatre autorisations génériques
' x : Quatorze autorisations élémentaires (détails)
End Sub
'
==================================================================================