IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Permissions NTFS de répertoires [PowerShell]


Sujet :

Scripts/Batch

  1. #41
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    A quoi cela sert ?
    A structurer le code, faciliter les évolutions et intégrer des contrôles sur les données reçues en paramètre.
    Tu peux aussi laisser le code existant qui peut être plus rapide.

    Citation Envoyé par arnaudperfect Voir le message
    Comment l’implémenté ?
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach($accessRule in $accessRules)
            {
                # Convert SID to User/group domain
              $objSID = New-Object System.Security.Principal.SecurityIdentifier($accessRule.IdentityReference)
              $objUser = $objSID.Translate([System.Security.Principal.NTAccount])
              New-AlphaleonisACL $ShortDirectory $accessRule.FileSystemRights $accessRule.IsInherited $accessRule.IdentityReference $objUser
           }
    par défaut elle émet un objet dans le pipeline et à son tour la fonction appelant ( RecursePath) l'émet dans le pipeline.
    Citation Envoyé par arnaudperfect Voir le message
    Euh, la tu m'as largué
    C'est le BA-ba du scripting avancé, ce que commence à être ton traitement. C'est juste un empilement de possibilités de Powershell.

    Je n'ai pas cité le code de création de la fonction pour ne pas te perdre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Function New-PSCustomObjectFunction {
        #crée une fonction génèrant un objet personnalisé simple
        #tous ses paramètres sont obligatoires et ne sont pas typé
        #
        # Par défaut génère du code sans la signature du mot clé Function
        # Le paramètre -FILE génére du code avec la signature du mot clé Function
        # Le paramètre -AsPSVariableProperty génére un objet dont 
        #  les propriétés sont basées sur la classe PSVariableProperty. Requière le module PSObjectHelper
             
      param(
           [Parameter(Mandatory=$true,position=0)]
           [ValidateNotNullOrEmpty()]
          $Noun,
           [Parameter(Mandatory=$true,position=1)]
           [ValidateNotNullOrEmpty()]
          [String[]]$Parameters,
          [switch] $File,
          [switch] $AsPSVariableProperty #todo switch ReadOnly ?
      )
    $ofs=' '
    $Borne=$Parameters.count-1
    $code=@"
    #Requires -version 3
    
    $(if ($AsPSVariableProperty) {"#Requires -Modules PSObjectHelper"})
    $(if ($File) {"Function New-$Noun{"})
    param(
        $(For ($I=0;$I -le $Borne;$I++)
          { $Name=$Parameters[$I]
            @"
    `t [Parameter(Mandatory=`$True,position=$I)]
    `t`$${Name}$(if ($I -Ne $borne) {",`r`n"})
    "@
          } 
         )     
    )
     $( if ($AsPSVariableProperty) 
        {
    @'  
      $O=[pscustomobject]@{
           PSTypeName='montruc'
         }
      $PSBoundParameters.GetEnumerator()|
       Foreach {
         $O.PSObject.Properties.Add( (New-PSVariableProperty $_.Key $_.Value -ReadOnly) ) 
       }
     $O
    '@
       }
       else
       { 
         "`r`n  [pscustomobject]@{`r`n"
         "   PSTypeName='$Noun';"
      $( $Parameters|
         Foreach {
          "`r`n    {0}=`${1};" -F $_,$_
         }
       ) 
      "`r`n   }"
       }#else 
      ) 
    
    $(if ($File) {"`r`n}# New-$Noun"})
    "@
    $Code
    }#New-PSCustomObjectFunction
    
    #Crée une fonction
    New-PSCustomObjectFunction -noun 'AlphaleonisACL' -Parameters Path,FileSystemRights,IsInherited,IdentityReference,User
    Si tu débutes sur Powershell, c'est normal de ne pas comprendre de prime abord le code de la fonction New-AlphaleonisACL, mais ici tu as tout ce qu'il te faut pour y arriver.

    [edit]
    ps:
    Le module PSObjectHelper se trouve ici.

  2. #42
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    C'est trop compliqué pour moi tout ceci... Je ne comprend pas tout ce que tu essais de m'expliquer.
    Je débute sous PowerShell et surtout, je ne suis pas développeur.

    Je vais resté sur mon script tel qui est, même s'il n'est pas parfait ou optimisé.
    J'ai les informations que je souhaite, c'est le principal.

    Il y a juste une chose qui m'embête, c'est de ne pas avoir la racine du répertoire que j'analyse dans mon rapport CSV.
    sur l'ancien script tu m'avais dit d'ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where {$_.psiscontainer -eq $true}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Folders = @(Get-Item $RootPath) + (dir $RootPath -recurse | where {$_.psiscontainer -eq $true})
    Avec Alphaleonis, aucune idée de comment faire...

  3. #43
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    C'est trop compliqué pour moi tout ceci... Je ne comprend pas tout ce que tu essais de m'expliquer.
    Oublie.
    Citation Envoyé par arnaudperfect Voir le message
    Je débute sous PowerShell et surtout, je ne suis pas développeur.
    Oui j'ai bien compris.
    Citation Envoyé par arnaudperfect Voir le message
    Je vais resté sur mon script tel qui est, même s'il n'est pas parfait ou optimisé.
    L'objectif n'est pas la perfection, mais la lisibilité et la maintenance.
    Citation Envoyé par arnaudperfect Voir le message
    Avec Alphaleonis, aucune idée de comment faire...
    Rapido je dirais transformer le code suivant en une fonction avancée utilisant le pipeline:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
      [Alphaleonis.Win32.Filesystem.Directory]::GetDirectories($SourcePath) | 
     Foreach {
            $ShortDirectory = $_
            $LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($ShortDirectory)
    
            $dir = new-object Alphaleonis.Win32.Filesystem.DirectoryInfo($LongDirectory)
            $dirACL = $dir.GetAccessControl("Access")
            $accessRules = $dirACL.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier])
    
            foreach($accessRule in $accessRules)
            {
                # Convert SID to User/group domain
              $objSID = New-Object System.Security.Principal.SecurityIdentifier($accessRule.IdentityReference)
              $objUser = $objSID.Translate([System.Security.Principal.NTAccount])
              New-AlphaleonisACL $ShortDirectory $accessRule.FileSystemRights $accessRule.IsInherited $accessRule.IdentityReference $objUser
           }
    du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        [Alphaleonis.Win32.Filesystem.Directory]::GetDirectories($SourcePath) | 
         Get-AlphaleonisACL

  4. #44
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Une possible solution rapido :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #Add-type -Path C:\Dev\AlphaFS-1.5-BinAndDocs\Debug\AlphaFS.dll
    Function New-AlphaleonisAccessRules{
      param(
         [Parameter(Mandatory=$True,position=0)]
        $FileSystemRights,
         [Parameter(Mandatory=$True,position=1)]
        $IsInherited,
         [Parameter(Mandatory=$True,position=2)]
        $IdentityReference,
         [Parameter(Mandatory=$True,position=3)]
        $User
      )
    
     [pscustomobject]@{
       PSTypeName='AlphaleonisAccessRules';
       FileSystemRights=$FileSystemRights;
       IsInherited=$IsInherited;
       IdentityReference=$IdentityReference;
       User=$User
       }
    }# New-AlphaleonisAccessRules
    
    Function New-AlphaleonisACL{
      param(
         [Parameter(Mandatory=$True,position=0)]
        $Path,
         [Parameter(position=1)]
        $AccessRules=$null
      )
    
     [pscustomobject]@{
       PSTypeName='AlphaleonisACL';
       Path=$Path; 
       AccessRules=$AccessRules
       }
    }# New-AlphaleonisACL
    
    function Get-AlphaleonisACL {
     param (
         [Parameter(Mandatory=$true,ValueFromPipeline=$true,ParameterSetName="Path")]
       [string]$Path
     )
     process {
       #Todo File & Directory
      #$LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($Path)
      
      $dir = new-object Alphaleonis.Win32.Filesystem.DirectoryInfo($Path)
      $dirACL = $dir.GetAccessControl("Access")
     
      $CurrentDirectory=New-AlphaleonisACL $Path 
      $CurrentDirectory.AccessRules=@(
        foreach($accessRule in $dirACL.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]))
        {
              # Convert SID to User/group domain
            $objSID = New-Object System.Security.Principal.SecurityIdentifier($accessRule.IdentityReference)
            $objUser = $objSID.Translate([System.Security.Principal.NTAccount])
            New-AlphaleonisAccessRules $accessRule.FileSystemRights $accessRule.IsInherited $accessRule.IdentityReference $objUser
        }
      )# AccessRules 
      
      Write-Output $CurrentDirectory
     }#process
    } #Get-AlphaleonisACL
    
    Function RecursePath([string]$SourcePath){     
      [Alphaleonis.Win32.Filesystem.Directory]::GetDirectories($SourcePath) | 
        Foreach {
          $LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($_)
           Get-AlphaleonisACL -path $LongDirectory
           RecursePath $LongDirectory
        }#foreach Directory
    }
    
    $Folders = @(
      Get-AlphaleonisACL -Path ([Alphaleonis.Win32.Filesystem.Path]::GetLongPath('C:\temp\001')); 
      RecursePath -SourcePath 'C:\temp\001' 
    )#$Folders
    Attention il n'y a pas de gestion d'erreur et l'accès aux ACLs change, donc la construction d'une ligne XL également.

  5. #45
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Oula, très complexe pour moi ce code !

    J'ai donc réussi à afficher les informations qui sort ce script.

    Après, pour les enregistré dans un CSV ou Excel, je ne sais comment faire.

    J'ai un début d'idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $Folders = @(
      Get-AlphaleonisACL -Path ([Alphaleonis.Win32.Filesystem.Path]::GetLongPath('\\groupe')); 
      RecursePath -SourcePath '\\groupe' 
    )#$Folders
    
    foreach($folder in $folders)
    {
    	$folder.FileSystemRights $folder.IsInherited $folder.IdentityReference $folder.User | Export-csv c:\temp\Groupe1_ACLDatas.csv	 
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($folder in $folders)
    {
    	Write-Output $folder.FileSystemRights $folder.IsInherited $folder.IdentityReference $folder.User
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $Folders = @(
      Get-AlphaleonisACL -Path ([Alphaleonis.Win32.Filesystem.Path]::GetLongPath('\\groupe\groupe\groupe\Ariane')); 
    	RecursePath -SourcePath '\\groupe\groupe\groupe\Ariane'
    )#
     
    $Folders | Export-csv c:\temp\Groupe1_ACLDatas.csv
    mais cela ne fonctionne pas...

    J'ai le System.Object[] vide...

  6. #46
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    J'ai le System.Object[] vide...
    Oui, désormais une propriété de l'objet contient un tableau, on doit le retravailler selon le format attendu.

    Es-tu obligé d'avoir un XLs en fichier final ?
    Quelles colonnes/données souhaites-tu enregistrer ?

  7. #47
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Un CSV serait déjà bien et comme tu le dis, le traitement sera plus rapide.

    Aussi, afin de prendre les devant, est-il possible de tronquer le CSV en plusieurs CSV ? Car j'ai plus de 4 millions de lignes et j'arriverai aux limites de Windows... J'ai déjà eu ce problème.

  8. #48
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    Un CSV serait déjà bien et comme tu le dis, le traitement sera plus rapide.
    ok.

    Citation Envoyé par arnaudperfect Voir le message
    est-il possible de tronquer le CSV en plusieurs CSV ?
    Je n'ai jamais fait, faut étudier ça. Pas sûr que la conception actuelle facilite ce traitement.

    Vu la taille, j'ai justement éviter de dupliquer des données et je pense qu'on peut améliorer encore un point. Surtout que la volumétrie peut en théorie augmenter.
    Le serveur risque d'avoir un pb mémoire si on construit une collection contenant tous les fichiers.
    Il y a la possibilité d'écrire chaque ligne directement dans un fichier csv sans surcharger la mémoire, mais c'est le disque qui se retrouvera surchargé pendant le temps de traitement.
    A toi de me dire si c'est possible ou pas.

    On peut traiter une collection selon le principe suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $Folders[0..100]|Export csv1
    $Folders[100..200]|Export csv2
    ...
    Le découpage se fait lors de l'énumération du tableau.

  9. #49
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Je travail directement à partir d'un serveur où je map les partages des baies NETAPP.

    Je pense qu'il est préférable d'enregistrer au fur et à mesure dans le fichier CSV sur le disque dur. Dans la mémoire, j'ai peur de faire freezer le serveur. Avec un script VBS où j'enregistrais que les chemins de tous les répertoires, j'arrivais avec un CSV de 800 mo

  10. #50
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    Je pense qu'il est préférable d'enregistrer au fur et à mesure dans le fichier CSV sur le disque dur.
    Actuellement le code ne peut gérer qu'un seul fichier CSV, car c'est le bloc End du cmdlet qui ferme le fichier. On peut pas le changer en cours d'itération.
    Un exemple de construction d'une ligne à enregistrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $Folders[0]|
     Foreach {
       $Path=$_.Path
       $_.AccessRules|
        Select-Object @{N='Path';E={$Path}},
                      @{N='FileSystemRights';E={$_.FileSystemRights}}, 
                      @{N='IsInherited';E={$_.IsInherited}},
                      @{N='IdentityReference';E={$_.IdentityReference}},
                      @{N='User';E={$_.User}}
    }
    Citation Envoyé par arnaudperfect Voir le message
    j'arrivais avec un CSV de 800 mo
    A mon avis un base de données serait plus appropriée pour traiter cette volumétrie, mais ceci est une autre histoire

  11. #51
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Un exemple de construction d'une ligne à enregistrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $Folders[0]|
     Foreach {
       $Path=$_.Path
       $_.AccessRules|
        Select-Object @{N='Path';E={$Path}},
                      @{N='FileSystemRights';E={$_.FileSystemRights}}, 
                      @{N='IsInherited';E={$_.IsInherited}},
                      @{N='IdentityReference';E={$_.IdentityReference}},
                      @{N='User';E={$_.User}}
    }
    Mais la on revient au même problème. Comment je fais pour enregistrer chaque éléments dans une variable afin de pouvoir réaliser des traitements dessus et notamment construire mon fichier CSV ?

    Ce qui me gène c'est le "select-Object"

  12. #52
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    Mais la on revient au même problème.
    Pas vraiment, un peu de patience
    Citation Envoyé par arnaudperfect Voir le message
    Comment je fais pour enregistrer chaque éléments dans une variable afin de pouvoir réaliser des traitements dessus
    Ici on adresse le tableau pour accéder à un élément. Et dans le traitement on y accède via une variable et c'est son contenu qui et ensuite insère dans le tableau.
    Citation Envoyé par arnaudperfect Voir le message
    et notamment construire mon fichier CSV ?
    La dernier point à résoudre est effectivement comment le construire.
    Si on utilise une collection comme $folders le pb mémoire demeure. En interne la méthode GetDirectories() construit un tableau puis le renvoi une fois construit, tjrs ce pb mémoire.
    On construit même deux collections . Il faut, (enfin je dois ), porter le code d'une méthode CSharp en Powershell en utilisant une classe itérateur mentionnée précédemment.

    A partir de là et sous réserve, plus de pb mémoire en tout cas beaucoup moins.
    La construction de plusieurs CSV sera possible, mais il se peut qu'il faille utiliser directement des API dotnet au lieu de cmdlet.
    Il faut 'juste' prendre le temps de réfléchir.
    Citation Envoyé par arnaudperfect Voir le message
    Ce qui me gène c'est le "select-Object"
    C'est à dire ?

  13. #53
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Bah avec le "select object", je ne sais comment construire mon CSV...

    Et comme tu le dis, le tableau sera écrit une fois le tableau construit...

    Pas évident notre affaire.

  14. #54
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Je sais que cela ne va pas te plaire, mais j'ai "simplifier" ton code et je vais pouvoir intégré la génération du CSV au fur et à mesure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Add-type -Path C:\Users\ADMROOT_fourquemin\Desktop\AlphaFS-1.5-BinAndDocs\Release\AlphaFS.dll
    
    function Get-AlphaleonisACL($Path) 
    {
    	$LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($Path)
    	$dir = new-object Alphaleonis.Win32.Filesystem.DirectoryInfo($LongDirectory)
    	$dirACL = $dir.GetAccessControl("Access")
    	$accessRules = $dirACL.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier])
    	foreach($accessRule in $accessRules)
    	{
    		# Convert SID to User/group domain
    		$objSID = New-Object System.Security.Principal.SecurityIdentifier($accessRule.IdentityReference)
    		$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
    		Write-Host $LongDirectory $accessRule.FileSystemRights $accessRule.IsInherited $accessRule.IdentityReference $objUser -fore cyan
    	}
    }
    
    Function RecursePath($Path)
    {     
    	[Alphaleonis.Win32.Filesystem.Directory]::GetDirectories($Path) | 
    	Foreach {
    		$LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($_)
    		Get-AlphaleonisACL $LongDirectory
    		RecursePath $LongDirectory
    	}
    }
    
    Get-AlphaleonisACL 'C:\Temp\001'
    RecursePath 'C:\Temp\001'
    Je génèrerais le CSV à l'emplacement du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Write-Host $LongDirectory $accessRule.FileSystemRights $accessRule.IsInherited $accessRule.IdentityReference $objUser -fore cyan
    Ce code, je vais l'utilise que pour faire un audit, donc faut aller au plus simple.

    je te tiens au courant pour la génération du CSV.

    Encore merci de ton aide, j'ai bcp appris.

  15. #55
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Voilà, j'ai un code fonctionelle (enfin presque). Certes pas maintenable, mais bon, tant pis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Add-type -Path C:\Users\ADMROOT_fourquemin\Desktop\AlphaFS-1.5-BinAndDocs\Release\AlphaFS.dll
    
    # Fenêtre de sélection dossier
    function Select-Folder($message) { 
    	$path = 0
    	$object = New-Object -comObject Shell.Application  
    	 
    	$folder = $object.BrowseForFolder(0, $message, 0, $path) 
    	if ($folder -ne $null) { 
    		$folder.self.Path 
    	} 
    }
    
    function Get-AlphaleonisACL($Path) 
    {
    	$LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($Path)
    	$dir = new-object Alphaleonis.Win32.Filesystem.DirectoryInfo($LongDirectory)
    	$dirACL = $dir.GetAccessControl("Access")
    	$accessRules = $dirACL.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier])
    	foreach($accessRule in $accessRules)
    	{		
    		$dentityReference = $accessRule.IdentityReference
    		# Convert SID to User/group domain
    		$objSID = New-Object System.Security.Principal.SecurityIdentifier($accessRule.IdentityReference)
    		$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
    		$FileSystemRights = $accessRule.FileSystemRights 
    		$IsInherited  = $accessRule.IsInherited 
    		
    		$chaine = $LongDirectory+";"+$accessRule.IdentityReference+";"+$objUser+";"+$fileSystemRights+";"+$IsInherited
    		Write-Host $chaine -fore cyan
    
    		ADD-content -path "C:\temp\Audit_groupe1.CSV" -value $chaine
    	}
    }
    
    Function RecursePath($Path)
    {     
    	[Alphaleonis.Win32.Filesystem.Directory]::GetDirectories($Path) | 
    	Foreach {
    		$LongDirectory = [Alphaleonis.Win32.Filesystem.Path]::GetLongPath($_)
    		Get-AlphaleonisACL $LongDirectory
    		RecursePath $LongDirectory
    	}
    }
    
    clear
    #Sélection dossier
    $Patch = Select-Folder "Choisir dossier"
    # Entête CSV
    Remove-Item "C:\temp\Audit_groupe1.CSV"
    ADD-content -path "C:\temp\Audit_groupe1.CSV" -value "Fullname;SID;Identity;Rights;IsInherited"
    # Dossier racine
    Get-AlphaleonisACL $Patch
    # Dossiers enfants
    RecursePath $Patch
    Le problème qu'il me reste, est, comme tu me l'avais dit, la conversion du SID en User/group, pas toujours compatible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # Convert SID to User/group domain
    		$objSID = New-Object System.Security.Principal.SecurityIdentifier($accessRule.IdentityReference)
    		$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
    J'ai eu le cas sur certains répertoires.

    Y a-t-il une méthode plus robuste ? aussi pourquoi cette commande ne fonctionne pas à tous les coup ?

  16. #56
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    Bah avec le "select object", je ne sais comment construire mon CSV...
    Il faut transformer l'objet avant de l'écrire via le cmdlet Export-csv.
    Le select-object crée en interne un nouvel objet avec le nom des propriétés listées ou/avec des propriétés calculées.
    Le principe est de retarder au maximum le moment où on transforme l'objet pour l'afficher ou l'enregistrer dans un format particulier.

    Citation Envoyé par arnaudperfect Voir le message
    Pas évident notre affaire.
    M'est avis, que c'est surtout la tienne ;-)

    Citation Envoyé par arnaudperfect Voir le message
    Je sais que cela ne va pas te plaire,
    Il ne s'agit pas que cela me plaise, tu fais ce que tu veux.
    Si je t'aide c'est que cela peut me reservir plus tard, ainsi qu'à d'autres.
    Citation Envoyé par arnaudperfect Voir le message
    Je génèrerais le CSV à l'emplacement du
    Je suis curieux de voir le résultat et les effets sur le serveur.
    Citation Envoyé par arnaudperfect Voir le message
    Ce code, je vais l'utiliser que pour faire un audit, donc faut aller au plus simple.
    D'accord chef !
    Il faut tout de même faire attention à ce qu'on dit, moi je ne le prends pas mal, mais d'autres le pourrait.
    De ce que je peux comprendre, ici il s'agit de faire vite, la simplicité n'a rien à voir la dedans. Et surtout tes propos laissent supposer que je fais des trucs compliqué.
    Si j'avais pu te proposer qq chose de simple, je pense que je l'aurais déjà fait.
    Moi je ne suis qu'un révélateur des manques et limites de Powershell, comme de ton côté tu nous as révélé tes contraintes et l'environnement au fur et à mesure.
    Que tu ais des contraintes de temps j'en suis conscient et pas qu'un peu, mais moi je n'en ai pas, faut faire avec ou changer de prestataire, pardon de forum d'entraide ;-)

    Citation Envoyé par arnaudperfect Voir le message
    j'ai bcp appris.
    Moi aussi, j'ai appris 2-3 trucs en passant. On apprend beaucoup à aider les autres.

    Citation Envoyé par arnaudperfect Voir le message
    Y a-t-il une méthode plus robuste ?
    Il me semble que je t'ai cité un post, mais de mon côté je ne connais pas tout. Faut étudier la question.
    Citation Envoyé par arnaudperfect Voir le message
    aussi pourquoi cette commande ne fonctionne pas à tous les coup ?
    Je ne suis pas un expert dans ce domaine, je suppose que la source données n'est pas la même, faut lire la doc des APIs...
    Tu constateras je pense la récurrence de 'faut', 'Yaka' est en chemin :-)

    Ceci dit, pour en revenir à ta question: combien as-tu, en théorie, d'objets AD concernés par ton traitement ? Par exemple 3000 users et 500 groupes ?

  17. #57
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    J'ai 3000 groupes.

    De toute façon, ne t'inquiète pas, tu m'as énormément aidé !
    Après, il faut que je lance mon script ce soir, donc je vais aller à essentiel dans ce script.

    Concernant la conversion des SID, j'ai trouver cet article : http://blogs.technet.com/b/deploymen...owershell.aspx

    Je vais l'étudier, je reviendrais te dire ce qu'il en ait.

  18. #58
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Bon, en faite la conversion des SID fonctionne bien, c'est juste que je suis tombé sur des ACL orphelines...

    Il faudrait que je face une vérification, si le SID n'est pas présent dans l'AD, je l'indique dans mon fichier CSV afin d'éviter toute ambiguïté.

  19. #59
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    J'ai 3000 groupes.
    Pour info, il est possible d'utiliser un cache au lieu surcharger l'AD, si ton traitement se fait de nuit il se peut que cela ait moins d'impact.
    Citation Envoyé par arnaudperfect Voir le message
    De toute façon, ne t'inquiète pas
    Loin de là
    Citation Envoyé par arnaudperfect Voir le message
    Je vais l'étudier, je reviendrais te dire ce qu'il en ait.
    Rapido, c'est la mécanique de switch en train l'un et l'autre qui importe.

    En passant j'ai testé si le verrouillage d'un fichier posait pb, ce n'est pas le cas puisqu'on accède pas à son contenu.
    Il me reste à tester le cas où même un compte admin n'a pas de droits sur le répertoire.

  20. #60
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    Bon, en faite la conversion des SID fonctionne bien, c'est juste que je suis tombé sur des ACL orphelines...
    Tests,tests,tests....

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. [Infomaniak] Quelles permissions sur fichiers/répertoires ?
    Par Sayrus dans le forum Hébergement
    Réponses: 0
    Dernier message: 22/10/2009, 15h32
  2. Delphi et Permission NTFS (cacls inside)
    Par Raspoutitsa dans le forum Débuter
    Réponses: 0
    Dernier message: 19/08/2009, 16h37
  3. [WD11] Permissions NTFS
    Par WDKyle dans le forum WinDev
    Réponses: 7
    Dernier message: 06/07/2009, 09h29
  4. Modifier les permissions d'un répertoire
    Par zan001 dans le forum Général Java
    Réponses: 0
    Dernier message: 30/04/2009, 18h57
  5. Permissions NTFS avec XP Home
    Par Loceka dans le forum Sécurité
    Réponses: 2
    Dernier message: 10/09/2006, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo