Archives mensuelles : octobre 2014

Comparer les ACL de deux arborescences

Voici une cmdlet bien utile qui permet de comparer les ACL de deux arborescences de répertoires. C’est particulièrement utile pour s’assurer qu’une opération avec un outil de copie, comme EMCopy ou Robocopy, ait bien placé les ACL sur les répertoires cible.

Pour l’utiliser:

Compare-ACL -source <répertoire source> -target <répertoire cible>

Partager ce contenu

Conversion vers Hex

Il est parfois nécessaire de transformer une valeur décimale (base 10) en hexadécimale (base 16) pour les besoins d’un outil.

Par exemple l’outil EMCACL est utilisé pour placer le SID d’un compte Isilon sur un share SMB. Or cet outil requiert le SID en hexa.

Voici un bout de code qui permet de transformer une chaîne de caractères contenant un nombre décimal en hexa.

On crée une variable avec un nombre quelconque qu’on appelle $a.

On utilise la méthode ToString de la classe Convert qui prend 2 paramètres, une variable de différents types et un format désiré. Pour l’exemple j’ai utilisé un string. Le 16 c’est pour hexa.

On prend le résultat qu’on met en majuscules, car par défaut il sera en minuscules.

Et on l’affiche.

Voici le code.

Quotas d’un répertoire

C’est quoi un quota. C’est une limite. On définit souvent ces limites dans des shares pour gérer ce que les utilisateurs peuvent générer comme place disque à l’usage.

Il existe deux grandes familles de quotas dans le monde Windows.
Les Volume quotas, et les Folder quotas.

Les Folder quotas sont aux Volume quotas, ce que le Barça est à l’Amicale de Puteaux. Aucune offense, mais Messi c’est Messi, et le FSRM est l’outil indispensable quand on veut gérer des shares dans une entreprise.

Les volumes quota c’est ce qu’on a quand on veut juste créer des quotas sur des disques et c’est tout.

Les folder quotas sont des quotas par répertoire. C’est le moyen de vendre de la place disque et de la manager à travers des shares. Les entreprises ont des milliers de ces shares là.

Cette cmdlet requiert l’installation du rôle FSRM. Sans ça, nous ne pourrons pas créer d’objets de type :

Cette cmdlet prend en input et à travers de pipelines des paths, et pour ces paths elle nous rendra les Folder Quotas en cours.

Quelques exemples d’utilisation:

Voici le script complet:

Regex à la rescousse de Get-ChildItem

Imaginons le problème suivant.

Nous voulons que Get-ChildItem nous retourne les éléments de deuxième niveau, d’une arborescence de répertoires.

Par exemple je peux avoir un répertoire racine C:\TEMP, dans lequel il y a C:\TEMP\LEVEL1 et dans lequel il y a un autre répertoire C:\TEMP\LEVEL1\LEVEL2.

Et bien je voudrais trouver le moyen avec Get-ChildItem de ne récupérer que les répertoires de deuxième niveau en dessous d’un répertoire racine donné.

Lorsque je tombe sur ce type de problématique j’appelle les expressions régulières (REGEX) à la rescousse.

Les Regex sont un langage dans le langage, et surtout un moyen très puissant pour analyser une chaine de caractères.

Créons notre regex:

La chaine de caractères que nous voulons matcher avec notre regex est la suivante: ‘ C:\TEMP\LEVEL1\LEVEL2’.

Il faut la décomposer (mentalement) pour trouver des délimiteurs. Le délimiteur naturel d’une arborescence est le caractère ‘\’ (backslash). Donc nous avons:

x\x\x\x où x est une chaine de caractères arbitraire. Mais attention pas simplement du alphanumérique, car on peut trouver le caractère ‘:’ par exemple. Et le nom d’un répertoire peut contenir des espaces. On peut traduire x avec ‘.*’ qui veut dire, ‘.’ n’importe quel caractère, et ‘*’ répété n fois.

On commence un regex par ^ ce qui signifie début de chaine de caractères. ^ peut aussi vouloir dire not si utilisé au milieu d’une chaine, mais dans notre cas on ne s’en servira pas ainsi.

Du coup pour matcher C:\TEMP nous pouvons écrire ‘^.*\\.*$’

Le ‘$’ veut dire fin de phrase.

Le double backslash sert à dire que nous voulons vraiment un backslash dans la chaine. Le backslash étant un moyen d’indiquer des caractères spécifiques, \s est un string, \d est un chiffre, \t est un Tab, \n est nouvelle ligne, \0 est le null character utilisé en C pour finir une chaine de caractères. Du coup si nous voulons un \ nous devons en mentionner deux.

Voici le regex complet:

La structure du code est la suivante:

Nous faisons un appel à Get-ChildItem en indiquant un répertoire racine, et en indiquant -recurse pour récupérer les répertoires enfants. Ensuite on ‘pipe’ le résultat vers la cmdlet Where-Object où on analysera le nom de chaque élément avec notre regex.

Finalement on ‘pipe’ le résultat vers ForEach-Object où l’on pourra traiter chaque élément de façon individuelle avec la référence $_.

Voici le code complet:

Taille d’un répertoire

Dans cet article j’ai voulu revenir sur la création de cmdlets et plus particulièrement le paramètre switch. 

Voyons cette déclaration de fonction:

Cette fonction appelée Get-FolderSize a pour but de parcourir une arborescence de répertoires et retourner la taille totale.

Elle définit un paramètre qui peut être passé par le pipeline et qui est un string appelé $Name, c’est le nom du folder (répertoire) à traiter.

Elle définit aussi un paramètre appelé $Folder, qui est un objet de type System.IO.FileSystemInfo. Ca tombe bien, c’est ce que retourne un appel à la cmdlet Get-Item. Et qui peut être passé sans transition à notre cmdlet via un pipe.

Du coup notre cmdlet peut recevoir une simple chaine de caractères ou un objet complexe et saura se débrouiller.

Avec les tailles, surtout les grandes tailles, il n’est pas facile d’un coup d’œil  de savoir combien de zéros il y a après le premier chiffre, parlons nous de milliers, de millions, de milliards de milliards comme disait Carl Sagan?

En informatique nous pouvons réduire la voilure sur les chiffres de façon radicale en transformant l’unité en Giga-octets, Tera-octets etc. C’est le but des switchs à la fin de la déclaration de la fonction. MB pour mega-octets, GB pour giga-octets et TB pour tera-octets.

Un paramètre de type switch, est un argument sans valeur, donc ne pas confondre avec un booléen car ça n’en est pas un.

Regardons ce switch de plus près.

Il s’agit d’un type SwitchParameter et si on regarde sa valeur:

On voit seulement s’il est présent.

Pour le tester on utilisera un if tout simplement.

Si le switch est présent, nous allons diviser le nombre de bytes par 1MB, 1GB ou 1TB en fonction du switch. Powershell saura quoi faire et nous rendra la valeur en mega, giga ou tera.

Quelques exemples d’exécution du script.

Voici une exécution sans switch, la fonction retourne des bytes.

Exécution avec Giga-octets en retour.

Mega-octets.

Et voici le script en entier.

Se rappeler d’exécuter le script avant d’appeler la cmdlet, sinon elle ne sera pas définie.

Partager ce contenu