Meilleur auteur de réponses
Partage SMB, droits NTFS et DFS sont dans un bateau...

Question
-
Bonjour,
Je viens vers vous afin d'y voir plus clair concernant la mise en place de dossiers/fichiers partagés sur un serveur de fichier membre d'un domaine.
Voici mon architecture :
- un espace de nom \\aze.test-corp.fr\partages\
- Dossiers d'espace de nom
- Applications
- Formations
- Services
- Transfert
- Utilisateurs
Cet espace de nom est mappé sur un lecteur P sur tous les postes de mon domaine avec les droits adéquates et tout fonctionne parfaitement bien sauf la partie Utilisateurs où le fonctionnement actuel ne me plait pas, tout le monde voit les dossiers de tout le monde, chaque personne peut supprimer son dossier perso ce que ne je veux pas.
Concrètement, voici ce que je veux obtenir comme résultat et automatiquement sans repasser sur chaque dossier et mettre les droits pour chaque personne :
- Sur les utilisateurs de l'AD, dans l'onglet Profil, je souhaite ajouter pour tout le monde un Dossier de base => Connecter U: => \\aze.test-corp.fr\partages\Utilisateurs\%username% afin que les dossiers des personnes soient créés automatiquement et que les permissions que je souhaites soient appliquées
Les droits que je souhaite avoir sont :
- Les personnes ne voient que leur dossier personnel uniquement donc \\aze.test-corp.fr\partages\Utilisateurs\login
- Ils ne peuvent pas supprimés leur dossier personnel mais faire ce qu'ils veulent à l'intérieur
J'ai essayé pas mal de choses jusqu'à maintenant sans obtenir le résultat attendu :
- Partage SMB classique du dossier Utilisateurs avec nom de partage utilisateurs$ avec pour Tout le monde le droit de Modifier/lecture uniquement
- Création de l'espace de nom Utilisateurs avec comme chemin d'accès le partage \\mon-serveur\utilisateurs$
- Viens ensuite les droits NTFS sur le dossier Utilisateurs où ce n'est plus clair..
==> CREATEUR PROPRIETAIRE -> Contrôle total sur Les sous-dossiers et les fichiers seulement
==> SYSTEME -> Contrôle total sur Ce dossier, les sous-dossiers et les fichiers
==> Admins du domaine -> Contrôle total sur Ce dossier, les sous-dossiers et les fichiers
==> Utilisateurs du domaine -> Ce dossier seulement :
Parcours du dossier/exécuter le fichier
Liste du dossier/lecture de données
Attributs de lecture
Création de dossier/ajout de données
Et non je m'y perd, rien ne va.
Si quelqu'un peut me venir en aide et m'expliquer plus en détail comment mettre ce que je veux en place, ce serait vraiment génial.
Merci,
Romain
Réponses
-
Bonjour RomainP_
Pour la visibilité "uniquement à ce auquel un utilisateur à accès" : l'ABE est la solution
Pour le mapping du répertoire perso (U:) : tout se passe dans l'Ad, comme tu l'as écrit. Cependant, quand on crée via le GUI AD Users&Computers, le HomeDir est créé automatiquement si manquant, et les permissions sont FullControl (j'ai toujours trouvé cela couil...). La solution pour répondre à ton besoin (Modify only pour le user) serait de passer par un scrip Posh qui créerait le (les) HomeDir, et placerait les permissions NTFS qui vont bien et configuerait le compte utilisateur AD. Pour la gesiton des permissions NTFS, le module NTFSSecurity est bien plus "convivial" à utiliser que les cmdlets legacy Set-Acl. Il est épprouvé depuis de nombreuses années, et u trouveras assez facilement des tutos sur comment en tirer le meilleur usage.
En pratique :
- Définir les permissions NTFS sur le répertoire racine Utilisateurs : là tu ne mets que tes groupes de support avec les permissions qui vont bien selon ce que tu veux accorder à tes groupes de support (Help-Desk, Admin, Audit, ...) et à "Utilisateurs du domaine" (Lire ce dossier seulement)
- Lors de la création d'un HomeDir, il héritera des permissions NTFS de son parent (Utilisateurs), et il n'y aura que le compte utilisateur à ajouter en ACE. Nota : Uitlisateurs du domaine lui ne sera pas hérité, puisque "ce dossier seulement sur la
racine".
Un exemple fictif sur un utilisateur (naturellement tu peux traiter cela en masse avec une boucle foreach)
# définir l'utilisateur $User = Get-ADUser -Identity "toto" # définir le Home Dir $HomePath = "\\aze.test-corp.fr\partages\Utilisateurs\%username%" # Ajouter permissions NTFS Add-NTFSAccess -Path $HomePath -Account $($User.UserPrincipalName) -AccessRights Modify -AccessType Allow -AppliesTo ThisFolderSubfoldersAndFiles # Paramétrer le compte utilisateur Set-ADUser -Identity $User.SamAccountName -HomeDirectory $HomePath -HomeDrive "U:\"
Teste et valide cela sur un compte de test bien entendu avant mise en oeuvre plus élargie.
A noter que le paramètre -AccessRights a un "validateSet" : aucune erreur possible de ce côté, ça te propose toutes les possiblités. Soit tu choisis les permissions standards, ou les permissions spéciales que tu veux (tout comme dans le GUI).
Nota : Get-NTFSAccess te permet de visualiser le ACLs, tout comme dans le mode GUI en mode avancé.
Get-NTFSAccess -Path C:\Temp Path: C:\Temp (Inheritance enabled) Account Access Applies to Type IsInher Inheri Rights ited tedFro m ------- ------- ---------- ---- ------- ------ ASUS10\Olivier Full... ThisFolderSubfoldersAn... Allow False BUILTIN\Administrateurs Full... ThisFolderSubfoldersAn... Allow True C: AUTORITE NT\Système Full... ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs Read... ThisFolderSubfoldersAn... Allow True C: AUTORITE NT\Utilisateurs authent... Modi... ThisFolderOnly Allow True C: AUTORITE NT\Utilisateurs authent... Dele... SubfoldersAndFilesOnly Allow True C:
Un mot final : tu veux réaliser un audit sur les permissions existantes. 4-5 lignes et tu obtiens un résultat exploitable.
Voici un exemple de la démarche
#Définir la racine $Root = "c:\temp" # Obtention de la liste des HomeDir $Tree = Get-ChildItem -Path $Root -Directory # pas de -recurse ici, les HomeDir sont à la racine # Obtention Permissions NTFS sur la racine $NTFS = Get-NTFSAccess -Path $Root # Obtention des permissions sur chaque HomeDir $NTFS += foreach ($dir in $tree) { Get-NTFSAccess -Path $dir.FullName -ExcludeInherited # ici, on va exclure les permissions hérités pour ne conserver que les perm. spécifiques } # Et maintenant export dans le format que tu veux (txt, csv, xls, html, xml, ...) $ExportPath = "C:\temp2\Ntfs.csv" $NTFS | Export-Csv -Path $ExportPath -Encoding UTF8 -NoTypeInformation -Delimiter ";" # si tu as le module ImportExcel (une tuerie ! Pas besoin d'excel sur la machine pour l'utiliser) $ExportPath = "C:\temp2\Ntfs.xls" ## Définir les paramètres pour l'export dans un splat $ExcelParams = @{ InputObject = $NTFS Path = $ExportPath WorksheetName = "NTFS" TitleFillPattern = "MediumGray" AutoSize = $True FreezeTopRow = $True AutoFilter = $True TableStyle = "Medium6" show = $True # va lancer Excel et ouvrir le classeur automatiquement (si excel présent bien entendu) } ## et export en passant le splat en paramètre. Export-Excel @ExcelParams
Cordialement
Olivier
- Marqué comme réponse RomainP_ mardi 18 février 2020 14:27
-
Bonjour
Oliv a tout dit,
pour faire simple, je te conseille de créer un nouveau fichier partagé comme suivant :
selectionne partage SMB-avancé
selectionne ton lecteur puis suivant
donne un nom du partage avec un $ à la fin
dans l'etape suivante modifie les droit comme suivant :
puis suivant et créer, voila ton lecteur sera créer avec les droits demandé, les utilisateurs pourront créer leur propre dossier, mais ne pourront ni le supprimer ni voir les autres dossiers, si cela vous a aider merci de marquer comme résolu, et bon courage
Toutes les réponses
-
Bonsoir,
on aura besoin de quelque élément pour vous aider à regeler votre problème, le partage est monté sur quoi ?? un serveur Windwos ? un NAS .... ???
pour que les utilisateurs ne voient pas les dossiers des autres utilisateurs vous devriez utilisez le ABE (Access-based enumeration)
regardez ce lien :
-
-
Bonjour RomainP_
Pour la visibilité "uniquement à ce auquel un utilisateur à accès" : l'ABE est la solution
Pour le mapping du répertoire perso (U:) : tout se passe dans l'Ad, comme tu l'as écrit. Cependant, quand on crée via le GUI AD Users&Computers, le HomeDir est créé automatiquement si manquant, et les permissions sont FullControl (j'ai toujours trouvé cela couil...). La solution pour répondre à ton besoin (Modify only pour le user) serait de passer par un scrip Posh qui créerait le (les) HomeDir, et placerait les permissions NTFS qui vont bien et configuerait le compte utilisateur AD. Pour la gesiton des permissions NTFS, le module NTFSSecurity est bien plus "convivial" à utiliser que les cmdlets legacy Set-Acl. Il est épprouvé depuis de nombreuses années, et u trouveras assez facilement des tutos sur comment en tirer le meilleur usage.
En pratique :
- Définir les permissions NTFS sur le répertoire racine Utilisateurs : là tu ne mets que tes groupes de support avec les permissions qui vont bien selon ce que tu veux accorder à tes groupes de support (Help-Desk, Admin, Audit, ...) et à "Utilisateurs du domaine" (Lire ce dossier seulement)
- Lors de la création d'un HomeDir, il héritera des permissions NTFS de son parent (Utilisateurs), et il n'y aura que le compte utilisateur à ajouter en ACE. Nota : Uitlisateurs du domaine lui ne sera pas hérité, puisque "ce dossier seulement sur la
racine".
Un exemple fictif sur un utilisateur (naturellement tu peux traiter cela en masse avec une boucle foreach)
# définir l'utilisateur $User = Get-ADUser -Identity "toto" # définir le Home Dir $HomePath = "\\aze.test-corp.fr\partages\Utilisateurs\%username%" # Ajouter permissions NTFS Add-NTFSAccess -Path $HomePath -Account $($User.UserPrincipalName) -AccessRights Modify -AccessType Allow -AppliesTo ThisFolderSubfoldersAndFiles # Paramétrer le compte utilisateur Set-ADUser -Identity $User.SamAccountName -HomeDirectory $HomePath -HomeDrive "U:\"
Teste et valide cela sur un compte de test bien entendu avant mise en oeuvre plus élargie.
A noter que le paramètre -AccessRights a un "validateSet" : aucune erreur possible de ce côté, ça te propose toutes les possiblités. Soit tu choisis les permissions standards, ou les permissions spéciales que tu veux (tout comme dans le GUI).
Nota : Get-NTFSAccess te permet de visualiser le ACLs, tout comme dans le mode GUI en mode avancé.
Get-NTFSAccess -Path C:\Temp Path: C:\Temp (Inheritance enabled) Account Access Applies to Type IsInher Inheri Rights ited tedFro m ------- ------- ---------- ---- ------- ------ ASUS10\Olivier Full... ThisFolderSubfoldersAn... Allow False BUILTIN\Administrateurs Full... ThisFolderSubfoldersAn... Allow True C: AUTORITE NT\Système Full... ThisFolderSubfoldersAn... Allow True C: BUILTIN\Utilisateurs Read... ThisFolderSubfoldersAn... Allow True C: AUTORITE NT\Utilisateurs authent... Modi... ThisFolderOnly Allow True C: AUTORITE NT\Utilisateurs authent... Dele... SubfoldersAndFilesOnly Allow True C:
Un mot final : tu veux réaliser un audit sur les permissions existantes. 4-5 lignes et tu obtiens un résultat exploitable.
Voici un exemple de la démarche
#Définir la racine $Root = "c:\temp" # Obtention de la liste des HomeDir $Tree = Get-ChildItem -Path $Root -Directory # pas de -recurse ici, les HomeDir sont à la racine # Obtention Permissions NTFS sur la racine $NTFS = Get-NTFSAccess -Path $Root # Obtention des permissions sur chaque HomeDir $NTFS += foreach ($dir in $tree) { Get-NTFSAccess -Path $dir.FullName -ExcludeInherited # ici, on va exclure les permissions hérités pour ne conserver que les perm. spécifiques } # Et maintenant export dans le format que tu veux (txt, csv, xls, html, xml, ...) $ExportPath = "C:\temp2\Ntfs.csv" $NTFS | Export-Csv -Path $ExportPath -Encoding UTF8 -NoTypeInformation -Delimiter ";" # si tu as le module ImportExcel (une tuerie ! Pas besoin d'excel sur la machine pour l'utiliser) $ExportPath = "C:\temp2\Ntfs.xls" ## Définir les paramètres pour l'export dans un splat $ExcelParams = @{ InputObject = $NTFS Path = $ExportPath WorksheetName = "NTFS" TitleFillPattern = "MediumGray" AutoSize = $True FreezeTopRow = $True AutoFilter = $True TableStyle = "Medium6" show = $True # va lancer Excel et ouvrir le classeur automatiquement (si excel présent bien entendu) } ## et export en passant le splat en paramètre. Export-Excel @ExcelParams
Cordialement
Olivier
- Marqué comme réponse RomainP_ mardi 18 février 2020 14:27
-
Bonjour
Oliv a tout dit,
pour faire simple, je te conseille de créer un nouveau fichier partagé comme suivant :
selectionne partage SMB-avancé
selectionne ton lecteur puis suivant
donne un nom du partage avec un $ à la fin
dans l'etape suivante modifie les droit comme suivant :
puis suivant et créer, voila ton lecteur sera créer avec les droits demandé, les utilisateurs pourront créer leur propre dossier, mais ne pourront ni le supprimer ni voir les autres dossiers, si cela vous a aider merci de marquer comme résolu, et bon courage -
Excellent M Dakhama,
Une seule chose : Le GUI est bien pratique pour les actions unitaires, mais pas pour des actions de masse (à quelques exceptions près). Posh est l'outil de prédilection pour les opérations de masse et récurentes.
A propos de l'exception je pense à ADUC dans lequel on peut agir sur plusieurs comptes en même temps en les sélectionnant, puis en Propriétés et là, on n'a que certaines propriétés que l'on peut modifier (de mémoire, il n'y a que 2 onglets). ... dont l'onglet Profil :-).
olivier
-
Merci Olivier,
oui ma procédure n'est pas orientée pour une grande quantité ( la tienne est beaucoup plus utile dans ce cas, et avancée) mais je dirai plus pour les personnes maîtrisant la programmation et ayant un niveau avancé,
vu la demande du collègue je pense que ma procédure sera suffisante surtout pour un lecteur d'utilisateur ou pour quelques lecteurs, par contre je conseille aux personnes maîtrisant le sujet d'utiliser ton script.
Cordialement,
-
Bonjour et merci pour les éclaircissements.
Je comprends le principe mais le mettre en oeuvre dans un script Posh c'est autre chose..
( Sinon j'ai mis un petit moment à comprendre ce qu'était un script Posh :D )
J'ai donc activé ABE sur le partage et sur l'espace de nom, revu les permissions NTFS de bases pour le dossier Utilisateurs et en faisant à la main sur 2/3 personnes, tout fonctionne très bien, chaque personne ne voit que son dossier et ne peut pas supprimer son propre dossier mais il peut faire ce qu'il veut à l'intérieur.
Je viens aussi de comprendre la subtilité entre Suppression et Suppression de sous-dossier et fichier dans les autorisations avancées pour les dossiers, personne ne peut donc supprimer son propre dossier personnel. C'est bête mais quand on saisit enfin la chose ça aide !
J'ai essayé de modifier ton script pour créer les dossiers utilisateurs de chaque personne (nous allons repartir sur un nouveau serveur de fichiers) et mettre les permissions adéquates mais j'ai pas mal de lacunes en powershell... donc à creuser.
Merci beaucoup.
-
-
Bonjour RomainP_
C'est bien pour cela que j'ai commenté (largement) le code présenté.Egalement pour la même raison que je préfère, de loin, les cmdlets de NTFSSecurity à la cmdlet legacy, mais qui fonctionne toujours, Set-Acl qui est beacoup plus complexe à utiliser.
Je dis toujours : si tu sais le faire graphiquement, tu sais le faire en posh
Si je dois me permettre de te donner quelques conseils, quand tu veux scripter un travail
- découpe ton travail, ens tâche unitaires
- puis pour chaque tâche, identifies comment faire en powershell. Get-command *motclérechercé* peut t'aider à trouver la cmdlet que tu cherches.
Tu as dis que tu "voulais créer les HomeDir sur un nouveau serveur". Cela sous-entend avec mise en place des permissions qui vont bien. Mais il y a une première question à se poser avant. Comment obtenir la liste des comptes pôur alimenter le traitement de création ?
- Identification des comptes
- Je me l'a joue tâcheron, et je rempli à la mano un simple fichier texte avec mes users. Après, je lirais ce fichier avec un Get-Content -File, et je mettrais le résultat dans une variable pour l'utiliser plus tard.
- Je me la joue feignant, et je vais faire une query AD (avec Get-ADUser) dont je vais mettre le résultat dans une variable. A moi de paufiner ma requête afin de n'avoir que les comptes que je veux (tout ceux qui sont dans une OU spécifique par exemple).
Moi j'en créerais une test de test avec 2 comptes de test dedans pour tester et valider le tout.
- Traitement de création des HomeDir, Mise en place des Acls, paramétrage des comptes avec le nouveau HomeDir. cela doit faire 3 tâches, mais le traitement se fera dans une simple boucle Foreach commune.
# Définir le dossier racine pour les HomeDir
$RootFolder = "\\aze.test-corp.fr\partages\Utilisateurs\"
Foreach ($Usr in $Users)
{
# définir le Home Dir
$HomePath = "$Root\$(User.SamAccountName)"
# Création du HomeDir
New-Item -Path $HomePath -ItemType Directory
# Ajouter permissions NTFS
Add-NTFSAccess -Path $HomePath -Account $($User.SamAccountName) -AccessRights Modify -AccessType Allow -AppliesTo ThisFolderSubfoldersAndFiles
# Paramétrer le compte utilisateur
Set-ADUser -Identity $User.SamAccountName -HomeDirectory $HomePath -HomeDrive "U:\"}
Nota : les variables $HomePath, eet les paramètres de Add-NtFSAccess -Account et Set-ADUser -Identity dépendent de ce qu'il y a en entrée ($Users). Si c'est le résultat d'une query AD, ça sera la propriété SamAccountName que l'on récupèrera. SI c'est un simple fichier texte (sans header donc) ce sera $User tout simplement.
Attention, j'insiste, ceci n'est pas un script, mais des lignes de commande les unes derrière les autres. Pas de traitement d'erreur, de check, ... mais ça, ça s'enrichit après.
Par exemple : Vérifier si $RootFolder existe bien sinon, ça ne va pas le faire. Comment on fait ça ? Je veux vérifier un path ... mmm cherchons Get-Command *path*. Parmi les résultats, on trouve un Test-Path. Voyons cela : Help Test-Path -full. Yep, ça répond à mon besoin.
Test-Path -Path $RootFolder me retourne $true ou $false. Un simple traitement If ... else permet de gérer cela
ex. : a ajouter avant la boucle foreach
if (-not (Test-Path -Path $RootFolder) ) { # RootFolder n'existe pas # Création du root folder # Mise en place des permissions sur ce répertoire. } # pas de else, ici, il existe déjà
etc ...
Ce qu'il faut retenir :
- Découper ton travail, comme si tu le faisais graphiquement
- User et abuser de Get-command, et Get-Help pour déterminer quelle cmdlet à utiliser
- Tester sur un compte. Si ça produit le résultat escompté, passer au traitement de masse (la boucle foreach).
- Sans oublier : en Posh on manipule des objets, avec des propriétés (et des méthodes).
Pour faire simple, dis-toi que chaque résultat d'une cmdlet est comme un tableau Excel. Chaque ligne est une entrée (un objet), et chaque colonne une propriété des objets. Donc quand tu traites une collection d'objets comme $Users, à chaque tour c'est une propriété particulière de l'objet en cours de traitement ($usr) que tu veux (ici le SamAccountName). Donc il faut mettre $Usr.SamAccountName. On doit cependant utiliser la notation $($Usr.propriété) quand on doit la passr en paramètre d'une cmdlet pour qu'elle soit bien interprétée.
Stop là, ... je suis en train de me laisser emporter dans une formation powershell :-)
Tu veux apprendre ? Rien ne vaut quelques tuto ou vidéos sur le Net. Un exemple Learn Powershell in a month of lunches par Don Jones :https://www.youtube.com/playlist?list=PL6D474E721138865A
Olivier
-
Bonsoir, merci pour ta réponse complète, je n'ai pas répondu avant car d'autres projets se sont greffé et celui-ci est en attente...
Je veux apprendre mais trop choses arrivent pour s'y mettre correctement !
Merci Olivier, je mets au chaud cette conversation pour y revenir plus tard.
Romain