Question
acces denied sur get-childitem
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
Plus d'info avec Get-Help try
Il est préférable d'utiliser :
[code:1]
Get-Help about_Try_Catch_Finally
[/code:1]
Je préfère également utiliser l'objet plutôt qu'écrire du 'simple texte' dans un fichier.
Je trouve que le format csv se prête bien au besoin d'exporter des informations pour, à posteriori, une utilisation du résultat.
Un exemple d'utilisation avec un export csv (One Liner sous PowerShell V3 : utilsation du pipeline) :
[code:1]
Get-ChildItem \"G:\\" -Recurse -Directory |
ForEach-Object{
$Path = $_.FullName ; $ACL = Get-Acl $Path ;
Foreach($Ace in $Acl.Access){
New-Object PSObject -Property ([ordered]@{FullName=$Path ; IdentityReference = $Ace.Identityreference ; FileSystemRights = $Ace.FileSystemRights})
}
} |
Export-Csv .\Export_Acl.csv -Delimiter \";\" -NoTypeInformation -Encoding UTF8
[/code:1]
Sous PowerShell V3, on peut filtrer sur les répertoires via le paramètre '-directory' (Notons que la completion sur ce paramètre, et d'autres, ne fonctionne pas, en tout cas sur mon Windows 8 /
PoSh V3).
Sous PowerShell V2, ce paramètre (et d'autres, comme '-Attributes') n'est pas disponible. Mais nous pouvons utiliser la Cmdlet 'Where-Object' :
[code:1]
Get-ChildItem \"D:\Documents\" -Recurse |
Where-Object { $_.psIsContainer } |
ForEach-Object{
$Path = $_.FullName ; $ACL = Get-Acl $Path ;
Foreach($Ace in $Acl.Access){
New-Object PSObject -Property @{FullName=$Path ; IdentityReference = $Ace.Identityreference ; FileSystemRights = $Ace.FileSystemRights}
}
} |
Select-Object FullName, IdentityReference, FilesystemRights |
Export-Csv .\Export_Acl.csv -Delimiter \";\" -NoTypeInformation -Encoding UTF8
[/code:1]
Notons sous Powershell V3 l'utilisation de [ordered] sur le hashtable, afin de conserver l'ordre des propriétés :
[code:1]
New-Object PSObject -Property ([ordered]@{FullName=$Path ; IdentityReference = $Ace.Identityreference ; FileSystemRights = $Ace.FileSystemRights})
[/code:1]
Sous PowerShell V2, cette action passe par la Cmdlet 'Select-Object', qui renvoie ensuite les objets à 'Export-Csv'.
Dans le code fournie au départ par 'fabgr' : l'utilisation de l'indentation du code permettrait de faciliter sa lecture ...
D'ailleurs, au sujet des 'one liner' que je poste ici, j'utilise l'indentation pour une meilleure lecture.
Le 'pipe' permet de passer à la ligne, tout comme le permet le 'back tick'.
Aussi, mon code ne prends pas en charge les éventuels problèmes de lecture, de droits d'accès, etc...
Pour les problèmes de droits d'accès, l'idée est d'exécuter le code avec un compte qui dispose des droits suffisants pour effectuer ces opérations de lecture.
A partir de Vista, une élévation (\"exécuter en tant que\") de powershell peut suffir (j'ai bien dit peut, mais tout dépend du contexte et n'ayant ici pas plus de détails, cela reste une
possibilité).
En production, les Admin estiment toujours que cela suffit : on admet que, logiquement, tout va bien se passer
Dans le cas d'erreurs sur le Get-ChildItem, l'idée du try / catch ne me paraît pas convaincante.
On peut effectivement traiter chaque type d'erreur qu'il est possible de rencontrer avec 'Get-ChildItem'.
Dans le cas présent, c'est l'exception 'UnauthorizedAccessException' qui nous intéresse.
Un exemple :
[code:1]
try{
Get-ChildItem C:\ -Recurse -Directory -ErrorAction Error | Out-Null
}
catch [System.UnauthorizedAccessException]{
$Message = \"Pas les permissions suffisantes pour lire le répertoire : $($_.Exception.Message)\"
Write-Ouput $Message | Out-File .\MonFichier.log -Append
Write-Host $Message -Foreground Red
}
catch{
Write-Host \"Une autre erreur : $($_.Exception.Message)\" -foreground Red
}
[/code:1]
Le résultat, sous Windows 8 et sans élévation :
[code:1]
Pas les permissions suffisantes pour lire le répertoire : L'accès au chemin d'accès 'C:\PerfLogs' est refusé.
[/code:1]
Le résultat avec élévation :
[code:1]
Pas les permissions suffisantes pour lire le répertoire : L'accès au chemin d'accès 'C:\Windows\CSC' est refusé.
[/code:1]
Le répertoire CSC n'est pas accessible, même avec élévation
Si le '-ErrorAction' n'est pas spécifié, la cmdlet 'Get-childItem' ne lève pas d'exception, et on ne passe donc jamais dans le 'catch'. Par défaut 'Get-ChildItem' n'émet pas d'erreur blocante.
Comme on utilise '-ErrorAction Error', dès qu'une exception a lieu, on passe dans le catch approprié, mais l'énumération des répertoires n'a plus lieu : on s'arrête au répertoire sur lequel on a eu l'erreur. L'erreur est dites 'blocante'.
L'idée serait peut être de faire une première passe afin de lister les répertoires pour lesquels tu as ce fameux problème d'accès
Cela reste une solution, mais il en existe peut être d'autres ...
@ +
Matthew
Connexion ou Créer un compte pour participer à la conversation.
- Charly
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
Bonjour,
Plus d'info avec Get-Help try
Il est préférable d'utiliser :
[code:1]
Get-Help about_Try_Catch_Finally
[/code:1]
Les deux commandes sont sensiblement identiques
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
Matthew BETTON écrit:
Bonjour,
Plus d'info avec Get-Help try
Il est préférable d'utiliser :
[code:1]
Get-Help about_Try_Catch_Finally
[/code:1]
Les deux commandes sont sensiblement identiques
Sous PowerShell V3, voici le résultat de 'Get-Help Try' :
[code:1]
PS>get-help try
Name Category Module Synopsis
----
New-CombinedGeometry Function PowerShellPack ...
New-EllipseGeometry Function PowerShellPack ...
New-GeometryCollection Function PowerShellPack ...
New-GeometryConverter Function PowerShellPack ...
New-GeometryDrawing Function PowerShellPack ...
New-GeometryGroup Function PowerShellPack ...
New-GeometryModel3D Function PowerShellPack ...
New-GeometryValueSerializer Function PowerShellPack ...
New-JournalEntryListConverter Function PowerShellPack ...
New-JournalEntryUnifiedViewCon... Function PowerShellPack ...
New-LineGeometry Function PowerShellPack ...
New-MeshGeometry3D Function PowerShellPack ...
New-NamespaceMapEntry Function PowerShellPack ...
New-PathGeometry Function PowerShellPack ...
New-RectangleGeometry Function PowerShellPack ...
New-StreamGeometry Function PowerShellPack ...
New-CombinedGeometry Cmdlet ShowUI New-Co...
New-EllipseGeometry Cmdlet ShowUI New-El...
New-GeometryDrawing Cmdlet ShowUI New-Ge...
New-GeometryGroup Cmdlet ShowUI New-Ge...
New-GeometryModel3D Cmdlet ShowUI New-Ge...
New-LineGeometry Cmdlet ShowUI New-Li...
New-MeshGeometry3D Cmdlet ShowUI New-Me...
New-PathGeometry Cmdlet ShowUI New-Pa...
New-RectangleGeometry Cmdlet ShowUI New-Re...
New-StreamGeometry Cmdlet ShowUI New-St...
Set-BCDataCacheEntryMaxAge Function BranchCache ...
Disable-DAManualEntryPointSele... Function DirectAccessClientComp... ...
Enable-DAManualEntryPointSelec... Function DirectAccessClientComp... ...
Get-DAEntryPointTableItem Function DirectAccessClientComp... ...
New-DAEntryPointTableItem Function DirectAccessClientComp... ...
Remove-DAEntryPointTableItem Function DirectAccessClientComp... ...
Rename-DAEntryPointTableItem Function DirectAccessClientComp... ...
Reset-DAEntryPointTableItem Function DirectAccessClientComp... ...
Set-DAEntryPointTableItem Function DirectAccessClientComp... ...
Get-VMReplicationAuthorization... Cmdlet Hyper-V Get-VM...
New-VMReplicationAuthorization... Cmdlet Hyper-V New-VM...
Remove-VMReplicationAuthorizat... Cmdlet Hyper-V Remove...
Set-VMReplicationAuthorization... Cmdlet Hyper-V Set-VM...
about_Try_Catch_Finally HelpFile Descri...
[/code:1]
Je ne connais actuellement pas le comportement sous PowerShell V2...
Ici, on s’aperçoit bien que \"tout ce qui contient 'try'\" est listé
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
Bonjour,
L'idée serait peut être de faire une première passe afin de lister les répertoires pour lesquels tu as ce fameux problème d'accès
Une approche :
[code:1]
PS>Get-ChildItem c:\ -recurse -ErrorAction SilentlyContinue -ErrorVariable gci_errors | Out-Null
PS>$gci_errors | Foreach-Object{$_.Exception.Message}
L'accès au chemin d'accès 'C:\PerfLogs' est refusé.
L'accès au chemin d'accès 'C:\Users\Public\Documents\Hyper-V' est refusé.
L'accès au chemin d'accès 'C:\Windows\AppCompat\Programs' est refusé.
L'accès au chemin d'accès 'C:\Windows\AUInstallAgent' est refusé.
L'accès au chemin d'accès 'C:\Windows\CSC' est refusé.
L'accès au chemin d'accès 'C:\Windows\LiveKernelReports' est refusé.
L'accès au chemin d'accès 'C:\Windows\Logs\HomeGroup' est refusé.
L'accès au chemin d'accès 'C:\Windows\Logs\SystemRestore' est refusé.
L'accès au chemin d'accès 'C:\Windows\ModemLogs' est refusé.
L'accès au chemin d'accès 'C:\Windows\PLA\Reports' est refusé.
L'accès au chemin d'accès 'C:\Windows\PLA\Rules' est refusé.
L'accès au chemin d'accès 'C:\Windows\PLA\Templates' est refusé.
L'accès au chemin d'accès 'C:\Windows\Prefetch' est refusé.
L'accès au chemin d'accès 'C:\Windows\Resources\Themes\aero\VSCache' est refusé
.
L'accès au chemin d'accès 'C:\Windows\security\audit' est refusé.
L'accès au chemin d'accès 'C:\Windows\security\cap' est refusé.
L'accès au chemin d'accès 'C:\Windows\ServiceProfiles\LocalService' est refusé.
L'accès au chemin d'accès 'C:\Windows\ServiceProfiles\NetworkService' est refus
é.
L'accès au chemin d'accès 'C:\Windows\System32\Com\dmp' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\config' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\ias' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\LogFiles\Fax\Incoming' est refus
é.
L'accès au chemin d'accès 'C:\Windows\System32\LogFiles\Fax\Outgoing' est refus
é.
L'accès au chemin d'accès 'C:\Windows\System32\LogFiles\Firewall' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\LogFiles\HTTPERR' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\LogFiles\WMI' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\MsDtc' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\networklist' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\spool\PRINTERS' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\spool\SERVERS' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\sru' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\Tasks' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\wbem\MOF' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\wdi' est refusé.
L'accès au chemin d'accès 'C:\Windows\System32\wfp' est refusé.
L'accès au chemin d'accès 'C:\Windows\SysWOW64\Com\dmp' est refusé.
L'accès au chemin d'accès 'C:\Windows\SysWOW64\config' est refusé.
L'accès au chemin d'accès 'C:\Windows\SysWOW64\MsDtc' est refusé.
L'accès au chemin d'accès 'C:\Windows\SysWOW64\networklist' est refusé.
L'accès au chemin d'accès 'C:\Windows\SysWOW64\sru' est refusé.
L'accès au chemin d'accès 'C:\Windows\SysWOW64\Tasks' est refusé.
L'accès au chemin d'accès 'C:\Windows\Temp' est refusé.
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Charly
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
Par contre je ne connaissais pas du tout le paramètre -Errorvariable, bien pratique. Mais là encore ça doit être en V3, je ne vois rien de tel sur ma V2.
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
En effet je suis en Powershell V2 et de mon coté c'est la même aide, encore une petite différence notable.
Je ne suis pas certain que si tu as chargé des modules dont des Cmdlets contiennent 'try', ce ne soit pas la même chose sous la V2.
Par contre je ne connaissais pas du tout le paramètre -Errorvariable, bien pratique. Mais là encore ça doit être en V3, je ne vois rien de tel sur ma V2.
As tu essayé ? (sans le paramètre '-directory', puisqu'en V2, il n'existe pas).
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- acces denied sur get-childitem