web-dev-qa-db-fra.com

J'ai besoin d'aide pour comprendre la sécurité de PowerShell et les problèmes d'accès aux fichiers

Je travaille avec PowerShell, en exécutant un script (à partir de ma console) qui inclut cette ligne: 

$inpath = "C:\users\xxxxx\path\foo\bar"

et je continue à avoir cette erreur:

Get-Content : Access to the path 'C:\users\xxxxx\path\foo\bar' is denied.
At C:\users\xxxxx\path\foo\testscript.ps1:53 char:12
+ Get-Content <<<<  $txtfile | Get-WordCount -Exclude (Get-Content c:\temp\exclude.txt) | select -First 15
    + CategoryInfo          : PermissionDenied: (C:\users\xxxxx\path\foo\bar:String) [Get-Content], UnauthorizedAcc
   essException
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

Les scripts et les fichiers cible sont tous situés sur mon lecteur local. Je peux accéder aux fichiers dans l'explorateur, les visualiser/les éditer/les enregistrer à l'aide du bloc-notes et aucune restriction d'autorisations n'est définie. Lorsque je suis en ligne de commande, je peux exécuter la cmdlet get-content avec succès sur les fichiers de mon chemin. Je peux changer de répertoire PS C:> cd C:\users\xxxxx\path\foo\bar et lister avec succès ce qui est là. Encore plus intéressant, je peux dupliquer la ligne erronée dans le script et NE PAS recevoir d'erreur sur la ligne de commande.

PS C:\users\xxxxx\path\foo> $inpath = "C:\users\xxxxx\path\foo\bar"
PS C:\users\xxxxx\path\foo>

Cela me laisse penser que l'erreur «Permission Denied» (autorisation refusée) est en réalité quelque chose d'autre ou de suffisamment vague pour que je ne sache pas comment procéder pour le dépannage. Est-il possible que PS dispose d'autorisations différentes de celles de l'utilisateur sous lequel il s'exécute? Quelqu'un a-t-il déjà vu ce comportement et comment avez-vous résolu le problème? Je suis sûr qu'il existe une solution simple que je ne connais pas. 

17
dwwilson66
Get-Content: L'accès au chemin 'C:\utilisateurs\xxxxx\chemin\foo\bar' est refusé .
 Dans C:\utilisateurs\xxxxx\chemin\foo\testscript.ps1: 53 car

Ce chemin ne ressemble pas à un fichier mais à un dossier.

Êtes-vous sûr que vous ajoutez le nom du fichier au dossier et le transmettez à Get-Content?

Windows donne à Access Denied l'accès lorsque vous essayez d'ouvrir un répertoire comme s'il s'agissait d'un fichier sans transmettre d'indicateurs supplémentaires; et .NET ne transmet pas ces indicateurs (il existe quelques circonstances spécifiques pour ouvrir un dossier, mais elles ne s'appliquent pas ici).

27
Richard

Get-Content lit le contenu du fichier et non du dossier. S'il-vous-plait ajoutez . après votre chemin de dossier comme ci-dessous.

Get-Content "D:\Logs\*.*" | ?{($_|Select-String "test")}

Si vous voulez parcourir tous les dossiers en dessous, ajoutez -recurse comme ci-dessous:

Get-Content "D:\Logs\*.*" -Recurse | ?{($_|Select-String "test")}
4
Avijit Chatterjee

Au lieu de cela: (selon votre commentaire)

foreach ($doc in $inpath) { do-function }

essaye ça:

foreach ($doc in (gci $inpath)) { do-function }

Vous faites un foreach sur un objet chaîne au lieu de vos éléments de dossier.

0
mousio