none
Partage SMB, droits NTFS et DFS sont dans un bateau... RRS feed

  • 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 :

    1. un espace de nom \\aze.test-corp.fr\partages\
    2. 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

    lundi 17 février 2020 18:08

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
    mardi 18 février 2020 08:49
  • 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
    • Modifié M dakhama mardi 18 février 2020 10:33
    • Marqué comme réponse RomainP_ mardi 18 février 2020 14:28
    mardi 18 février 2020 10:32

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 :

    https://docs.microsoft.com/fr-fr/windows-server/storage/dfs-namespaces/enable-access-based-enumeration-on-a-namespace

    lundi 17 février 2020 21:45
  • Bonjour,

    le serveur de fichiers est un ws2019 (vm sous vmware).

    Merci, je vais regarder ABE !

    mardi 18 février 2020 08:01
  • 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
    mardi 18 février 2020 08:49
  • 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
    • Modifié M dakhama mardi 18 février 2020 10:33
    • Marqué comme réponse RomainP_ mardi 18 février 2020 14:28
    mardi 18 février 2020 10:32
  • 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

    mardi 18 février 2020 10:55
  • 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,

    mardi 18 février 2020 12:35
  • 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.


     
    mardi 18 février 2020 14:27
  • Je confirme pour un débutant en powershell...ce n'est pas du tout évident.
    mardi 18 février 2020 14:38
  • 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 ? 

    1. 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.


    1. 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

    cordialement

    Olivier

    mercredi 19 février 2020 08:09
  • 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

    samedi 10 octobre 2020 20:20