[PowerShell] Lister rep. dont l'héritage des Permis. NTFS est bloqué

Lister rep. dont l'héritage des Permis. NTFS est bloqué [PowerShell] - Divers - Programmation

Marsh Posté le 21-10-2015 à 07:07:03    

Salut,

 

Au sein d'un script existant, je souhaiterais intégrer un bloc qui permettrait de scanner une architecture de dossiers (sur serveur de fichiers) et récupérer une liste CSV des répertoires dont les permissions NTFS est désactivé.

 

en soit j'arrive à quelque chose de fonctionnel mais je bloque en fait au niveau de la gestion d'erreurs type : chemin trop long, accès refusé à un répertoire etc.
Plus exactement sur la fusion de 2 bouts de scripts qui gèrent bien indépendamment ces erreurs :o).

 

Bref, j'ai donc, là :

 

Un bout de script faisant le boulot en gérant l'erreur liée à un chemin trop long

Code :
  1. $Directory = Read-Host "Saisir le répertoire à scanner"
  2. Write-Host " "
  3. dir $Directory -Directory -recurse -ErrorAction SilentlyContinue -ErrorVariable err | get-acl |
  4. Where {$_.AreAccessRulesProtected} |
  5. Select @{Name="Path";Expression={Convert-Path $_.Path}},AreAccessRulesProtected | Export-Csv -Path c:\test\log\Liste_répertoires_heritage_bloque.csv
  6. foreach ($errorRecord in $err)
  7. {
  8.     if ($errorRecord.Exception -is [System.IO.PathTooLongException])
  9.     {
  10.         Write-Warning "Path too long in directory '$($errorRecord.TargetObject)'."
  11.     }
  12.     else
  13.     {
  14.         Write-Error -ErrorRecord $errorRecord
  15.     }
  16. }
 

Et un bout de script équivalent mais gérant l'erreur accès refusé

Code :
  1. $Directory = Read-Host "Saisir le répertoire à scanner"
  2. Write-Host " "
  3. dir $Directory -Directory -recurse -ErrorAction SilentlyContinue -ErrorVariable denied | get-acl |
  4. Where {$_.AreAccessRulesProtected} |
  5. Select @{Name="Path";Expression={Convert-Path $_.Path}},AreAccessRulesProtected | Export-Csv -Path c:\test\log\Liste_répertoires_heritage_bloque.csv
  6. foreach ($errorRecord in $denied)
  7. {
  8.     if ($errorRecord.Exception -is [System.UnauthorizedAccessException])
  9.     {
  10.         Write-Warning "Denied Access '$($errorRecord.TargetObject)'."
  11.     }
  12.     else
  13.     {
  14.         Write-Error -ErrorRecord $errorRecord
  15.     }
  16. }
  

Je bloque sur le mix des 2 scripts.
Bêtement (trop à priori :D), j'essaie quelque chose de ce type, mais ça ne passe pas (gère une erreur mais pas l'autre).

 
Code :
  1. $Directory = Read-Host "Saisir le répertoire à scanner"
  2. Write-Host " "
  3. dir $Directory -Directory -recurse -ErrorAction SilentlyContinue -ErrorVariable denied err | get-acl |
  4. Where {$_.AreAccessRulesProtected} |
  5. Select @{Name="Path";Expression={Convert-Path $_.Path}},AreAccessRulesProtected | Export-Csv -Path c:\test\log\Liste_répertoires_heritage_bloque.csv
  6. foreach ($errorRecord in $err)
  7. {
  8.     if ($errorRecord.Exception -is [System.IO.PathTooLongException])
  9.     {
  10.         Write-Warning "Path too long in directory '$($errorRecord.TargetObject)'."
  11.     }
  12.     else
  13.     {
  14.         Write-Error -ErrorRecord $errorRecord
  15.     }
  16. }
  17. foreach ($errorRecord in $denied)
  18. {
  19.     if ($errorRecord.Exception -is [System.UnauthorizedAccessException])
  20.     {
  21.         Write-Warning "Denied Access '$($errorRecord.TargetObject)'."
  22.     }
  23.     else
  24.     {
  25.         Write-Error -ErrorRecord $errorRecord
  26.     }
  27. }
 

Je ne suis pas du tout sur de l'utilisation de -ErrorVariable denied err, et de la possibilité d'aligner les variables comme cela.

 

En vous remerciant d'avance pour votre aiguillage  :jap:


Message édité par BaF - FlOp le 21-10-2015 à 07:08:14
Reply

Marsh Posté le 21-10-2015 à 07:07:03   

Reply

Marsh Posté le 21-10-2015 à 22:17:43    

Mouarf, ça toujours mieux après une nuit de repos :o
 
Au lieu de me borner à vouloir utiliser 2 variables, j'ai, tout simplement, traité le type d'erreur d'un un même Foreach, avec du Else / ElseIf...
 

Code :
  1. foreach ($errorRecord in $err)
  2. {
  3.     if ($errorRecord.Exception -is [System.IO.PathTooLongException])
  4.     {
  5.         Write-Warning "Path too long in directory '$($errorRecord.TargetObject)'."
  6.     }
  7.     elseIf ($errorRecord.Exception -is [System.UnauthorizedAccessException])
  8.     {
  9.         Write-Warning "Denied Access '$($errorRecord.TargetObject)'."
  10.     }
  11.     else
  12.     {
  13.         Write-Error -ErrorRecord $errorRecord
  14.     }
  15. }



Message édité par BaF - FlOp le 21-10-2015 à 22:36:18
Reply

Marsh Posté le 22-10-2015 à 00:26:24    

Bon. ça fonctionne certes très bien localement, sur une architecture de dossiers test, relativement simple.

 

Par contre, dès que je teste sur une archi plus complexe (un partage hébergé de plusieurs Go), je me paie une erreur :


get-acl : Attempted to perform an unauthorized operation.
Au caractère C:\Users\******\Desktop\PowerShell\script.ps1:3 : 87
+ ... Variable err | get-acl |
+                    ~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-Acl], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetAclCommand

 

C'est une erreur assez commune d'après mes recherches, pour autant je ne parviens pas à la gérer.

 

EDIT :

 

Je viens de faire un certains nombre de tests, il s'avère que c'est en fait mon traitement de l'erreur "Accès refusé" qui ne fonctionne pas.

 

Le traitement se plante sur les répertoires auquel l'utilisateur qui lance le script n'a pas les permissions ET n'est pas le propriétaire.

 

J'ai du coup vu pas mal de choses sur le net mais il est bien souvent proposé de se rajouter en tant que propriétaire du dossier au préalable.

 

N'étant pas question de modifier cela sur les répertoires partagés, comment gérer cette erreur ?
Pourtant l'erreur qui s'affiche semble bien traitée avec le :

elseIf ($errorRecord.Exception -is [System.UnauthorizedAccessException])


 :??:  :??:

 

[:halp]


Message édité par BaF - FlOp le 22-10-2015 à 06:49:14
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed