Auteur de questions
import csv - depuis tableau excel

Question
-
Bonjour
je débute en script powershell .
Dans le cadre d'une automatisation de la gestion des dossiers et droit associés à partir d'un tableau .
je met une image du tableau afin de vous expliquer ce que je cherche a faire.
en résumé a gauche j'ai les colonne nom , prénom, login, pour identifier les users puis commence la gestion des dossiers .
par la suite les lettre E=écriture x=pas d'accès L= lecture seront liées à des groupes de sécurités nommés comme le dossier de niveau2 de la colonne (administration, appel a projet,finance ,juridique)
le but est de créer les dossiers et groupe de sécurité avec le script. Dans l'exemple direction est un dossier et administration un dossier enfant (direction\administration)
Mon problème c'est de géré l’arborescence, je doit pouvoir gérer les colonne comme variable sur 2 ligne et ensuite j'ai les données de droit.
la sorti de mon CSV donne ceci :
;;;;Direction;;;
Nom;Prenom;Login;id;Administration;Appel à projet;Finance;Juridique
dupont;jack;;;E;E;X;E
dupond;fred;;;X;X;X;X
tartenpion;fabrice;;;X;E;X;X
je ne sais pas comment traiter la partie dossier ou du moins comment assigner les variables dans ce cas précis .
je peux donner plus de précision si vous le souhaitez.
en espérant ne pas être trop bouillon dans les explication .
merci d'avance pour votre aide :)
Toutes les réponses
-
Tout d'abord, il ne faut pas vouloir réinventer la roue...
Un CSV, c'est:- Une ligne de type (optionnelle)
- Une ligne de nom de propriétés, séparée par un séparateur choisis (par défaut la virgule ou le point virgule)
- Une ou plusieurs ligne de valeurs, utilisant le même séparateur, quel qu'il soit.
Alors, au lieu de partir vers la méthode "Pourquoi faire simple quand on peut faire compliqué", il te faut simplifier ta feuille Excel, qui doit respecter le format CSV. (ou tu créés un nouveau format, tu es libre de le faire)
Je passe volontairement le fait que tu pourrais utiliser un array imbriqué dans ton CSV, comme simple valeur.
Donc, dans ton cas, ton Excel devrait ressembler à ceci:
N’oublie ces petites choses quand tu importes ton CSV:
- Utilise le paramètre -Encoding UTF8, à cause des accents
- Utilise le paramètre -Delimiter ";" car PowerShell utilise la virgule par défaut.
- Évites les accents dans les noms de propriétés (même si ils sont bien gérés)
Cela fait, après l'import du CSV, tu le traites dans une boucle qui fera ce que tu veux.
B.
- Proposé comme réponse Sylvain COUDEVILLE mercredi 14 août 2019 12:30
-
Bonjour
Merci pour votre réponse. je suis effectivement en train de gérer une version simplifier avant de trouver mieux. Pour l'instant je ne gère qu'un seul niveau au lieu de 2 comme souhaitez. Effectivement dans ce cas proposé gérer les variables est simple. je posais la question au cas ou quelque chose existait afin de gérer la problématique .
vous semblez parler d'un "un array imbriqué dans ton CSV" de quoi s'agit 'il ?
bonne journée
Salutations
Jérôme
-
@Jérome5600
Sérialise tes besoins/questions. Ils sont :
> Création des répertoires (l'arborescence) : de quoi ai-je besoin pour créer un répertoire
> Création des groupes pour les permissions NTFS et peuplement : de quoi ai-je besoin pour créer des gorupes AD ?
> Pose des groupes en permissions sur les répertoires : de quoi ai-je besoin pour poser des permissions.
Avant de commencer, une remarque : Dans ta copie d'écran je vois ... Jack, Fred, Fabrice.
Gardes toujours en mémoire :
- On ne doit pas accorder des permissions à des users, mais à des groupes.
- N'accorder, autant que possible, que les permissions Standards (Lire/executer, Modifier) et réserver le Controle Total aux groupes d'administration.
Si tu prends cela en compte, tu vas pouvoir revoir et couper ton fichier excel en 2
- Groupes de sécurité AD et membres
- Nom de répertoires à créer et arborescence
$Groups= Import-Csv -Path \\Pathto\SecGroup.csv -Delimiter ";" -Encoding UTF8 $Path = "ou=groupes,[...] dc=contoso,dc=com" foreach ($group in $Groups) { Write-Verbose "creating $($group.name) in ActiveDirectory" New-ADGroup -Name $group.Name -Description $group.Description -GroupScope DomainLocal -GroupCategory Security -Path $Path Write-Verbose "Adding member $($group.Members) to $($group.name)" Add-ADGroupMember -Identity $group.Name -Members $group.Members }
Ton fichier Group.csv doit donc comprendre les en-têtes suivants : Name, Description (c'est pas obligatoire, mais c'est quand même mieux quand les groupes sont commentés), Members (tous les SAMs dans la même cellule)
ex. :
Name Description Members Direction-Administration-R Groupe d'accès au partage \\server\partage\Direction\Administration en lecture/Exécution Jdupont,Ftartenpion Direction-Administration-RW Groupe d'accès au partage \\server\partage\Direction\Administration en Modification Fdupont Les groupes d'accès aux ressources doivent être de des groupes locaux de domaine(Best-practices). Ces groupes peuvent être peuplés soit avec des comptes utlisateurs, soit avec des groupes globaux de domaine (entre autres).
Imagines alors : tu crées un groupe global Direction et un autre groupe ChefsDeProjets que tu peuples avec des users. Appelles-les Groupes Organisationnel si ça t'aide, car cela correspond à l'organisation de l'entreprise. Ensuite sur le Répertoire Direction\Administration tu poses les groupes d'accès aux ressources (R et RW) comme ci-dessus. Ne reste plus qu'à peupler les groupes d'accès aux ressources (locaux) par les groupes globaux (organisationnels).
Ca semble plus difficile à implémenter ? Non pas plus ! Et surtout ça présente les avantages suivants :
- chaque utilisateur sera membre de moins de groupes, dont token kerberos moins gros (MaxTokenSize pour ceux auxquels ça rappelle quelque chose)
- Ca facilite l'administration. Un nouveau "directeur" ? Je l'ajoute dans le groupe Direction et je sais qu'il aura accès à toutes les ressources auquelles accèdent le groupe Direction sans me poser 20 000 questions (toujours garder en tête : K.I.S.S. : Keep it Simple and Secure)
A ce stade tes groupes seront créés et peuplés. Tu pourras facilement le vérifier ainsi :
Get-ADGroupMember -Identity MonGroupe | Select-Object -Property Name, SamAccountNam
Pour la création des arborecences, même principe : Une boucle foreach, et New-Item et Add-NTFSAccess
Import-Module NTFSSecurity foreach ($folder in $folders) { Write-verbose "creating $($folder.fullName)" New-Item -Path $folder.FullName -ItemType Directory -force Write-Verbose "Adding NTFS permissions on $($folder.fullName)" Add-NTFSAccess -Path $folder.fullName -Account $folder.group -AccessRights $folder.AccessRights -AccessType Allow -AppliesTo ThisFolderSubfoldersAndFiles }
Comme tu le vois dans ton fichier d'entrée, il ne doit y avoir que FullName, group et AccessRights
FullName Group AccessRights \\server\partage\Direction\Administration Direction-Administration-R ReadAndExecute \\server\partage\Direction\Administration Direction-Administration-RW Modify Nota : Pour poser les permissions NTFS je te conseille le module NTFSSecurity qui est bien plus friendly user que la cmdlet de base Set-Acl.
Utilise Get-Ntfsaccess pour vérifier et exporter dans un .csv le résultat
Get-NTFSAccess -Path C:\Temp Path: C:\Temp (Inheritance enabled) Account Access Rights Applies to Type IsInherited InheritedFro m ------- ------------- ---------- ---- ----------- ------------ ASUS10\Olivier FullControl ThisFolderSubfoldersAn... Allow False BUILTIN\Administrateurs FullControl ThisFolderSubfoldersAn... Allow True C: AUTORITE NT\Système FullControl ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs ReadAndExe... ThisFolderSubfoldersAn... Allow True C: AUTORITE NT\Utilisateurs authent... Modify, Sy... ThisFolderOnly Allow True C: AUTORITE NT\Utilisateurs authent... Delete, Ge... SubfoldersAndFilesOnly Allow True C:
Oliv
----------------
Mark if helpful
- Modifié Oliv - TheFrog lundi 26 août 2019 15:46