Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA - Afficher les autorisations d'accès des répertoires / fichiers

18 réponses
Avatar
ThierryP
Bonjour le forum,

Windows Server ne permettant pas de lister facilement les autorisations d'a=
cc=C3=A8s (par utilisateur ou groupe de l'AD) aux dossiers / fichiers, je v=
oudrais le faire via VBA.

Si une =C3=A2me charitable voulait bien me donner un d=C3=A9but de piste...=
je lui en serais tr=C3=A8s reconnaissant !!

Merci d'avance

ThierryP

10 réponses

1 2
Avatar
MichD
Bonjour,
Tu veux accéder aux permissions d'un usager sur des fichiers ?
Regarde ici :
http://stackoverflow.com/questions/2928738/how-to-grant-permission-to-users-for-a-directory-using-command-line-in-windows
La fenêtre CMD = fenêtre d'une invite de commande ouverte comme admin.
Un exemple en vba d'une commande utilisant la fenêtre de l'invite de commande:
==============
Pour créer tous les répertoires du chemin :
Sub test()
Dim Chemin As String, Commande As String
'Crée d'un seul coup tous les répertoires
'et sous-répertoires s'ils sont absents et
'ne touche à rien s'ils sont présents
Chemin = "c:AAADenisDanieltotoBozo"
'S'assurer d'être sur le bon lecteur où les répertoires
'doivent être créé
ChDrive "C"
Commande = Environ("comspec") & " /c mkdir " & Chemin
Shell Commande, 0
End Sub
================
MichD
Avatar
MichD
En supplément,
Pour connaître tout ce que tu peux faire avec la commande "icacls",
dans une fenêtre de l'invite de commande, tape cette commande icacls /?
MichD
Avatar
ThierryP
Bonjour Denis,
Merci pour le lien ! Mon problème, c'est qu'en utilisant ICACLS, je pe ux créer un fichier texte contenant toutes les infos (enfin, je suppos e !!) mais difficilement exploitables (en tous cas, pour moi) du style :
Bureau_etudes
D:PAI(A;OICI;FA;;;BA)(A;OICI;0x1301bf;;;BU)S:AI
ou encore :
Commercial
D:PAI(D;OICI;CCSWWPLORC;;;S-1-5-21-1004336348-1801674531-1179727518-1128)(A ;OICI;FA;;;S-1-5-21-1004336348-1801674531-1179727518-1668)(A;OICI;FA;;;BA)( A;OICI;0x1200a9;;;DU)(A;OICI;FA;;;S-1-5-21-3310317648-1530309550-2900299992 -1003)S:AI
Un peu trop compliqué pour moi ! J'espérais pouvoir trouver quelq ue chose qui puisse me donner directement les noms (utilisateurs ou groupes de l'AD), pour chaque dossier / fichier, Excel me permettant alors d'analy ser assez facilement les données. D'après mes tests, il faut que je construise une table de correspondance entre les noms et les codes bizar roïdes comme : S-1-5-21-3310317648-1530309550-2900299992-1003)S:AI, pu is pour les droits eux-mêmes. Je crois qu'il va me falloir investir da ns un logiciel dédié !
Merci de t'être penché sur mon souci..... qui dépasse peut- être l'utilisation d'Excel !
ThierryP
Avatar
MichD
Tu peux extraire les informations que tu désires en utilisant un fichier .txt .
Dans un deuxième temps, tu as besoin d'une autre macro pour extraire l'information
de ce fichier texte dans Excel si besoin.
Personne n'a dit que l'utilisation de cette commande était facile et quelqu'un pouvait
arriver à extraire les informations désirées après quelques minutes...
Des adresses où tu as des exemples d'utilisation de la commande "icacls"
http://www.computerhope.com/cacls.htm
https://www.windows-commandline.com/cacls-command-examples/
http://techsupt.winbatch.com/webcgi/webbatch.exe?techsupt/nftechsupt.web+WinBatch/How~To/System~Information+ICACLS~Code~Sample.txt
MichD
Avatar
HB
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 :&nbsp;&nbsp;"
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 :&nbsp;&nbsp;"
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` MAXLENGTH0 VALUE="".*"">"
Ts.Writeline "<br><small>&nbsp;&nbsp;Vous pouvez mettre jusqu'à 20
extensions en les séparant par des point-virgules."
Ts.Writeline "<br>&nbsp;&nbsp;Pour les fichiers sans extension vous
pouvez utiliser un chaîne vide ou un espace."
Ts.Writeline "<br><i>&nbsp;&nbsp;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"">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
ts.writeline "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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_USERSoftwareMicrosoftInternet
ExplorerMainFeatureControlFEATURE_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_USERSoftwareMicrosoftInternet
ExplorerMainFeatureControlFEATURE_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
'
=================================================================================
Le 23/11/2016 à 11:57, ThierryP a écrit :
Bonjour le forum,
Windows Server ne permettant pas de lister facilement les autorisations d'accès (par utilisateur ou groupe de l'AD) aux dossiers / fichiers, je voudrais le faire via VBA.
Si une âme charitable voulait bien me donner un début de piste... je lui en serais très reconnaissant !!
Merci d'avance
ThierryP
Avatar
HB
================== Annule et remplace le précédent ===============
Comme depuis XP, la sécurité et l'objet IE ont évolué, bien sûr, ce
vieux vbs marche mal.
Mais en changeant trois fois rien, c'est bon. (testé à l'instant)
C'est donc toujours un VBS ...
En l'état il peut probablement être vite adapté au VBA pour Excel
mais comme il fabrique un CVS standard ... est-ce utile ?
Cordialement,
HB
===================================================================== Trois paramètres sont à régler dans le script :
(juste après la zone de déclaration des variables)
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 (KOI) :
Il y a trois choix :
Dossiers et Fichiers ou bien Dossiers ou bien Fichiers
Types de fichiers (EXT):
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.
========================================================================== 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
===========================================================================
Un petit message dit quand c'est fini ;
c'est assez rapide quand même ...
=========================================================================== 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 et cette fois c'est le bon, testé à l'instant
avec Windows 10
Attention, des retours de lignes intempestifs sont ajoutés (dans les
news) ... Il faudra bien tout relire et, avec notepad corriger les
erreurs qui en découlent (une bonne dizaine au moins)
à enregistrer en truc.vbs bien sûr ...
' =========== 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
' =========================================================== ' ============== Paramètres à adapter ================ ' =========================================================== ' O : dossiers et fichiers
' 1 : seulement les dossiers
' 2 : Seulement les fichiers
KOI = 0
' pour le traitement récursif ...
PROFONDEUR = 10
' extensions séparées par ";"
EXT = ".*"
' =========================================================== ' =========================================================== ' PARTIE FIXE A NE PAS TOUCHER
' =========================================================== ' ============ 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
' =========================================================== 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
' =========================================================== ' Détermine sur un fichier doir ê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
'
================================================================================= 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
'
=================================================================================
Le 23/11/2016 à 11:57, ThierryP a écrit :
Bonjour le forum,
Windows Server ne permettant pas de lister facilement les autorisations d'accès (par utilisateur ou groupe de l'AD) aux dossiers / fichiers, je voudrais le faire via VBA.
Si une âme charitable voulait bien me donner un début de piste... je lui en serais très reconnaissant !!
Merci d'avance
ThierryP
Avatar
ThierryP
Bonjour Denis,
Merci pour les liens ! En fait, vu le temps à consacrer à des tab les de correspondance, à gérer des exceptions etc etc..., j'en su is à me demander s'il ne serait pas plus simple de tout remettre à   plat et de repartir de zéro !
Je vais me plonger dans le script de HB, qui a l'air de pouvoir faire ce qu e je souhaite moyennant une bonne prise de tête !!
Merci
ThierryP
Avatar
ThierryP
Wahouu !!
Impressionnant ;o))
Je vais me plonger là-dedans, histoire de griller les quelques neurone s qui me restent !!
Merci de mettre à disposition un tel boulot,
ThierryP
Le mercredi 23 novembre 2016 17:22:40 UTC+1, HB a écrit :
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 ...
Avatar
HB
Si tu te contentes d'un Ctrl-C puis Ctrl-V dans Notepad
tu n'as quasiment rien à faire.
mais en le trouvant tout prêt avec
son mode d'emploi c'est encore mieux ... :
http://alturl.com/x6xf6
Cordialement,
HB
e 24/11/2016 à 17:03, ThierryP a écrit :
Wahouu !!
Impressionnant ;o))
Je vais me plonger là-dedans, histoire de griller les quelques neurones qui me restent !!
Merci de mettre à disposition un tel boulot,
ThierryP
Avatar
ThierryP
Le mercredi 23 novembre 2016 17:22:40 UTC+1, HB a écrit :
J'ai fait il y a longtemps un vbs qui fait ça :
mais si l'AD est grosse, ça va être kilométrique

J'ai pu faire quelques petits tests, je pense que ça va me convenir au top.
Je n'aurai qu'un mot : chapeau bas !! (deux mots, du coup !)
Encore merci,
ThierryP
1 2