J'ai récemment développé un script assez utile puisque son rôle est de sauvegarder des droits d'une arborescence. Je l'ai utilisé avant la migration de notre domaine active directory pour avoir un fichier où je pourrais savoir quels droits précis étaient appliqués à chaque répertoire au cas où des droits sauteraient ( ce qui a été le cas ).
Dans ce script qui vous présente un peu la syntaxe de PowerShell nous pouvons voir :
La déclaration d'un objet .Net (System.IO.StreamWriter) : l'utilisation de cet objet améliore de beaucoup le temps nécéssaire pour l'écriture dans un fichier lorsque l'ont doit écrire un gros volume de données. Un simple variable >> fichier aurait marché mais je vous laisse le soin de lire le comparatif d'efficacité des methodes.
L'utilisation de boucles foreach : très utiles pour parcourir tableaux et collections.
Le typage du code ressemblant fortement à tout ce qui est C-like ou Java-like (nottez cependant l'absence de ";" à la fin des instructions qui n'est nécessaire que lorsque vous placez plusieurs instructions sur la même ligne).
La fonction Power-Shell Get-Acl qui permet de récupérer l'ensemble des droits NTFS sur un objet fichier ou répertoire.
Je voudrais également souligner l'extrême importance de la dernière ligne ! Si vous ne fermez pas votre StreamWriter, le pointeur d'écriture restera en attente et vous ne pourrez plus modifier ou manipuler le fichier car celui-ci sera toujours en cours d'utilisation.
Par manque de temps et flemme ce soir je m'arrêterai là mais j'espère que ce premier script vous montre qu'il est possible de faire des choses utiles sans trop de difficultés, et que PowerShell est un outil très puissant à la portée de tous.
Pour vous donner un exemple de résultat du script ci-dessus :
C:\Users\Chrispc\Documents\DeadIsland\out\logs
------
AUTORITE NT\Système : FullControl
BUILTIN\Administrateurs : FullControl
Chrispc-PC\Chrispc : FullControl
_____________________
C:\Users\Chrispc\Documents\DeadIsland\out\Settings
------
AUTORITE NT\Système : FullControl
BUILTIN\Administrateurs : FullControl
Chrispc-PC\Chrispc : FullControl
_____________________
C:\Users\Chrispc\Documents\Mes ordinateurs virtuels\windows 8
------
AUTORITE NT\Système : FullControl
BUILTIN\Administrateurs : FullControl
Chrispc-PC\Chrispc : FullControl
_____________________
Vous comprendrez qu'il est bien plus intéressant de faire tourner ceci sur une vraie arborescence bureautique dans un domaine multi-groupe et multi-utilisateur.
A demain pour une nouvelle aventure : Nous utiliserons des classes réseau pour déterminer les stations disponibles à un instant T sur un domaine , lire leurs enregistrements DNS afin de tester l'existence de fichier dessus !
Très utile en effet !
RépondreSupprimerN'est-il pas possible de publier le script plutot qu'une simple image ?
Merci
De mon coté, le script créé bien un fichier mais ce fichier reste vide.
RépondreSupprimerJe débute en PowerShell donc si quelqu'un peut m'aider...
Merci !
en effet, pour le tester il faut le ressaisir !
RépondreSupprimerUne image n'est pas tip-top :-( !
Quelqu'un aurais la meme chose pour l'active directory ?
RépondreSupprimerMerci beaucoup pour le script ! Une fois adapté à mon cas, il était parfait ! Une bonne base de travail !
RépondreSupprimerPour éviter que d'autres le retapent comme moi, voici le code :
________________________________________________________________________
$stream = new-object System.IO.StreamWriter("C:\lol.log")
$liste_repertoire = Get-childitem "C:\users" -recurse
foreach ($repertoire in $liste_repertoire)
{
if($repertoire.Attributes -eq "Directory")
{
$global_acl = Get-Acl $repertoire.FullName
$stream.WriteLine($repertoire.FullName)
$stream.WriteLine("-------")
foreach ($droit in $global_acl.Access)
{
$chaine = ""
$chaine += $droit.IdentityReference
$chaine += " : "
$chaine += $droit.FileSystemRights
$stream.WriteLine($chaine)
}
$stream.WriteLine("_________________________")
}
}
$stream.Close()
Merci ,beaucoup pour ton code, il m'a évité de me prendre la tête .
RépondreSupprimerPascal.
Et voici une version pour l'avoir en fichier CSV pour import sous Excel :
RépondreSupprimer$stream = new-object System.IO.StreamWriter("c:\acl.csv")
$liste_repertoire = Get-childitem "p:" -recurse
foreach ($repertoire in $liste_repertoire)
{
if($repertoire.Attributes -eq "Directory")
{
$global_acl = Get-Acl $repertoire.FullName
foreach ($droit in $global_acl.Access)
{
$chaine = ""
$chaine += $repertoire.FullName
$chaine += "|"
$chaine += $droit.IdentityReference
$chaine += "|"
$chaine += $droit.FileSystemRights
$stream.WriteLine($chaine)
}
}
}
$stream.Close()
Bonjour, merci pour la récupération mais est-il possible de réutiliser le fichier csv pour rappliquer les mêmes droits en cas de crash.
RépondreSupprimer