Question acces denied sur get-childitem

Plus d'informations
il y a 12 ans 9 mois #14934 par Matthew BETTON
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]

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 :D (le réseau marche bien, le système et le stockage aussi, et avec notre compte Admin, \"je suis ici chez moi et je fais ce que je veux\" => Une \"fête du slip\" en quelque sorte, si vous me permettez l'expression).

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.

Plus d'informations
il y a 12 ans 9 mois #14936 par Charly
Réponse de Charly sur le sujet Re:acces denied sur get-childitem
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 :cheer:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 9 mois #14937 par Matthew BETTON
Oleg écrit:

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


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 \&quot;tout ce qui contient 'try'\&quot; est listé ;)<br><br>Message édité par: Matthew BETTON, à: 25/05/13 20:23

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 9 mois #14938 par Matthew BETTON
Matthew BETTON écrit:

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&gt;Get-ChildItem c:\ -recurse -ErrorAction SilentlyContinue -ErrorVariable gci_errors | Out-Null

PS&gt;$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.

Plus d'informations
il y a 12 ans 9 mois #14939 par Charly
Réponse de Charly sur le sujet Re:acces denied sur get-childitem
En effet je suis en Powershell V2 et de mon coté c'est la même aide, encore une petite différence notable.:P

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.

Plus d'informations
il y a 12 ans 9 mois #14940 par Matthew BETTON
Oleg écrit:

En effet je suis en Powershell V2 et de mon coté c'est la même aide, encore une petite différence notable.:P


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.

Temps de génération de la page : 0.054 secondes
Propulsé par Kunena